2011-12-11 45 views
4

我目前正在为学校创建一个控制台游戏,而我在使用GetAsyncKeyState时遇到了麻烦,无法使用我的主菜单。我的主菜单运行在一个无限循环中,只有当一个按键被按下时才会断开。例如我有:GetAsyncKeyState用cin创建问题

if(GetAsyncKeyState('1')) 
{ 
    Play(); 
    break; 
} 

这个,单独工作正常。问题是在我的Play()方法中,我有一个cin语句,并且Menu()中的'1'进入我的Play()。我尝试过cin.clear()无效,并且cin.ignore(...)阻止了从Menu()到Play()的即时更改。有什么办法可以防止这种情况发生?在调用之前

+0

用户在'1'键上有她的胳膊肘。当你要求输入时,你希望显示什么?仔细想想,你不能两面都有。 –

+0

请注意,您正在错误地检查'GetAsyncKeyState'的返回值。但是这里的问题是,在用户放开* 1键之前,你的程序正在超前。在退出菜单之前,您可能应该等到释放按键。 –

+0

即使您的应用程序没有焦点,“GetAsyncKeyState”也会读取键盘状态。您可能想要使用'GetNumberOfConsoleInputEvents'和'ReadConsoleInput'(或旧的conio.h接口)来只读取控制台输入。 – alexisdm

回答

3

尝试使用此方法Play()

此外,当你使用GetAsyncKeyState,你应该屏蔽掉一切,但高位,像这样:

if ((GetAsyncKeyState('1') & 0x8000) != 0) 

查看文档根据'返回值'理解为什么:http://msdn.microsoft.com/en-us/library/windows/desktop/ms646293%28v=vs.85%29.aspx

+0

这对'GetAsyncKeyState'没有影响。 –

+0

@RaymondChen:当我尝试下面的代码时:http://ideone.com/fAMby当循环完成时,我按下的所有按键的字符都会流到标准输入,包括1.但是有以下修正:http ://ideone.com/lJyKY循环后控制台是空的。那么,你在说什么? –

+0

@RaymondChen:同时,应用您的建议:http://ideone.com/NtetV这是否准确?这似乎没有任何帮助。 –