我看到了一些奇怪的低级键盘钩子回调行为。
首先,我以正确的方式安装钩子
hook_handle_ = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0);
之后,我希望按键按下WM_KEYDOWN
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
switch (wParam)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
{
KBDLLHOOKSTRUCT* kbd = reinterpret_cast<KBDLLHOOKSTRUCT*>(lParam);
std::cout << "Code = " << kbd->vkCode << " Scan = " << kbd->scanCode << " Flags = " << kbd->flags << '\n';
break;
}
case WM_SYSKEYUP:
case WM_KEYUP:
{
KBDLLHOOKSTRUCT* kbd = reinterpret_cast<KBDLLHOOKSTRUCT*>(lParam);
std::cout << "Code = " << kbd->vkCode << " Scan = " << kbd->scanCode << " Flags = " << kbd->flags << '\n';
break;
}
default:
break;
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
当我按下时,让我们说左Ctrl,我期待一条消息WM_KEYDOWN,但什么也得不到。但是,当我释放左Ctrl时,我同时获得WM_KEYDOWN和WM_KEYUP
代码= 162扫描= 29标志= 0
代码= 162扫描= 29个标志= 128
我需要一种方法来分别捕捉新闻事件,而不是按下并释放。 有办法吗?没用我使用的那些工具。 感谢。
更新:它仅发生在修改器上,如Ctrl,Shift,Alt,其他键按预期处理