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

时间:2019-06-02 13:03:39

标签: c++ windows winapi hook low-level

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

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

  

请注意,低级键盘挂钩(WH_KEYBOARD_LL)不会   收到重复计数。

但是为什么? 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
        }
    }

1 个答案:

答案 0 :(得分:2)

  

我了解低级别的键盘挂钩不会收到自动重复计数...但是为什么?

因为自动重复计数器在较低级别上根本不存在。在该级别上,您正在从键盘本身获取事件。按下键,按下键,就是这样。键盘不受计数器的控制。

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

  

我想在使用全局挂钩时为Space键过滤自动重复。有办法吗?

低级挂钩中,您将必须运行自己的计时器,就像系统一样。

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