【问题标题】:How do I clean input buffer before using getch()?如何在使用 getch() 之前清理输入缓冲区?
【发布时间】:2014-04-17 09:51:32
【问题描述】:

所以,我使用 GetAsyncKeyState() 来查看某个键何时被按下。但是,在使用它之后,我需要使用 getch()。但似乎 getch() 得到了 GetAsyncKeyState() 之前得到的任何东西。那是我的简化代码版本:

#include <graphics.h>

int main()
{
    initwindow(100, 100);

    while(true)
    {        
        if (GetAsyncKeyState(VK_RETURN))    //wait for user to press "Enter"
            break;
        //do other stuff
    }

    getch();    //this is just skipped

    return 0;
}

我想我需要在使用 getch() 之前清理输入缓冲区。但是怎么做? PS:GetAsyncKeyState() 对我来说是必须使用的,我还没有找到任何替代 getch() 的方法,它可以与 BGI 窗口一起使用并且可以解决问题。 希望得到一些建议,谢谢。

【问题讨论】:

    标签: c++ winapi getch bgi winbgi


    【解决方案1】:

    使用FlushConsoleInputBuffer

    FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
    

    【讨论】:

    • 我不知道我做错了什么,但它仍然跳过 getch。我正在使用 bgi 图形窗口的事实可以这样吗?谢谢你的回答。
    • @user3496846:可能。我对bgi图形不熟悉。我假设getch 与 WINAPI 中的相同,在这种情况下,这应该可以工作。显然不是。你想从getch 得到什么行为?您可以使用 WINAPI 函数完全模拟它。例如,从另一个问题中查看我的这个答案:stackoverflow.com/a/8177635/440119
    • 我想要做的是从键盘读取一个字符,而不需要激活控制台窗口(在我的情况下,BGI 窗口是活动的)。而且我不希望 char 成为现在正在发生的“Enter”键的代码。有没有办法用 WINAPI 函数读取字符?谢谢你的帮助。
    【解决方案2】:

    它正在跳过getch() 调用,因为用户按下了enter 以获取先前的输入,而getch 正在获取char,函数fflush(stdin) 我们刷新输入流。 这样getch() 就会从输入流中读取新的输入。

    #include <graphics.h>
    
    int main()
    {
        initwindow(100, 100);
    
        while(true)
        {        
            if (GetAsyncKeyState(VK_RETURN))    //wait for user to press "Enter"
                break;
            //do other stuff
        }
        fflush(stdin);
        getch();    //this is just skipped
    
        return 0;
    }
    

    【讨论】:

    • 对不起,但它似乎不起作用。即使我将 Sleep(1000) 放在 fflush 之前,应用程序仍然会跳过 getch。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    相关资源
    最近更新 更多