部分代码:
LRESULT CALLBACK WindowProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam)
{ ...
switch(uMsg)
{ ...
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
case WM_KEYDOWN:
case WM_KEYUP:
{
uint8_t VKCODE = wParam;
bool WasDown = ((lParam & (1<<30)) != 0);
bool IsDown = ((lParam & (1<<31)) == 0);
if(WasDown != IsDown)
{
if(VKCode == 'W')
{
OutputDebugStringA("W: ");
if(WasDown)
{
OutputDebugStringA("WasDown ");
}
if(IsDown)
{
OutputDebugStringA("IsDown ");
}
OutputDebugStringA("\n");
}
else if(VKCode == 'A')
{
OutputDebugStringA("A\n");
}
...
}
} break;
...
}
...
}
1)首先,当我按“ A”时,将始终输出2个“ A”。
2)其次,根据此页面: https://docs.microsoft.com/en-us/windows/desktop/inputdev/wm-keyup
30上一个键状态。对于WM_KEYUP消息,该值始终为1。
31过渡状态。对于WM_KEYUP消息,该值始终为1。
然后(lParam&(1 << 31))始终为非零,因此IsDown始终为false,但是当我按下(按下并释放)“ W”时,它将输出:
IsDown
WasDown
如果bool IsDown始终为false,为什么会输出“ IsDown”?
3)如果我在WM_KEYUP之前这样注释掉3个案例:
// case WM_SYSKEYDOWN:
// case WM_SYSKEYUP:
// case WM_KEYDOWN:
然后,当我按'A'时只会输出一个'A',当我按'W'时只会输出“ WasDown”,从不输出“ IsDown”。在之前的3种情况下,我都没有编写任何代码,反而将其注释掉了,发生了什么事?
顺便说一句,如果有人想看完整的代码,我正在看这个视频: