2011-12-06 6 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を押します。これらのボタンのいずれかを放すと、あなたに知らせます

NOW 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

GetKeyboardStateまたはGetAsyncKeyStateで運がよいかもしれませんが、まったく不可能かもしれません。多くのキーボードは、同時に押された任意の数のキーを追跡するようには設計されていません。

関連する問題