Каково поведение lParam при получении сообщения WM_KEYDOWN? - PullRequest
0 голосов
/ 28 мая 2020

Я начал изучать 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 при удерживании)

Как я могу это понять?

1 Ответ

6 голосов
/ 28 мая 2020

Я не проверял это, но ваш порядок битов, похоже, обратный. Согласно Документация MS , биты 0-15 являются битами LOW.

case WM_KEYDOWN:
    cout << ((lParam & 0b00000000000000001111111111111111) >> 0) << ", ";
    cout << ((lParam & 0b00000000111111110000000000000000) >> 16) << ", ";
    cout << ((lParam & 0b00000001000000000000000000000000) >> 24) << ", ";
    cout << ((lParam & 0b00100000000000000000000000000000) >> 29) << ", ";
    cout << ((lParam & 0b01000000000000000000000000000000) >> 30) << ", ";
    cout << ((lParam & 0b10000000000000000000000000000000) >> 31) << ", ";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...