C++ & Raw Input - raw->data.keyboard.VKey == VK_ESCAPE - единственный виртуальный ключ, который работает
Обратите внимание, что я протестировал только несколько, но из них только VK_ESCAPE
буду работать.
Что я действительно хочу, так это VK_LWIN
а также VK_RWIN
, но они тоже не работают: VK_CONTROL
, VK_LCONTROL
, VK_MENU
, VK_F1
Я не понимаю, почему ни один из них не будет работать, но VK_ESCAPE
буду работать.
Вот краткий код:
case WM_INPUT:
{
LPBYTE lpb = new BYTE[dwSize];
PRAWINPUT raw = (PRAWINPUT)lpb;
UINT Event;
Event = raw->data.keyboard.Message;
keyChar = MapVirtualKey( raw->data.keyboard.VKey, MAPVK_VK_TO_CHAR);
delete[] lpb;
if (Event == WM_KEYUP)
{
if (keyChar == VK_LWIN)
{
system("start c:\\windows\\notepad.exe"); // For debugging, temporary
}
}
break;
Предполагаемая цель этого состоит в том, чтобы что-то сделать, когда пользователь нажимает клавишу Windows, в этом случае "что-то" отправляет другой ввод, такой как ctrl+alt+end (что является моей горячей клавишей для Launchy). Использование AutoHotkey для этого не вариант для меня. Я на Windows 10, если это имеет значение.
Я обычно пишу для игр и программ для 3D, это все для меня в новинку.
1 ответ
Вам не нужен MapVirtualKey для этой цели.
Я подозреваю, что raw->data.keyboard.VKey - это виртуальный код. А VK_LWIN и VK_RWIN - это виртуальные коды. Тем не менее, они не имеют представления символов, поэтому MapVirtualKey не имеет для них смысла. ESCAPE имеет код символа в ASCII, поэтому он работает в вашем случае.
Таким образом, ваш код должен выглядеть так:
case WM_INPUT:
{
...
unsigned vkCode = raw->data.keyboard.VKey;
if (Event == WM_KEYUP)
{
if (vkCode == VK_LWIN)
{
system("start c:\\windows\\notepad.exe"); // For debugging, temporary
}
}
break;