Search code examples
keyboardautorepeat

How is keyboard auto-repeat implemented on a Windows PC?


I want to be able to intercept (and do arbitrary processing on) auto-repeating key presses on Windows. I'd like to know how keyboard auto-repeat is implemented so that I know what options I have. i.e. can I intercept at the:

  • application,
  • device driver and/or
  • hardware level

?

Update: It looks like auto-repeat is (poorly?) generated at the hardware level and then overridden by device drivers (see here).


Solution

  • To modify or filter behavior, you can intercept keys using a hook:

    SetWindowsHookEx using WH_KEYBOARD

    The hook procedure receives, among others, the repeat count (due to holding down the key)

    Note that the low level keyboard hook (WH_KEYBOARD_LL) does not receive the repeat count.

    If all your windows are created in the same trhead, you can use a thread-specific hook, and avoid moving the hook procedure to a DLL.


    I dimly remember that repeat counts are generated by the keyboard itself and the LL hook sends repeated keydown events - I may be mistaken, though. Under DOS, the key repeat rate and time that was set in BIOS or through a BIOS call did return to default values when a DIN or PS/2 keyboard was unplugged and replugged. I am not sure WHY you need to know exactly.