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

Windows 如何通过扫描码(非虚拟密钥码)获取密钥状态?,windows,winapi,operating-system,Windows,Winapi,Operating System,是否只需要扫描码就可以获得键盘键的状态(是向下还是向上)?我在win32中找不到与此相关的任何函数。有人知道实现这一目标的方法吗 p、 我需要的是键盘的实际状态,而不是从诸如GetKeyState返回的windows消息派生的状态。也许您正在寻找。它是从文档中引用的,似乎返回了您想要的内容。您必须使用该函数,使用MAPVK\u VSC\u to\u VK作为模式,并将输出传递到GetKeyState,或者,由于没有任何WinAPI键函数直接使用扫描代码MapVirtualKey不会转换很多键,所

是否只需要扫描码就可以获得键盘键的状态(是向下还是向上)?我在win32中找不到与此相关的任何函数。有人知道实现这一目标的方法吗


p、 我需要的是键盘的实际状态,而不是从诸如GetKeyState返回的windows消息派生的状态。

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

您必须使用该函数,使用
MAPVK\u VSC\u to\u VK
作为模式,并将输出传递到
GetKeyState
,或者,由于没有任何WinAPI键函数直接使用扫描代码
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;
}
intmain(){
directinput=新的directinput();
directinput->init();
而(1){
int-ret=directinput->ReadKeyboard();
如果(!ret)
继续;
按下int键=0;
对于(int i=0;i<256;i++){
如果((directinput->m_键盘状态[i]&128)==0)
继续;
无符号字符扫描码=i;
UINT key=MapVirtualKey(扫描代码,MAPVK_-VSC_-TO_-VK_-EX);
//UINT key=MapVirtualKeyx(扫描代码,MAPVK_VSC_TO_VK,GetKeyboardLayout(0));//与MapVirtualKey相同
开关(扫描码){
案例203:key=VK_左;中断;
案例205:key=VK_RIGHT;break;
案例200:key=VK_UP;break;
案例208:key=VK_故障;中断;
案例211:key=VK_DELETE;break;
案例207:key=VK_END;break;
案例199:key=VK_HOME;break;//pos1
案例201:key=VK_PRIOR;break;//翻页
案例209:key=VK_NEXT;break;//向下翻页
案例210:key=VK_INSERT;break;
案例184:key=VK\u RMENU;break;//右alt
案例157:key=VK\u RCONTROL;break;//右控制
案例219:key=VK_LWIN;break;//左赢
案例220:key=VK_RWIN;break;//右赢
案例156:key=VK\u RETURN;break;//右键输入
案例181:key=VK_DIVIDE;break;//numpad DIVIDE
案例221:key=VK_应用程序;break;//菜单键
}
printf(“按下键=%d扫描码=%d/0x%x键=%d字符=%c十六进制=0x%x\n”,按下键,扫描码,扫描码,键,键,键);
按键按++;
}
睡眠((智力)(1000.0/60.0));
}
返回0;
}