我开发了一个使用全局键盘/鼠标挂钩的应用程序。它在 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() 的参数验证需要有效的非零第三个或第四个参数。错误代码具有很强的描述性,来自 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);