我希望能够在 Windows 上拦截(并对其进行任意处理)自动重复按键。我想知道键盘自动重复是如何实现的,以便我知道我有哪些选项。即我可以在以下位置拦截:
- 应用,
- 设备驱动程序和/或
- 硬件级别
?
更新:看起来自动重复(很差?)在硬件级别生成,然后被设备驱动程序覆盖(见这里)。
我希望能够在 Windows 上拦截(并对其进行任意处理)自动重复按键。我想知道键盘自动重复是如何实现的,以便我知道我有哪些选项。即我可以在以下位置拦截:
?
更新:看起来自动重复(很差?)在硬件级别生成,然后被设备驱动程序覆盖(见这里)。
要修改或过滤行为,您可以使用挂钩拦截键:
SetWindowsHookEx
使用WH_KEYBOARD
钩子程序接收,除其他外,重复计数(由于按住键)
请注意,低级键盘挂钩 ( WH_KEYBOARD_LL
) 不接收重复计数。
如果您的所有窗口都在同一个 trhead 中创建,您可以使用特定于线程的钩子,并避免将钩子过程移动到 DLL。
我依稀记得重复计数是由键盘本身生成的,而 LL 钩子会发送重复的 keydown 事件——不过我可能弄错了。在 DOS 下,在 BIOS 中或通过 BIOS 调用设置的键重复率和时间在拔下和重新插入 DIN 或 PS/2 键盘时确实会返回默认值。我不确定为什么你需要确切地知道。
我建议您可能想编辑您的问题...您的实际问题是“如何在 ${yourLangauge} 中抑制 Windows 上的自动重复”...
我的回答是,我没有任何线索,我只在汇编程序(MASM 80286)中做过......即使那时我在BBS上找到了一个解决方案(有人记得他们吗)并且只是使用它. 从内存中,拦截必须在设备驱动程序级别完成。
autorepeat 的实现(100 美元说它是汇编程序)可能不会对抑制它有任何启示......而且微软将这些牌打得非常接近它的胸膛。
干杯。基思。
编辑:我只是想......技术现在可能会因 Windows 版本和各种设备的过多而有所不同......哦,天哪!
但是,听起来这与“与编程无关”。转到控制面板中的“辅助功能选项”。选择“过滤键”组下的“设置”,在这里,您可以关闭该机器上该用户的重复键。
希望这就是你要找的。
PS 以上是针对 Windows XP 的说明。