2011-12-11 86 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這是否準確?這似乎沒有任何幫助。 –