Как получить состояние ключа через скан-код (не виртуальный код ключа)? - PullRequest
2 голосов
/ 07 февраля 2011

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

p.s. Мне нужно фактическое состояние клавиатуры, а не состояние, полученное из сообщений Windows, таких как возвращает GetKeyState.

Ответы [ 3 ]

2 голосов
/ 07 февраля 2011

Вам нужно будет использовать функцию MapVirtualKey, используя MAPVK_VSC_TO_VK в качестве режима, и передать вывод в GetKeyState или GetKeyboardState как ни функции клавиш WinAPI напрямую используют коды сканирования

0 голосов
/ 12 марта 2017

MapVirtualKey не переводит много ключей, поэтому я придумал этот переключатель:

int main() {
    directinput = new DirectInput();
    directinput->init();
    while(1) {
        int ret = directinput->ReadKeyboard();
        if(!ret)
            continue;

        int keys_pressed = 0;
        for(int i = 0; i < 256; i++) {
            if((directinput->m_keyboardState[i] & 128) == 0)
                continue;
            unsigned char scancode = i;
            UINT key = MapVirtualKey(scancode, MAPVK_VSC_TO_VK_EX);
            //UINT key = MapVirtualKeyEx(scancode, MAPVK_VSC_TO_VK, GetKeyboardLayout(0)); // same as MapVirtualKey

            switch(scancode) {
                case 203: key = VK_LEFT; break;
                case 205: key = VK_RIGHT; break;
                case 200: key = VK_UP; break;
                case 208: key = VK_DOWN; break;
                case 211: key = VK_DELETE; break;
                case 207: key = VK_END; break;
                case 199: key = VK_HOME; break; // pos1
                case 201: key = VK_PRIOR; break; // page up
                case 209: key = VK_NEXT; break;  // page down
                case 210: key = VK_INSERT; break;
                case 184: key = VK_RMENU; break; // right alt
                case 157: key = VK_RCONTROL; break; // right control
                case 219: key = VK_LWIN; break; // left win
                case 220: key = VK_RWIN; break; // right win
                case 156: key = VK_RETURN; break; // right enter
                case 181: key = VK_DIVIDE; break; // numpad divide
                case 221: key = VK_APPS; break; // menu key
            }

            printf("keys_pressed=%d scancode=%d/0x%x key=%d char=%c hex=0x%x\n", keys_pressed, scancode, scancode, key, key, key);
            keys_pressed++;
        }

        Sleep((int)(1000.0 / 60.0));
    }
    return 0;
}
0 голосов
/ 07 февраля 2011

Возможно, вы ищете GetAsyncKeyState.На него ссылаются из документации GetKeyState и, кажется, он возвращает то, что вы хотите.

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