使用ReadConsoleInput时,为什么我会收到两次键盘事件?

时间:2014-03-27 00:09:29

标签: c++ winapi windows-console

好的,所以从这个主题开始,我想说我对编码比较新。话虽如此,如果问题太模糊不清楚,我道歉。

以下代码来自我为Win32制作的第一个真正的c ++程序。函数playerMove将玩家图标移动到屏幕上的新位置,同时用X替换旧点。

我不确定为什么,但每当我按任意键引起移动时,它会执行两次动作。我不确定我是否正在阅读输入缓冲区或者是什么,但我想知道是否有一个我错过的简单解释。我在每个案例的最后都包含FlushConsoleInputBuffer,以防出现问题,但似乎无法解决问题。

void playerMove()
{

    HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
    DWORD NumInputs = 0;
    DWORD InputsRead = 0;
    bool running = true;

    INPUT_RECORD irInput;

    GetNumberOfConsoleInputEvents(hInput, &NumInputs);

    while(running)
    {
        ReadConsoleInput(hInput, &irInput, 1, &InputsRead);
        //std::cout << irInput.Event.KeyEvent.wVirtualKeyCode << std::endl;

            HANDLE hStdout; 
            CONSOLE_SCREEN_BUFFER_INFO csbiInfo; 
            COORD coordDest; 

        switch(irInput.Event.KeyEvent.wVirtualKeyCode)
        {
            case M_KEY:
                FlushConsoleInputBuffer(hInput);
                displayMenu();                
                //Opens the menu
            break;

            case VK_LEFT:

            hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
            coordDest.X=xcoord;
            coordDest.Y=ycoord;
            SetConsoleCursorPosition(hStdout, coordDest);
            cout<<'X';
            coordDest.X=(xcoord-1);
            SetConsoleCursorPosition(hStdout, coordDest);
            SetColor(11);
            cout<<'@';
            SetColor(7);
            xcoord--;
            FlushConsoleInputBuffer(hInput);
            // move it left
            break;

        case VK_UP:

            hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
            coordDest.X=xcoord;
            coordDest.Y=ycoord;
            SetConsoleCursorPosition(hStdout, coordDest);
            cout<<'X';
            coordDest.Y=(ycoord-1);
            SetConsoleCursorPosition(hStdout, coordDest);
            SetColor(11);
            cout<<'@';
            SetColor(7);
            ycoord--;
            FlushConsoleInputBuffer(hInput);
            // move it up
            break;
        case VK_RIGHT:

            hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
            coordDest.X=xcoord;
            coordDest.Y=ycoord;
            SetConsoleCursorPosition(hStdout, coordDest);
            cout<<'X';
            coordDest.X=(xcoord+1);
            SetConsoleCursorPosition(hStdout, coordDest);
            SetColor(11);
            cout<<'@';
            SetColor(7);
            xcoord++;
            FlushConsoleInputBuffer(hInput);
            // move it right
            break;

        case VK_DOWN:

            hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
            coordDest.X=xcoord;
            coordDest.Y=ycoord;
            SetConsoleCursorPosition(hStdout, coordDest);
            cout<<'X';
            coordDest.Y=(ycoord+1);
            SetConsoleCursorPosition(hStdout, coordDest);
            SetColor(11);
            cout<<'@';
            SetColor(7);
            ycoord++;
            FlushConsoleInputBuffer(hInput);
            // move it down
            break;

        } 

    }
}

1 个答案:

答案 0 :(得分:1)

通过在switch语句之前添加if语句来检查是否按下了某个键(bKeyDown),它只会在按下键时通过首先检查键是否关闭来捕获该键。所以这个问题可以被视为已经回答了。