低级挂钩/SetWindowsHookEx lParam 自动重复?

Low Level Hook / SetWindowsHookEx lParam Auto-Repeat?

阅读这里: How is keyboard auto-repeat implemented on a Windows PC?

我了解低级键盘挂钩不会接收自动重复计数:/

Note that the low level keyboard hook (WH_KEYBOARD_LL) does not receive the repeat count.

但是为什么?? o.O

我使用 windows 消息提取自动重复计数的方式:
int repeatCount = (lParam & KF_REPEAT);

但由于某些原因,当我使用 SetWindowsHookEx 挂钩 WH_KEYBOARD_LL.

时它不起作用

我想在使用全局挂钩时过滤 Space 键的自动重复。有办法吗?可能是一种确定按键按下是否自动重复(即按住)的创造性方法?

示例代码:

    if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)
    {
        KBDLLHOOKSTRUCT kbd = *(KBDLLHOOKSTRUCT *)(lParam);
        if (kbd.vkCode == VK_SPACE && !(lParam & KF_REPEAT))
        {
            // do something
        }
    }

I understand that low level keyboard hook does't receive auto-repeat count ... But why??

因为 auto-repeat 计数器 在低级别根本不存在 。在那个级别,您从键盘本身获取事件。向下键,向上键,就是这样。键盘不受计数器的控制。

更高级别,当系统正在处理来自键盘的那些低级别事件并生成要分发给应用程序的关键消息时,系统运行它的自己的计时器来管理重复计数器并在计数器递增时创建相应的键消息。

I want to filter auto-repeat for the Space key while using the global hook. Is there a way doing that?

低级别 挂钩中,您必须运行 自己的计时器,就像系统所做的那样。

否则,请使用更高级别消息挂钩而不是键盘挂钩。