我在快樂的MFC應用程序中使用GetAsyncKeyState
檢查,如果按下Esc鍵按鈕, 但是當我按下從對話框ESC鍵在不同的對話框中使用GetAsyncKeyState
它,因爲它的存在,則返回非零在消息隊列中。如何刷新或清除GetAsyncKeyState的緩衝區
如何清除或清除GetAsyncKeyState
的緩衝區或從消息隊列中刪除此消息? 在此先感謝。
我在快樂的MFC應用程序中使用GetAsyncKeyState
檢查,如果按下Esc鍵按鈕, 但是當我按下從對話框ESC鍵在不同的對話框中使用GetAsyncKeyState
它,因爲它的存在,則返回非零在消息隊列中。如何刷新或清除GetAsyncKeyState的緩衝區
如何清除或清除GetAsyncKeyState
的緩衝區或從消息隊列中刪除此消息? 在此先感謝。
在GetAsyncKeyState文檔,你可以閱讀:
如果最顯著位設置,關鍵是下,如果至少顯著位設置,關鍵是以前後按調用GetAsyncKeyState。
(重點煤礦)
所以要檢查ESC鍵,你應該只檢查最顯著位的當前狀態:
bool isEscPressed = GetAsyncKeyState(VK_ESCAPE) & 0x8000;
如果你檢查這樣的狀態:if (GetAsyncKeyState(VK_ESCAPE)) {}
那麼它就會進入if
即使ESC未被按下,也是如此。
直接回答你的問題將只是第二次調用它,從第一次丟棄的價值。
但我想,你真的想知道的是如何讀取的關鍵當前狀態,無論何時你最後一次檢查的。既然你寫了「返回非零」,我相信你沒有正確使用它。
您需要檢查值爲0x8000的位,因爲該位指示是否現在按。值爲1的位是如果自上次檢查以來按下該鍵時設置的那個位,並且這是一個讓您跳過的位,所以忽略它並直接測試值爲0x8000的位。
示例代碼:
if(GetKeyState(VK_RETURN) & 0x8000) yayReturnIsPressed();
檢查if(GetKeyState(VK_RETURN))
或if(GetKeyState(VK_RETURN) != 0
不會做你想做的,因爲如果任何在返回值位被設置它將會實現。
我正在使用'GetAsyncKeyState'裏面需要很多時間,當我使用(GetKeyState(VK_RETURN)&0x8000)它沒有工作的函數@CherryDT –
好吧,讓你是否想繼續使用「自上次檢查後被按下?」功能,但只是有辦法清除這個緩衝狀態?在這種情況下,就像我上面所說的那樣:調用該鍵的函數隱式清除緩衝區。 – CherryDT
它看起來像'GetKeyState'完全符合你的要求,來源:https://msdn.microsoft.com/en-us/library/windows/desktop/ms646301(v=vs.85).aspx –