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 = trueDllImportAttribute

+0

实际上,我确实设置了SetLastError,我在第一步中错过了它,但后来纠正了它。好的,所以一般来说WH_KEYBOARD_LL不能用来覆盖我的应用的关键信息吗? – inva

+0

那么,你可以随时在钩子过程中手动过滤键盘事件,检查你的应用程序是否处于活动状态。另请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx的'Remarks'部分 - 它定义了钩子作用域。 – max