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