当我设置非全局WH_KEYBOARD挂钩时,它工作正常并且所有键都被捕获。但是,如果我按Alt + Tab然后返回到窗口,钩子会无缘无故地停止工作。 这是我的钩子proc,我试图用id = root:
阻止proccess的所有键盘消息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,则丢失焦点并激活窗口不会停止挂钩。
答案 0 :(得分:1)
在寻找一些样本并分析我的代码后,我发现了如何解决这个“bug”。我应该以这种方式在SetWindowsHookEx函数中设置最后两个参数:
SetWindowsHookEx(HookType.WH_KEYBOARD, HookCallback,
IntPtr.Zero, GetCurrentThreadId());
但不是这样的:
SetWindowsHookEx(HookType.WH_KEYBOARD, HookCallback,
GetModuleHandle(curModule.ModuleName), 0);