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

问题描述 投票:0回答:1

我开发了一个使用全局键盘/鼠标挂钩的应用程序。它在 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) {}
c# winapi hook keyboard-hook setwindowshookex
1个回答
13
投票

很好奇这段代码在 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);
© www.soinside.com 2019 - 2024. All rights reserved.