2011-12-06 50 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但它可能根本不可能。許多鍵盤不是用來跟蹤任意數量的同時按下的按鍵。