如何通过扫描码(非虚拟键码)获取密钥状态?

时间:2011-02-07 08:52:32

标签: windows winapi operating-system

无论如何只使用扫描码来获取键盘键的状态(是向下还是向上)?我在win32中找不到任何功能。任何人都知道如何实现这一目标?

P.S。我需要键盘的实际状态而不是从GetKeyState返回的Windows消息派生的状态。

3 个答案:

答案 0 :(得分:2)

您必须使用MapVirtualKey函数,使用MAPVK_VSC_TO_VK作为模式,并将输出传递给GetKeyStateGetKeyboardState,因为没有任何WinAPI密钥函数直接使用扫描码

答案 1 :(得分:0)

也许您正在寻找GetAsyncKeyState。它是从GetKeyState文档中引用的,似乎可以返回您想要的内容。

答案 2 :(得分:0)

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;
}