c++ - 低级挂钩/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
}
}
解决方案
我知道低级键盘挂钩不接收自动重复计数......但是为什么呢?
因为自动重复计数器根本不存在于低级别。在那个级别,您正在从键盘本身获取事件。向下键,向上键,就是这样。键盘不受计数器的控制。
在更高级别上,当系统从键盘处理这些低级别事件并生成键消息以分发给应用程序时,系统会运行自己的计时器来管理重复计数器并在计数器增加时创建相应的键消息。
我想
Space
在使用全局钩子时过滤键的自动重复。有没有办法做到这一点?
在低级挂钩中,您将必须运行自己的计时器,就像系统一样。
否则,请使用更高级别的消息挂钩而不是键盘挂钩。
推荐阅读
- dynamics-crm - 我们可以使用 Azure DevOps Pipelines 在部署后禁用一些 Dynamics 365 自定义插件吗?
- javascript - 数字字段加减号按钮在页面加载后几秒钟内停止工作
- sql - 我无法从下面的查询中获得 max(reservation_date) 的最后日期。查询也需要很长时间
- mysql - 如何查询具有重复节点的闭包表的路径?
- hibernate - Hibernate 通过仅传递“父”实体的 id 创建 OneToMany 的子对象
- javascript - Slick Slider 不适用于 PHP 中的 Loop
- python-3.x - 运行 face_recognition 模型导致“python 已停止工作”
- jmeter - 是否可以在不提供附件的情况下使用 SMTP Sampler?
- python - Django:聚合查询集结果的更好方法
- android - 从实时数据更改活动导致内存泄漏