Получение кода виртуального ключа из сообщения WM_CHAR

Я получаю ввод текста и нажатие клавиш из сообщений WM_CHAR и WM_KEYDOWN.

Что я хочу сделать, так это отфильтровать сообщения WM_CHAR, которые имеют тот же код VK_, что и ключ, связанный для включения элемента управления, в который вы вводите текст.

Например: игра использует ~ для включения консоли, привязка клавиш выполняется через VK_OEM3 и WM_KEYDOWN, но для ввода текста в консоль требуется текст из WM_CHAR.

Поскольку сначала происходит WM_KEYDOWN, консоль активируется, затем в буфер консоли отправляется WM_CHAR из ~, чего я не хочу.

Я решил, что лучший способ предотвратить это — сравнить VK_ из WM_CHAR с привязанным ключом для элемента управления и отфильтровать его.

Есть ли способ получить VK_ из сообщения WM_CHAR?

Я читал, что вы можете получить скан-код из Lparam в битах 16-23.

Но я не уверен, как:

  1. Извлеките значение скан-кода из lparam
  2. Переведите скан-код в ВК_ правильно

person Spencer Rose    schedule 07.10.2011    source источник


Ответы (2)


После некоторого возни мне удалось извлечь виртуальный ключ с помощью следующего кода:

Этот код получает адрес lParam в виде массива символов без знака (длиной один байт), затем использует арифметику указателя для адресации третьего байта (биты 16-23):

  unsigned char scancode = ((unsigned char*)&lParam)[2];

Этот код преобразуется из скан-кода в виртуальный ключ:

  unsigned int virtualKey = MapVirtualKey(scancode,MAPVK_VSC_TO_VK);
person Spencer Rose    schedule 10.10.2011

Возможно, вы могли бы использовать MapVirtualKey.

Я не уверен, как извлечь скан-код из lparam, поскольку в документации это не указано - либо получить весь lparam и подсчитать, что эта функция знает, на какие биты смотреть, либо использовать структуру битового поля и просто получить из нее правильные биты. Я думаю, что один из этих методов должен работать - попробовать оба не должно быть сложно.

person j_kubik    schedule 07.10.2011