为什么我在使用ReadConsoleInput时接收每个键盘事件两次?

Why do I receive each keyboard event twice when using ReadConsoleInput?

本文关键字:事件 键盘 两次 ReadConsoleInput 为什么      更新时间:2023-10-16

好了,在开始这个话题之前,我想说的是,我是一个编码新手。话虽如此,如果这个问题太模糊了,我很抱歉。

下面的代码是从我的第一个真正的c++程序,我为Win32。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;
        } 
    }
}

通过添加if语句来检查是否在switch语句之前按下了键(bKeyDown),它只捕获键,因为它首先检查键是否按下。