2013-03-01 165 views
0

我使用win7 64bit。 我使用GetKeyboardState()來獲取鍵盤狀態。GetKeyboardState返回錯誤結果

BYTE keyState[256]; 
GetKeyboardState(keyState); 
BOOL leftButtonClicked = GetKeyState(VK_LBUTTON); 

如果單擊主WND內,每一件事情是確定的,但如果單擊主WND外,該leftButtonClicked仍然是正確的。

的MSDN說,

應用程序可以調用這個函數來獲取所有的虛擬鍵的當前狀態。狀態隨着線程從其消息隊列中移除鍵盤消息而改變。當鍵盤消息被髮布到線程的消息隊列時,狀態不會改變,也不會隨着鍵盤消息被髮布到其他線程的消息隊列或從其他線程的消息隊列中檢索到而改變。

但主要WND沒有收到WM_LBUTTONDOWN,那麼,爲什麼這個函數得到錯誤的結果呢? 還是我誤解了一些東西?

謝謝。

+0

這不是「錯誤的結果」,它是「你沒有檢查鼠標的位置」 - 當你的窗口內發生的事情你只能得到VM_LBUTTONDOWN。但GetKeyState是通用的 - 它告訴你在提問時的狀態,它與你的窗口是否相關取決於你的應用程序來確定。 – 2013-03-01 16:00:19

+1

我很困惑。你永遠不會看GetKeyboardState的結果。 – 2013-03-04 01:28:57

回答

2

GetKeyboardState和GetKeyState返回緩衝的狀態的鍵盤和鼠標。當最後一個輸入事件輸入消息隊列時存儲。一個重要的特徵是,如果程序沒有泵送消息,消息可以保留在隊列中一段時間​​。

當您在窗口外單擊時,生成的輸入事件將轉到與您單擊的窗口關聯的任何隊列。不是你的程序隊列。因此,鍵盤狀態不會改變。

您將需要使用GetAsyncKeyState()來獲取當前狀態。