我有一个需要检查计时器上的键状态的 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- ALT-的doozy 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 无法识别 Up 键出现,现在GetKeyboardState
已损坏。
有什么好方法可以检查密钥的真实状态吗?GetAsyncKeyState
并且GetKeyState
两者都报告密钥也已关闭。