c++ - 低级 Hook /SetWindowsHookEx lParam 自动重复?

标签 c++ windows winapi hook low-level

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

我知道低级键盘 Hook 不会接收自动重复计数:/

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 Hook WH_KEYBOARD_LL 时,由于某种原因它不起作用。

我想在使用全局 Hook 时过滤 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??

因为自动重复计数器在低电平根本不存在。在该级别,您可以从键盘本身获取事件。按下键,向上键,就是这样。键盘无法控制计数器。

在较高级别,当系统处理来自键盘的低级别事件并生成要分发到应用程序的关键消息时,系统运行自己的计时器来管理重复计数器并创建每当计数器增加时,就会出现相应的关键消息。

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

低级钩子(Hook)中,您必须运行自己的计时器,就像系统一样。

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

关于c++ - 低级 Hook /SetWindowsHookEx lParam 自动重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56415321/

相关文章:

.net - 了解vs2010的基本windows编程

c++ - 当程序可见或最小化时进程 ID 发生变化

c++ - 关于 Vulkan 中的函数加载器

c++ - 函数中的 vector - 如何返回

c++ - 声明 SID Windows c++

c++ - Windows Python C 扩展仅适用于我自己的 Python 构建(使用 VC++ 2008 Express 的 32 位构建)

c++ - 如何处理 WM_NCCALCSIZE 并制作类似 chrome 的界面?

c++ - Windows C++ 屏幕保护程序无法重新打开屏幕

c++ - 编译器将派生类视为实际定义的抽象引用函数

c++ - 检查windows文件权限