如何在给定的窗口/进程上安装钩子



我正在尝试安装WH_KEYBOARD_LLWH_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只能作为全局钩子安装。低级的键盘和鼠标钩子在最终的输入接收器确定之前就被执行了。

下面的图表显示,当一些东西被添加到队列中时,当低级钩子运行时,它需要时间从队列的前面出来。

相关内容

  • 没有找到相关文章

最新更新