タイマーでキーステートをチェックする必要がある C++ (MFC) アプリがあります。ユーザーがキーを押している場合、一部のコードの処理を遅らせます。
のチェックは次のkeydown
とおりです。
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ます。ALTDEL
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 は Up キーが上がったことを認識せず、現在GetKeyboardState
は壊れています。
キーの実際の状態を確認する良い方法はありますか? GetAsyncKeyState
どちらも、キーもダウンしているとGetKeyState
報告しています。