Часть кода:
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