使用GetAsyncKeyState()时,C++正在清除cin缓冲区
C++ clearing cin buffer when using GetAsyncKeyState()
嘿,伙计们,我有一个问题一直在寻找答案,我看到了很多类似的问题,但没有一个能解决我的问题。
所以我有一个函数,用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以来按下的。如果你现在只想检查是否按下了键,那么你必须检查是否设置了返回值的最高有效位。
- C++中的cin.ignore()函数不适用于整个流
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- Problems with std::cin.fail()
- 清除前检查矢量
- 由cin中的字符串中未捕获空白引起的分割错误
- 在C++中使用Cin,我如何在1行中输入
- ifstream文件在从行中读取时被清除
- std::cin 在读取 EOF 并清除后不再读取
- 在C 中清除CIN
- cin.clear() 如何清除输入缓冲区
- 如何清除cin读取的内容
- 检查C++字符串中的整数:已修订:清除 cin
- 为什么我的编译器在尝试清除 CIN 缓冲区时抱怨
- 当用户输入错误输入时,一次清除 cin 中的整行而不是一个字符
- 使用GetAsyncKeyState()时,C++正在清除cin缓冲区
- cin.ignore(INT_MAX)正在清除所有内容
- 不停止,清除cin创建无限循环
- 使用cin对象进行输入验证并清除缓冲区(c++)
- 检查输入的值是否为float,清除cin
- 如何从cin中清除无关字符