首页 > 解决方案 > 低级挂钩/SetWindowsHookEx lParam 自动重复?

问题描述

在这里阅读: 如何在 Windows PC 上实现键盘自动重复?

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

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

但为什么??oO

我过去使用 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
        }
    }

标签: c++windowswinapihooklow-level

解决方案


我知道低级键盘挂钩不接收自动重复计数......但是为什么呢?

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

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

我想 Space 在使用全局钩子时过滤键的自动重复。有没有办法做到这一点?

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

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


推荐阅读