使用KBDLLHOOKSTRUCT确定第一次按键

时间:2014-08-27 11:19:43

标签: windows winapi keyboard-hook

我在Windows上使用低级键盘钩子。尽管我目前无法判断该键是否最初被按下或再次按下,但它的工作方式却像魅力一样。 documentation(+ here)表示,第7位保持过渡状态。但是当钥匙被释放时,这似乎才是真的。当我第一次按下键时,遗憾的是没有设置位7。

有没有办法判断最初是否按下了键?

1 个答案:

答案 0 :(得分:1)

我最近遇到了这个问题。我找不到任何好的解决方案,但我最终在GetAsyncKeyState之前使用了一个标记SetWindowHookEx

BOOL wasDown;

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == HC_ACTION) {
        LPKBDLLHOOKSTRUCT key = (LPKBDLLHOOKSTRUCT) lParam;
        if (key->vkCode == VK_SOMETHING) {
            switch (wParam) {
                case WM_KEYDOWN:
                case WM_SYSKEYDOWN:
                    if (!wasDown) {
                        // Processing on first key down
                        wasDown = true;
                    }
                    break;
                case WM_KEYUP:
                case WM_SYSKEYUP:
                    // Processing on key up
                    wasDown = FALSE;
                    break;
            }
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

wasDown = GetAsyncKeyState(VK_SOMETHING) < 0;
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);

当然,此代码仅针对一个密钥执行此操作。您可以使用一组标志来执行多个键。根据您的应用程序,如果您希望在设置挂钩后第一次按下,您还可以无条件地将标记设置为false