带Alt+Tab键的WH_KEYBOARD停止工作

本文关键字:KEYBOARD 停止工作 WH Alt+Tab 键的 | 更新日期: 2023-09-27 18:20:02

当我设置非全局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键,失去焦点并激活窗口不会停止挂钩。

带Alt+Tab键的WH_KEYBOARD停止工作

在查找了一些示例并分析了我的代码后,我发现了如何解决这个"bug"。我应该这样设置SetWindowsHookEx函数中的最后两个参数:

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

但不是这样的:

SetWindowsHookEx(HookType.WH_KEYBOARD, HookCallback, 
                 GetModuleHandle(curModule.ModuleName), 0);