0

当我设置非全局 WH_KEYBOARD 挂钩时,它工作正常并且所有键都被捕获。但是如果我按 Alt+Tab 然后返回窗口,钩子会无缘无故地停止工作。这是我的钩子进程,我试图阻止 id = root 进程的所有键盘消息:

private static IntPtr HookCallback (int nCode, IntPtr wParam, IntPtr lParam)
{     
 var proc = 0u;
 GetWindowThreadProcessId(GetForegroundWindow(), out proc);
 if (proc != root) return CallNextHookEx(hooks[0], nCode, wParam, lParam);
  return new IntPtr(1);
}

为了开发,我在 VirtualBox 中使用 32 位 Windows。

更新: 它也不依赖于阻塞或将参数传递给下一个钩子:什么都不做然后调用下一个钩子的代码变体在 Alt+Tab 之后也停止工作。如果不使用 Alt+Tab,失去焦点和激活窗口不会停止钩子。

4

1 回答 1

1

在查找了一些示例并分析了我的代码后,我发现了如何解决这个“错误”。我应该以这种方式在 SetWindowsHookEx 函数中设置最后两个参数:

SetWindowsHookEx(HookType.WH_KEYBOARD, HookCallback, 
                 IntPtr.Zero, GetCurrentThreadId());

但不是这样:

SetWindowsHookEx(HookType.WH_KEYBOARD, HookCallback, 
                 GetModuleHandle(curModule.ModuleName), 0);
于 2013-07-01T14:14:02.853 回答