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;
Другие вопросы по тегам