嘿伙计们,我有一个问题,我一直在寻找答案,我已经看到很多问题,但没有解决我的问题。
所以我有一个功能,可以使用这样的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()调用。
感谢您的帮助。
答案 0 :(得分:2)
我认为您误解了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后是否按下了键。如果您只想检查现在是否按下该键,则必须检查是否设置了返回值的最高位。