我正在尝试使用Windows命令提示符编写DOS游戏。我在这里有简化的源代码:
#include <windows.h>
#include <stdio.h>
HANDLE hStdin;
VOID KeyEventProc(KEY_EVENT_RECORD);
int main(VOID) {
DWORD cNumRead, fdwMode, i;
INPUT_RECORD irInBuf[128];
hStdin = GetStdHandle(STD_INPUT_HANDLE);
while(true) {
ReadConsoleInput(hStdin, irInBuf, 128, &cNumRead);
for (i = 0; i < cNumRead; i++) {
switch(irInBuf[i].EventType) {
case KEY_EVENT:
KeyEventProc(irInBuf[i].Event.KeyEvent);
break;
default:
break;
}
}
}
return 0;
}
VOID KeyEventProc(KEY_EVENT_RECORD ker) {
if(ker.bKeyDown) {}
else printf("key released\n");
}
问题是当按某些组合按下多个按钮时,它们似乎不再注册!
例如,运行此程序并按a,然后放开。它会告诉你,你放开了按钮。
现在按j,k和l。当你放开任何这些按钮时,它会让你知道
现在按j,k,l和i。当你放开我时,它将不再记录按钮已被释放! o.0
但是如果按j,k,l和d然后释放d它会让你知道。所以它似乎不是一个“最大郁闷状态”问题,因为当你按下这些字母时它可以处理所有4个。
现在,如果你按下j,k,l,i,然后再按d,放开它就不会让你知道按钮已被释放。所以似乎某些字母搞砸了。
我非常困惑,我非常感谢任何人愿意给予的任何帮助。
我的目标是能够检查按钮按下的任何组合,即使玩家一次按下所有按钮(翻转键盘并立即按下所有按钮)我希望能够检查它。
如果有人在windows api中有更好的方法,我可以提供建议
答案 0 :(得分:2)
这是键盘硬件的限制。一旦按下超过2个按键,受rollover支持有限的键盘通常会出现行为异常。
答案 1 :(得分:1)
GetKeyboardState或GetAsyncKeyState可能会更好运,但可能根本不可能。许多键盘不是为跟踪任意数量的同时按下的键而设计的。