4
我有一個C++(MFC)應用程序,需要檢查定時器上的keystate。如果用戶按住一個鍵,我們會延遲處理一些代碼。數字鍵盤按鍵事件導致從GetKeyboardState卡住的鍵
這裏是爲檢查:
if (!GetKeyboardState(keyState))
{
s_executeDeferredResult = e_executeDeferredButtonCheckFailed;
return;
}
s_executeDeferredStuckKeys.clear();
for (int index=0; index<arrsize(keyState); ++index)
{
if (keyState[index] & 0x80)
{
s_executeDeferredStuckKeys.insert(index);
}
}
if (!s_executeDeferredStuckKeys.empty())
{
s_executeDeferredResult = e_executeDeferredButtonsActive;
return;
}
但是,也有卡住的一些關鍵連擊:
- 打開NUMLOCK
- 按SHIFT
- 按NumPad8
- 發佈SHIFT
- 發佈NUMPAD8
(這是一個例子,還有其他的,包括CTRL了一個謊言 - ALT - DEL)
GetKeyboardState
現在將報告VK_UP
被按下。
發生的事件是(對應於上述操作)。
<None>
WM_KEYDOWN
,VK_SHIFT
WM_KEYUP
,VK_SHIFT
WM_KEYDOWN
,VK_UP
WM_KEYDOWN
,VK_SHIFT
WM_KEYUP
,VK_SHIFT
WM_KEYUP
,VK_NUMPAD8
因此,Windows不承認,向上鍵上來,現在GetKeyboardState
被打破。
有沒有什麼好的方法來檢查密鑰的真實狀態? GetAsyncKeyState
和GetKeyState
都報告說關鍵也是關閉的。
您是否嘗試過與其他鍵盤? –
是的,它發生在我們嘗試過的所有鍵盤上。 – StilesCrisis
由於這是一個MFC應用程序,請務必檢查您的'PreTranslateMessage'實現。這就是各種各樣的壞事隨着時間積累的地方。還要注意['GetKeyboardState'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms646299.aspx)文檔中的註釋:*「狀態隨線程移除鍵盤消息它的消息隊列。「換句話說:如果你的應用程序做了一些可怕的事情,那麼'GetKeyboardState'可能會變得混亂。 – IInspectable