在这里阅读: 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/