Я только начал использовать Raw Input для своего приложения.
Приступая к вопросу, в наследство WM_KEYDOWN
сообщения, lParam
можно проверить, чтобы получить дополнительную информацию о нажатии клавиши. Как это-
Bits Meaning
0-15 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.
16-23 The scan code. The value depends on the OEM.
24 Indicates whether the key is an extended key, such as the right-hand
ALT and CTRL keys that appear on an enhanced 101- or 102-key
keyboard. The value is 1 if it is an extended key; otherwise, it is
0.
25-28 Reserved; do not use.
29 The context code. The value is always 0 for a WM_KEYDOWN message.
30 The previous key state. The value is 1 if the key is down before the
message is sent, or it is zero if the key is up.
31 The transition state. The value is always 0 for a WM_KEYDOWN
message.
Я хочу знать, если WM_INPUT
сообщение для повторного ключа, так что я могу игнорировать это сообщение (отключить повторение ключа).
Проблема в том, что эта информация не может быть найдена для WM_INPUT
сообщение. lParam
из WM_INPUT
сообщение содержит дескриптор RAWINPUT
состав. Проведя некоторое исследование, я обнаружил, что внутри RAWINPUT::header
содержит член под названием wparam и MSDN описывает его как
wParam
Тип:WPARAM
Значение, переданное вwParam
параметрWM_INPUT
сообщение.
Я найду необходимую информацию здесь или это где-то еще?
API ввода RAW не предоставляет счетчиков повторов. это сырье данные поступают с клавиатуры напрямую. Счетчик повторений рассчитывается на более высоком уровне, когда WM_KEY...
сообщения генерируются. С помощью WM_INPUT
, вам придется вручную отслеживать состояния «вниз» / «вверх» каждой клавиши, чтобы самостоятельно определить количество повторений. Когда клавиша опускается, начинайте считать каждый WM_INPUT
сообщение для этого ключа. Когда ключ поднимется, прекратите считать его.
Мне нужна была та же информация, которую вы ищете, и я нашел разумный обходной путь. Меня не волновало количество повторений клавиш, я просто хотел узнать, WM_INPUT
сообщение представляет автоповтор даже если первоначальное нажатие клавиши произошло, когда мое приложение не было в фокусе, и клавиша продолжала удерживаться, когда фокус переключился на мое приложение.
Выкидываю все кроме первого WM_INPUT
сообщения недостаточно, чтобы различить это, поскольку ключи, удерживаемые до получения фокуса, будут выглядеть как новые ключевые события после получения фокуса. Вам нужна информация в WM_KEYDOWN
/WM_SYSKEYDOWN
lparam, бит 30, и он, очевидно, не доступен из WM_INPUT
,
Мы работаем вокруг этого, запрашивая продолжение приема устаревших входных сообщений при регистрации для необработанного ввода, опуская RIDEV_NOLEGACY
флаг. Мы получаем как необработанные, так и устаревшие сообщения, которые поступают с чередованием. Для любого соответствующего WM_INPUT
сообщение, содержащее ключевую информацию, перед любыми дополнительными сообщениями, связанными с этим ключом, WM_INPUT
сообщения приходят. Наша входная библиотека Windows собирает ключевую информацию из обоих необработанных & Унаследованные сообщения перед оценкой ключевого события, и это работает очень хорошо для нас.