Получение кода виртуального ключа из сообщения WM_CHAR - PullRequest
3 голосов
/ 07 октября 2011

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 10 октября 2011

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

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

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

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

  unsigned int virtualKey = MapVirtualKey(scancode,MAPVK_VSC_TO_VK);
2 голосов
/ 07 октября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...