Автоповтор нажатия клавиш
От: bazzzman  
Дата: 10.04.06 01:06
Оценка:
При зажатии клавиши на клавиатуре начинается автоповтор нажатий, т.е. одна и та же клавиша начинает нажиматься несколько раз. У меня вот такой вопрос: как программно задавить в любой момент времени автоповтор нажатия клавиши?

Если пользователь нажимает клавишу моя прога перехватывает нажатие и начинает что-нибудь делать, и вот как раз в этот момент надо приглушить автоповтор нажатия.

Физически это можно сделать кратковременно нажав в этот момент времени другую клавишу. Например при зажатой клавиши 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 не прекращается.

Как-то можно разрулить это без создания драйвера/фильтра и без режима ядра?

Не пытайтесь меня переубедить, что это плохая идея, или как-то по-другому решить эту проблему. ЭТО ИМЕННО ТО, ЧТО МНЕ НУЖНО, я уверен. Сейчас я обхожусь и без этого — фильтрую информацию о нажатиях в своем приложении, но теперь приложение слишком разрослось и это стало очень накладно.
Re: Автоповтор нажатия клавиш
От: programmater  
Дата: 10.04.06 07:30
Оценка:
Здравствуйте, 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.

Ну это ты наверное и без меня знаешь.
Re: Автоповтор нажатия клавиш
От: Кодёнок  
Дата: 12.04.06 05:29
Оценка: +1
Здравствуйте, bazzzman, Вы писали:

B>Не пытайтесь меня переубедить, что это плохая идея, или как-то по-другому решить эту проблему. ЭТО ИМЕННО ТО, ЧТО МНЕ НУЖНО, я уверен. Сейчас я обхожусь и без этого — фильтрую информацию о нажатиях в своем приложении, но теперь приложение слишком разрослось и это стало очень накладно.


А решение с GetKeyboardState или DirectInput тебе не подойдет? Смотри с их помощью только на состояние, нажата/отпущена, а WM_KEYDOWN игнорируй.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.