Win32命令提示输入缓冲区没有捕获按键

时间:2011-12-06 22:00:35

标签: windows key buffer

我正在尝试使用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中有更好的方法,我可以提供建议

2 个答案:

答案 0 :(得分:2)

这是键盘硬件的限制。一旦按下超过2个按键,受rollover支持有限的键盘通常会出现行为异常。

答案 1 :(得分:1)

GetKeyboardStateGetAsyncKeyState可能会更好运,但可能根本不可能。许多键盘不是为跟踪任意数量的同时按下的键而设计的。