WolfG1 Ответов: 1

Sendinput и mapvirtualkeyex


Приветствую вас!

Для удаленного управления (перемещения, масштабирования) видеокамерой я посылаю нажатия клавиш в приложение управления windows.
Я использую SendInput и MapVirtualKeyEx для перевода кода виртуальной клавиши в код сканирования клавиатуры,
потому что клавиши extendend, такие как VK_NUMPAD0-VK_NUMPAD9 и 4 клавиши со стрелками, используются для управления камерой.
Это хорошо работает для основных клавиш A-Z 0-9 BS, SPACE, CR, NL и ENTER.
Метод получения wScan я использую
input.ki.wScan = MapVirtualKeyEx(VkKeyScanA(keycode), MAPVK_VK_TO_VSC, GetKeyboardLayout(0));
Как уже говорилось, это хорошо работает для базовых клавиш, но расширенные клавиши переводятся неправильно.
В настоящее время я обычно устанавливаю соответствующий wScan.

Что такое правильный способ, чтобы полностью перевести виртуальные клавиши в код wScan клавиатуры?

Спасибо за подсказки
Волк

Что я уже пробовал:

if (!raw) {
     input.ki.wScan = MapVirtualKeyEx(VkKeyScanA(keycode), MAPVK_VK_TO_VSC, GetKeyboardLayout(0));
 } else {
     input.ki.wScan = keycode;            // scancode, manually supplied
 }
 input.ki.wVk = 0;                        // virtual key
 input.type = INPUT_KEYBOARD;
 input.ki.time = 200;
 input.ki.dwExtraInfo = 0;

1 Ответов

Рейтинг:
4

jcunews

MapVirtualKey / MapVirtualKeyEx является ненадежным при работе с расширенными ключами. Некоторые коды виртуальных ключей не задаются как расширенные ключи, когда они должны быть заданы. Из-за этого он не может различать навигационные (например, Left, Home, PageDown и т. д.), вставки и удаления клавиш цифровой клавиатуры и серых наборов клавиш. Хотя государства-сайте MSDN MAPVK_VK_TO_VSC_EX поддержка расширенных клавиш. Также, MAPVK_VSC_TO_VK_EX на самом деле он не поддерживает расширенные ключи, то есть работает точно так же, как MAPVK_VSC_TO_VK.

Если это только для цифровых клавиш, то виртуальный код ключа VK_NUMPAD0 к VK_NUMPAD9 не являются расширенными ключами. Навигационные клавиши, такие как Home, Left и PageDown, независимо от того, относятся ли они к серым или цифровым группам клавиш, их виртуальные коды VK_HOME, VK_LEFT, VK_NEXT и т. д., и расширенные ключи. При использовании SendInput(), KEYEVENTF_EXTENDEDKEY флаг должен быть указан, если ключ является расширенным ключом.

Если вам нужна надежная функция преобразования кода ключа, я предлагаю создать функцию, которая ищет виртуальный код и сканирует отображение кода непосредственно из библиотеки DLL раскладки клавиатуры для текущей раскладки клавиатуры. Ниже в статье объясняется, как загрузить модуль и получить указатель на дескриптор слоя клавиатуры (KBDTABLES).

Загрузка раскладки клавиатуры (KbdLayerDescriptor) в 32/64-битной среде

Структура дескриптора слоя клавиатуры содержит 3 указателя на таблицы сопоставления. Один для не расширенных ключей (usVSCtoVK), и два для расширенных ключей (VSCtoVK_E0 и VSCtoVK_E1Существует две расширенные таблицы сопоставления ключей, так как расширенный ключ может иметь либо 0xE0 или 0xE1 префикс кода сканирования. Не расширенные ключи не имеют префикса кода сканирования.