LowLevelKeyboardProc仅在密钥释放时处理修饰符键

时间:2016-07-22 10:03:46

标签: c++ winapi hook

我看到了一些奇怪的低级键盘钩子回调行为。

首先,我以正确的方式安装钩子

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,其他键按预期处理

0 个答案:

没有答案