在Windows XP中使用SetWindowsHookEx时出错,但在Windows 7中没有

我开发了一个使用全局键盘/鼠标钩子的应用程序。 它在Windows 7中运行良好,但在Windows XP中运行不佳。

当我在Windows XP中调用SetWindowsHookEx时,收到错误代码1428

int MouseLowLevel = 14 int code = SetWindowsHookEx(MouseLowLevel, MouseHookProc, IntPtr.Zero, 0); private IntPtr MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) {} 

好奇这个代码在Win7上没有失败,但我当然没试过。 但这是正确的行为,看起来他们改进了它。 SetWindowsHookEx()的参数validation需要有效的非零第3或第4个参数。 WinError.h中的错误代码是高度描述性的:

 // // MessageId: ERROR_HOOK_NEEDS_HMOD // // MessageText: // // Cannot set nonlocal hook without a module handle. // #define ERROR_HOOK_NEEDS_HMOD 1428L 

任何模块句柄都可以,因为它实际上并没有用于低级钩子,不​​需要注入DLL来使它们工作。 .NET 4需要注意选择一个,因为它的CLR不再伪造纯托管程序集的模块句柄。 一个好用的是你从pinvoking LoadLibrary(“user32.dll”)得到的,因为它总是已经加载。 您不必调用FreeLibrary()。

你需要这个声明来调用LoadLibrary:

 [DllImport("kernel32", SetLastError=true, CharSet = CharSet.Auto)] private static extern IntPtr LoadLibrary(string fileName);