在 Windows XP 中使用 SetWindowsHookEx 时出错,但在 Windows 7 中则不然

本文关键字:Windows 但在 XP SetWindowsHookEx 出错 | 更新日期: 2023-09-27 18:33:33

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

在 Windows XP 中使用 SetWindowsHookEx 时出错,但在 Windows 7 中则不然

很好奇这段代码在 Win7 上不会失败,但我当然从未尝试过。 但这是正确的行为,看起来他们改进了它。 SetWindowsHookEx() 的参数验证需要一个有效的非零第 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 不再伪造纯托管程序集的模块句柄。 一个好用的方法是你从pinvoing LoadLibrary("user32.dll")中得到的那个,因为它总是已经加载了。 您不必调用 FreeLibrary()。

您需要此声明来调用 LoadLibrary:

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