2012-03-27 63 views
1

嘿,我有一個問題,我一直在尋找答案很長一段時間,我見過很多問題但都沒有解決我的問題。當使用GetAsyncKeyState()時,C++清除cin緩衝區

因此,我有一個函數,可以通過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」(不使用shift),那麼這個「s」似乎被存儲在cin緩衝區中,所有需要移動的是按「shift」進入Menu_4();

基本上輸入是從getline name請求和它搞砸了我的GetAsyncKeyState()調用。

感謝您的幫助。

回答

2

我想你是誤會GetAsyncKeyState

的行爲看GetAsyncKeyState

如果函數成功,返回值指定的關鍵 是否因爲對GetAsyncKeyState最後一次通話壓制,以及是否 鍵目前正在上升或下降。如果最顯著位被設置, 鍵被按下,如果至少顯著位設置,關鍵是 以前調用後按下GetAsyncKeyState

...

雖然 至少顯著返回值的位指示關鍵 自上次查詢按下,由於Windows的先發制人 多任務性質,其他應用程序可以調用 GetAsyncKeyState,並得到「最後按下」位,而不是 您的應用程序。 返回值的最低有效位的行爲嚴格保持與16位 Windows應用程序(非搶先性)的兼容性,並且不應該依賴 。

也許你想檢查當前狀態,而不是如果從上次調用按下鍵。

if(GetAsyncKeyState(VK_CONTROL) xor 0x1) 
.... 
+0

哦,我明白了,但爲什麼你有一個異或,那應該是什麼定義?謝謝 – user1143896 2012-03-27 13:16:45

+0

我明白了,我必須得到GetAsyncKeyState(VK_SHIFT)&0x8000,感謝您的幫助。 – user1143896 2012-03-27 13:22:03

+2

'xor 0x1'只是切換LSB,這是不正確的。還有:MS記錄了MSB和LSB,MS並沒有說出有關位之間的任何內容。因此,即使在未來API更改的情況下檢查「if(GetAsyncKeyState(...)&〜0x1)」也容易出錯。檢查'GetAsyncKeyState(...)&0x8000'是要走的路。 – 2012-03-27 16:00:31

1

你只是取得GetAsyncKeyState()的返回值,所以有效地做了if(GetAsyncKeyState() != 0)。該文件說

如果函數成功,返回值指定的關鍵 是否因爲對GetAsyncKeyState最後一次通話按壓, 鍵是否向上或向下。如果設置了最高有效位,則 鍵將關閉,如果設置了最低有效位,則在先前調用GetAsyncKeyState之後按鍵爲 。

因此,您目前檢查是否現在按鍵或者自上次調用GetAsyncKeyState以來按下了鍵。如果您只想檢查是否現在按下了鍵,那麼您必須檢查是否設置了返回值的最高位。