Смущает событие клавиатуры Windows lParam - PullRequest
0 голосов
/ 28 марта 2019

Часть кода:

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 Предыдущее состояние ключа.Значение всегда равно 1 для сообщения WM_KEYUP.

31 Состояние перехода.Для сообщения WM_KEYUP значение всегда равно 1.

, тогда (lParam & (1 << 31)) всегда будет отличным от нуля, поэтому IsDown всегда будет ложным, но когда я нажимаю (нажимаюи отпустите) 'W', он выведет: </p>

IsDown
WasDown

Как получится, что он выведет "IsDown", если bool IsDown всегда ложно?

3) Если язакомментируйте 3 случая перед WM_KEYUP следующим образом:

// case WM_SYSKEYDOWN:
// case WM_SYSKEYUP:
// case WM_KEYDOWN:

тогда, когда я нажимаю 'A', будет выводиться только один 'A', когда я нажимаю 'W', будет выводиться только "WasDown", но не "IsDown",Я не писал никакого кода в предыдущих 3 случаях, прежде чем закомментировать их, что случилось?

Кстати, я слежу за этим видео, если кто-то хочет увидеть полный код:

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

...