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

时间:2012-03-27 12:58:40

标签: c++ getline

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

所以我有一个功能,可以使用这样的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',我输入名称后会自动调用Menu_4(),示例名称为“Shawn”。如果我只有这样的名字“shawn”(不使用shift)那么“s”似乎存储在cin缓冲区中,所有需要继续前进的是按“shift”进入Menu_4(); < / p>

基本上,输入是从getline名称请求转移并且搞砸了我的GetAsyncKeyState()调用。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我认为您误解了GetAsyncKeyState的行为

请参阅GetAsyncKeyState

  

如果函数成功,则返回值指定是否为键   自上次调用GetAsyncKeyState以来是否被按下,以及是否   密钥当前上升或下降。如果设置了最高位,则   key为down,如果设置了最低有效位,则键为   在上一次调用GetAsyncKeyState之后按下

     

...

     虽然如此   返回值的最低有效位表示是否为密钥   自上次查询以来,由于先发制人,已被按下   Windows的多任务性质,另一个应用程序可以调用   GetAsyncKeyState并接收“最近按下”位而不是   你的申请。最不重要的一点的行为   为了与16位兼容,严格保留返回值   Windows应用程序(非抢占式)并不应该   依靠。

可能你想检查当前状态,如果上次通话时按下键,则不会。

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

答案 1 :(得分:1)

您只是获取GetAsyncKeyState()的返回值,因此有效地执行if(GetAsyncKeyState() != 0)。文档说

  

如果函数成功,则返回值指定是否为键   自上次调用GetAsyncKeyState以来是否被按下,以及是否   密钥当前上升或下降。如果设置了最高位,则   key为down,如果设置了最低有效位,则键为   在上一次调用GetAsyncKeyState之后按下。

因此,您当前检查是否现在按下了键,或者自上次调用GetAsyncKeyState后是否按下了键。如果您只想检查现在是否按下该键,则必须检查是否设置了返回值的最高位。