Windows键盘事件lParam感到困惑

时间:2019-03-28 10:23:41

标签: c++ windows winapi windows-messages

部分代码:

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种情况下,我都没有编写任何代码,反而将其注释掉了,发生了什么事?

顺便说一句,如果有人想看完整的代码,我正在看这个视频:

https://www.youtube.com/watch?v=J3y1x54vyIQ

0 个答案:

没有答案