首页 文章

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

提问于
浏览
1

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

所以我有一个功能,使用这样的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();

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

谢谢你的帮助 .

2 回答

  • 1

    我认为你误解了GetAsyncKeyState的行为

    GetAsyncKeyState

    如果函数成功,则返回值指定自上次调用GetAsyncKeyState以来是否按下了键,以及该键当前是向上还是向下 . 如果设置了最高有效位,则键为关闭,如果设置了最低有效位,则在前一次调用GetAsyncKeyState之后按下该键...虽然返回值的最低有效位表示该键是否已经自上次查询以来,由于Windows的先发制人的多任务性质,另一个应用程序可以调用GetAsyncKeyState并接收“最近按下”的位而不是您的应用程序 . 返回值的最低有效位的行为严格保留,以便与16位Windows应用程序(非抢占式)兼容,不应依赖它 .

    可能你想检查当前状态,如果从上次通话中按下了键 .

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

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

    如果函数成功,则返回值指定自上次调用GetAsyncKeyState以来是否按下了键,以及该键当前是向上还是向下 . 如果设置了最高有效位,则键为关闭,如果设置了最低有效位,则在上一次调用GetAsyncKeyState之后按下该键 .

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

相关问题