2011-12-06 85 views
0

我想使用Windows命令提示符编写DOS游戏。我有我的简化源代码在这里:Win32命令提示符输入缓冲区不捕捉按键

#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并放开d,它不会让您知道按钮已被释放。所以看起来某些字母搞砸了。

我很困惑,我非常感谢任何人愿意给予的帮助。

我的目标是能够检查按钮的任意组合,即使玩家一次按下所有按钮(将键盘翻转并一次按下所有按钮)我希望能够检查这一点。

如果有人在Windows API中做的更好的办法,我开放的建议

回答

2

这是您的键盘硬件的限制。支持有限rollover的键盘通常会在您每次按下2个以上的按键时开始行为异常。

+0

多数民众赞成在这种情况下,使用直接访问键盘硬件,我可以检测到任何按键。不同之处在于我想在windows体系结构中实现它 – Parad0x13

+0

看起来我的硬件有一个限制。谢谢你指出...... shucks ... – Parad0x13

1

你可能有更好的运气GetKeyboardStateGetAsyncKeyState但它可能根本不可能。许多键盘不是用来跟踪任意数量的同时按下的按键。