5

我开发了一个使用全局键盘/鼠标钩子的应用程序。它在 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) {}
4

1 回答 1

12

很好奇这段代码在 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);
于 2012-05-09T12:56:03.047 回答