SetWindowsHookEx返回0,GetLastWin32Error()也返回0
问题描述:
我面临的问题是,我无法获得由SetWindowsHookEx返回的有效的hookID,而且GetLastWin32Error()也返回0。我写了下面的代码:SetWindowsHookEx返回0,GetLastWin32Error()也返回0
_LowLevelhookID = SetWindowsHookEx((int)HookType.WH_KEYBOARD_LL, LowLevelKeyboardHookHandler, IntPtr.Zero, GetCurrentThreadId());
int errorCode = -1;
if(_LowLevelhookID == (IntPtr)0)
{
errorCode = Marshal.GetLastWin32Error();
}
其实我想创建一个低级别的键盘钩子对我的应用程序只根据SetWindowsHookEx函数参数说明我应设置HMOD参数为空,如果我想设置当前线程ID和仅捕获我的应用程序的关键事件。
任何人都可以确认GetCurrentThreadId()是否需要运行我的应用程序的ThreadID的正确方法?
答
WH_KEYBOARD_LL
挂钩是全球性的,您无法将其安装在您的应用程序中。
Marshal.GetLastWin32Error()
可能无法正常工作,因为您没有为SetWindowsHookEx
添加SetLastError = true
至DllImportAttribute
。
实际上,我确实设置了SetLastError,我在第一步中错过了它,但后来纠正了它。好的,所以一般来说WH_KEYBOARD_LL不能用来覆盖我的应用的关键信息吗? – inva
那么,你可以随时在钩子过程中手动过滤键盘事件,检查你的应用程序是否处于活动状态。另请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx的'Remarks'部分 - 它定义了钩子作用域。 – max