我正在尝试安装WH_KEYBOARD_LL
或WH_MOUSE_LL
挂钩到某个Process
/窗口。
[DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, HookHandler fn, IntPtr module, uint dwThreadId);
[DllImport("user32.dll", SetLastError = true)]
private static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr lpdwProcessId);
public bool Install(Process process)
{
const int WH_KEYBOARD_LL = 0x0D;
if (instance == IntPtr.Zero)
{
var threadId = GetWindowThreadProcessId(process.MainWindowHandle, IntPtr.Zero);
instance = SetWindowsHookEx(WH_KEYBOARD_LL, handler, IntPtr.Zero, threadId);
}
return instance != IntPtr.Zero;
}
其中handler
是我的IntPtr Callback(int nCode, IntPtr wParam, IntPtr lParam)
回调的引用。
我可以通过将第三个SetWindowsHookEx
参数替换为LoadLibrary("User32")
调用的结果并使threadId
为0来成功地全局挂钩,如下所示:
var module = LoadLibrary("User32");
SetWindowsHookEx(WH_KEYBOARD_LL, handler, module, 0u);
我怎么让它工作?
你不能。
如文档所述,WH_KEYBOARD_LL
只能作为全局钩子安装。低级的键盘和鼠标钩子在最终的输入接收器确定之前就被执行了。
下面的图表显示,当一些东西被添加到队列中时,当低级钩子运行时,它需要时间从队列的前面出来。