Я начал изучать winapi на языке C ++. Я пытаюсь понять lParam
в сообщении WM_KEYDOWN.
Из документации Microsoft:
0-15 : количество повторов для текущего сообщения . Значение - это количество раз, когда нажатие клавиши автоматически повторяется в результате того, что пользователь удерживает клавишу. Если нажатие клавиши удерживается достаточно долго, отправляется несколько сообщений. Однако счетчик повторов не суммируется.
16-23 : код сканирования. Значение зависит от производителя.
24 : указывает, является ли клавиша расширенной клавишей, например, правыми клавишами ALT и CTRL, которые появляются на расширенных 101- или 102- клавишная клавиатура. Значение равно 1, если это расширенный ключ; в противном случае - 0.
25-28 : Зарезервировано; не использовать.
29 : контекстный код. Для сообщения WM_KEYDOWN значение всегда равно 0.
30 : предыдущее состояние ключа. Значение равно 1, если клавиша нажата до отправки сообщения, или ноль, если клавиша нажата.
31 : состояние перехода. Для сообщения WM_KEYDOWN значение всегда равно 0.
Я обрабатываю это сообщение следующим образом:
case WM_KEYDOWN:
cout << ((lParam & 0b11111111111111110000000000000000) >> 16) << ", ";
cout << ((lParam & 0b00000000000000001111111100000000) >> 8) << ", ";
cout << ((lParam & 0b00000000000000000000000010000000) >> 7) << ", ";
cout << ((lParam & 0b00000000000000000000000000000100) >> 2) << ", ";
cout << ((lParam & 0b00000000000000000000000000000010) >> 1) << ", ";
cout << ((lParam & 0b00000000000000000000000000000001) >> 0) << endl;
И если я нажимаю кнопку «A» на клавиатуре, я получаю output: 30, 0, 0, 0, 0, 1
Если я удерживаю кнопку «A», я получаю несколько выходов:
16414, 0, 0, 0, 0, 1
16414, 0, 0, 0, 0, 1
16414, 0, 0, 0, 0, 1
Если я нажимаю кнопку с другой буквой, я получаю тот же результат, но с другим первым номером. (Например, для кнопки «B» я получаю 48 при простом нажатии, 49200 при удерживании)
Как я могу это понять?