2016-04-26 256 views
1

我在快樂的MFC應用程序中使用GetAsyncKeyState檢查,如果按下Esc鍵按鈕, 但是當我按下從對話框ESC鍵在不同的對話框中使用GetAsyncKeyState它,因爲它的存在,則返回非零在消息隊列中。如何刷新或清除GetAsyncKeyState的緩衝區

如何清除或清除GetAsyncKeyState的緩衝區或從消息隊列中刪除此消息? 在此先感謝。

+0

它看起來像'GetKeyState'完全符合你的要求,來源:https://msdn.microsoft.com/en-us/library/windows/desktop/ms646301(v=vs.85).aspx –

回答

2

GetAsyncKeyState文檔,你可以閱讀:

如果最顯著位設置,關鍵是下,如果至少顯著位設置,關鍵是以前後按調用GetAsyncKeyState。

(重點煤礦)

所以要檢查ESC鍵,你應該只檢查最顯著位的當前狀態:

bool isEscPressed = GetAsyncKeyState(VK_ESCAPE) & 0x8000; 

如果你檢查這樣的狀態:if (GetAsyncKeyState(VK_ESCAPE)) {}那麼它就會進入if即使ESC未被按下,也是如此。

+0

我是使用'這需要花費大量的時間,當我使用 (函數GetKeyState(VK_RETURN)爲0x8000) 沒有工作@MarcinJędrzejewski –

+0

@AmirYouhana然後不使用函數GetKeyState但GetAsyncKeyState, – marcinj

+0

@AmirYouhana對不起,我一個函數內部GetAsyncKeyState'錯誤使用GetKeyState在我的答案,而不是GetAsyncKeyState – marcinj

1

直接回答你的問題將只是第二次調用它,從第一次丟棄的價值。

但我想,你真的想知道的是如何讀取的關鍵當前狀態,無論何時你最後一次檢查的。既然你寫了「返回非零」,我相信你沒有正確使用它。

您需要檢查值爲0x8000的位,因爲該位指示是否現在按。值爲1的位是如果自上次檢查以來按下該鍵時設置的那個位,並且這是一個讓您跳過的位,所以忽略它並直接測試值爲0x8000的位。

示例代碼:

if(GetKeyState(VK_RETURN) & 0x8000) yayReturnIsPressed(); 

檢查if(GetKeyState(VK_RETURN))if(GetKeyState(VK_RETURN) != 0不會做你想做的,因爲如果任何在返回值位被設置它將會實現。

+0

我正在使用'GetAsyncKeyState'裏面需要很多時間,當我使用(GetKeyState(VK_RETURN)&0x8000)它沒有工作的函數@CherryDT –

+0

好吧,讓你是否想繼續使用「自上次檢查後被按下?」功能,但只是有辦法清除這個緩衝狀態?在這種情況下,就像我上面所說的那樣:調用該鍵的函數隱式清除緩衝區。 – CherryDT