Физическое состояние ключа - PullRequest
0 голосов
/ 21 ноября 2011

Две функции состояния ключа в WIndows API, GetKeyState() и GetAsyncKeyState(), обе определяют состояние ключа на основе сообщений о повышении / понижении ключа, а не о физическом состоянии ключа.

Я работаю над программой, которая управляет вводом, используя SendInput(), для отпускания клавиш-модификаторов (alt, ctrl и т. Д.), Отправки ввода и повторного нажатия клавиш-модификаторов.

Проблема в том, что я не знаю, все ли нажаты клавиши-модификаторы после отправки ввода, потому что я отправил событие key-up, и обе вышеупомянутые функции возвращают, что клавиша работает независимо от состояния физического ключа. Так что, если я предполагаю, что они все еще не работают, у пользователя остается свисающий ctrl-down, вызывающий проблемы, пока пользователь не нажмет и не отпустит cntl снова (или любую клавишу-модификатор). В противном случае клавиша может быть оставлена ​​вверх, даже если физическая клавиша все еще не нажата.

Итак, есть ли способ (желательно без какого-либо слишком низкого уровня) обнаружить физическое состояние ключа. Методы только для Windows в порядке. Мониторинг ключей (прослушивание событий key up) действительно невозможен (или, по крайней мере, действительно, действительно не предпочтителен).

Ответы [ 3 ]

1 голос
/ 28 декабря 2011

Вы не предоставляете оконному менеджеру достаточно времени для обработки введенного вами ввода.До тех пор, пока он не достигнет «состояния ключа обновления для GetAsyncKeyState» части кода, GetAsyncKeyState сообщит старое значение.(В частности, он не достигнет этой точки, пока все низкоуровневые зацепки клавиатуры не смогут проверить действие и, возможно, отклонить его.)

Другими словами, ваш код имеет состояние состязания иэто то, что вы наблюдаете.

0 голосов
/ 26 ноября 2011

После долгих испытаний, похоже, я понял это.MSDN сообщает о GetKeyState():

Состояние ключа, возвращаемое этой функцией, изменяется, когда поток читает сообщения ключа из своей очереди сообщений.

GetAsyncKeyState() все еще работаетсообщения вверх / вниз (не физическое состояние ключа), однако, они просто не ждут, пока сообщение будет прочитано.Таким образом, если сообщение о ключевом событии отправляется через SendInput(), оно все равно будет возвращаться неправильно - фактически оно будет неверным до GetKeyState(), потому что оно будет некорректным сразу после вызова.

Простой тест дляпродемонстрировать, что эта функциональность здесь (решение VS2010) или просто источник здесь .

0 голосов
/ 21 ноября 2011

Вы немного запутались здесь.Фактически GetAsyncKeyState() возвращает состояние ключа в тот момент, когда был вызван GetAsyncKeyState().С другой стороны, GetKeyState() возвращает состояние ключа на основе истории сообщений в очереди.

...