Поиск данных повторения ключа в сообщении WM_INPUT

Я только начал использовать 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 сообщение.

Я найду необходимую информацию здесь или это где-то еще?

2

Решение

API ввода RAW не предоставляет счетчиков повторов. это сырье данные поступают с клавиатуры напрямую. Счетчик повторений рассчитывается на более высоком уровне, когда WM_KEY... сообщения генерируются. С помощью WM_INPUT, вам придется вручную отслеживать состояния «вниз» / «вверх» каждой клавиши, чтобы самостоятельно определить количество повторений. Когда клавиша опускается, начинайте считать каждый WM_INPUT сообщение для этого ключа. Когда ключ поднимется, прекратите считать его.

4

Другие решения

Мне нужна была та же информация, которую вы ищете, и я нашел разумный обходной путь. Меня не волновало количество повторений клавиш, я просто хотел узнать, WM_INPUT сообщение представляет автоповтор даже если первоначальное нажатие клавиши произошло, когда мое приложение не было в фокусе, и клавиша продолжала удерживаться, когда фокус переключился на мое приложение.

Выкидываю все кроме первого WM_INPUT сообщения недостаточно, чтобы различить это, поскольку ключи, удерживаемые до получения фокуса, будут выглядеть как новые ключевые события после получения фокуса. Вам нужна информация в WM_KEYDOWN/WM_SYSKEYDOWN lparam, бит 30, и он, очевидно, не доступен из WM_INPUT,

Мы работаем вокруг этого, запрашивая продолжение приема устаревших входных сообщений при регистрации для необработанного ввода, опуская RIDEV_NOLEGACY флаг. Мы получаем как необработанные, так и устаревшие сообщения, которые поступают с чередованием. Для любого соответствующего WM_INPUT сообщение, содержащее ключевую информацию, перед любыми дополнительными сообщениями, связанными с этим ключом, WM_INPUT сообщения приходят. Наша входная библиотека Windows собирает ключевую информацию из обоих необработанных & Унаследованные сообщения перед оценкой ключевого события, и это работает очень хорошо для нас.

2

По вопросам рекламы [email protected]