При зажатии клавиши на клавиатуре начинается автоповтор нажатий, т.е. одна и та же клавиша начинает нажиматься несколько раз. У меня вот такой вопрос: как программно задавить в любой момент времени автоповтор нажатия клавиши?
Если пользователь нажимает клавишу моя прога перехватывает нажатие и начинает что-нибудь делать, и вот как раз в этот момент надо приглушить автоповтор нажатия.
Физически это можно сделать кратковременно нажав в этот момент времени другую клавишу. Например при зажатой клавиши Win надо нажать клавишу T:
D - Left Windows 91 91 1
D - Left Windows 91 91 1
D - Left Windows 91 91 1
D - Left Windows 91 91 1
D - T 84 20 0
U - T 84 20 128
U - Left Windows 91 91 129
При этом автоповтор нажатий прекратится, но клавиша Win останется нажатой (последняя строка в примере — клавишу Win я отпустил через довольно большой промежуток времени и это показывает, что после нажатия клавиши T не было больше автоповтора Win).
Но все это работает если только физически нажать клавишу T на клавиатуре. При программной эмуляции — SendInput, автоповтор Win не прекращается.
Как-то можно разрулить это без создания драйвера/фильтра и без режима ядра?
Не пытайтесь меня переубедить, что это плохая идея, или как-то по-другому решить эту проблему. ЭТО ИМЕННО ТО, ЧТО МНЕ НУЖНО, я уверен. Сейчас я обхожусь и без этого — фильтрую информацию о нажатиях в своем приложении, но теперь приложение слишком разрослось и это стало очень накладно.
Здравствуйте, bazzzman, Вы писали:
[кусь]
Насколько мне известно, автоповтор — штука аппаратная и задавить её в принцепе невозможно. Можно уменьшить частоту и увеличить длительность перед автоповтором, но задавить совсем — нельзя, клавиатура все равно будет генерить "автоповторные" нажатия. Даже клавиши Shift и Ctrl генерируют серии нажатий (на аппаратном уровне), но их фильтрует драйвер. Без драйвера могу только порекомендовать отслеживать в мессаге флаг (счетчик) автоповтора (сообщение WM_KEYDOWN параметр LPARAM lParam // key data)
lParam
Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in the following table. 0–15 Specifies the repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the user holding down the key. If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative.
Ну это ты наверное и без меня знаешь.