【问题标题】:How is keyboard auto-repeat implemented on a Windows PC?如何在 Windows PC 上实现键盘自动重复?
【发布时间】:2009-05-18 21:36:26
【问题描述】:

我希望能够在 Windows 上拦截(并对其进行任意处理)自动重复按键。我想知道键盘自动重复是如何实现的,以便我知道我有哪些选项。即我可以在以下位置拦截:

  • 应用,
  • 设备驱动程序和/或
  • 硬件级别

?

更新:看起来自动重复(很糟糕?)在硬件级别生成,然后被设备驱动程序覆盖(see here)。

【问题讨论】:

    标签: keyboard autorepeat


    【解决方案1】:

    要修改或过滤行为,您可以使用钩子拦截键:

    SetWindowsHookEx 使用 WH_KEYBOARD

    hook procedure 接收重复计数等信息(由于按住键)

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

    如果您的所有窗口都在同一个 trhead 中创建,您可以使用特定于线程的钩子,并避免将钩子过程移动到 DLL。


    我依稀记得重复计数是由键盘本身生成的,并且 LL 挂钩会发送重复的 keydown 事件——不过我可能弄错了。在 DOS 下,在 BIOS 中或通过 BIOS 调用设置的键重复率和时间在拔下和重新插入 DIN 或 PS/2 键盘时确实返回到默认值。我不确定为什么你需要确切地知道。

    【讨论】:

      【解决方案2】:

      我建议您可能想编辑您的问题...您的实际问题是“如何在 ${yourLangauge} 中抑制 Windows 上的自动重复”...

      对此我的回答是,我没有任何线索,我只在汇编程序(MASM 80286)中做过......即使那时我在BBS上找到了一个解决方案(有人记得他们吗)和刚用过。从内存中,拦截必须在设备驱动程序级别完成。

      autorepeat 的实现(100 美元说它是汇编程序)可能不会对抑制它有任何启示......而且微软将这些牌打得非常接近它的胸膛。

      干杯。基思。

      编辑:我只是想...技术现在可能在不同版本的 windows 和过多的各种设备之间有所不同...哦,天哪!

      【讨论】:

      • 不,我真的很想知道它是如何实现的。关于抑制的一点是为了背景信息。我的怀疑是它可能在硬件级别(如果属实,我会提供更多拦截选项)。
      【解决方案3】:

      不过,这听起来像是“与编程无关”。 转到控制面板中的“辅助功能选项”。 选择“过滤键”组下的“设置”,在这里,您可以关闭该机器上该用户的重复键。

      希望这就是您想要的。

      附:以上针对 Windows XP 的说明。

      【讨论】:

      • 我希望能够以编程方式抑制这一点,但我很高兴一旦我了解了自动重复的实现方式/位置,我将能够弄清楚如何做到这一点。
      猜你喜欢
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2011-12-19
      • 1970-01-01
      相关资源
      最近更新 更多