使用GetAsyncKeyState()时,C++正在清除cin缓冲区

C++ clearing cin buffer when using GetAsyncKeyState()

本文关键字:清除 cin 缓冲区 C++ GetAsyncKeyState 使用      更新时间:2023-10-16

嘿,伙计们,我有一个问题一直在寻找答案,我看到了很多类似的问题,但没有一个能解决我的问题。

所以我有一个函数,用get line抓取玩家的名字,如下所示。

std::cout << "Enter your name"<< std::endl;
std::string input;
std::getline(std::cin, input);

然后我有一个功能,它有一个菜单,告诉用户他可以按一系列键来转到菜单的其他部分。

while(true)
{
        //menu one
        if(GetAsyncKeyState(VK_CONTROL))
        {
            Menu_3();
        }
        //here is the problem
        if(GetAsyncKeyState(VK_SHIFT) && GetAsyncKeyState(0x53)) //0X53 = S
        {
            Menu_4();
        }
}

我的问题是,如果我使用一个带有大写字母的名称(用SHIFT创建),并且在输入名称后会自动调用's'allMenu4(),例如名称"Shawn"。如果我只有一个像"shawn"这样的名字(不使用shift),那么"s"似乎被存储在cin缓冲区中,并且只需要按"shift"进入Menu4();

基本上,输入是从getline名称请求和它搞砸了我的GetAsyncKeyState()调用中转移过来的。

谢谢你的帮助。

我认为您误解了GetAsyncKeyState 的行为

请参阅GetAsyncKeyState

如果函数成功,则返回值指定键自上次调用GetAsyncKeyState以来被按下,并且键当前是向上还是向下。如果设置了最高有效位键按下,如果设置了最低有效位,则键为在上一次调用GetAsyncKeyState 后按下

尽管返回值的最低有效位指示密钥由于先发制人,自上次查询以来一直被按下Windows的多任务特性,另一个应用程序可以调用GetAsyncKeyState并接收"最近按下"的位,而不是您的申请。的最低有效位的行为为了与16位兼容,返回值被严格保留Windows应用程序(非抢占式)依赖。

也许你想检查当前状态,而不是上次通话时按下的键。

if(GetAsyncKeyState(VK_CONTROL) xor 0x1)
....

您只需要获取GetAsyncKeyState()的返回值,就可以有效地执行if(GetAsyncKeyState() != 0)。医生说

如果函数成功,则返回值指定键自上次调用GetAsyncKeyState以来被按下,并且键当前是向上还是向下。如果设置了最高有效位键按下,如果设置了最低有效位,则键为在上一次调用GetAsyncKeyState后按下。

因此,您当前检查该键是现在按下的,还是自上次调用GetAsyncKeyState以来按下的。如果你现在只想检查是否按下了键,那么你必须检查是否设置了返回值的最高有效位。