Асинхронный ввод с клавиатуры на win32

Я создаю простую 3D-игру для Windows 7 на C++, используя бесплатную версию физического движка Havok. Я хочу использовать клавиши WASD для перемещения персонажа. Структура кода такова, что мне нужно асинхронно захватить этот ввод; в каждом кадре сцены вызывается функция для обновления положения персонажа (я хочу попробовать проверить, нажата ли в данный момент клавиша, вместо того, чтобы использовать какой-либо прослушиватель событий). Я искал хорошее решение, так как почти ничего не знаю о функциях win32, и собрал это вместе:

if (GetAsyncKeyState(0x41) & 0x8000) posX=-1.0f; //A
if (GetAsyncKeyState(0x44) & 0x8000) posX=1.0f;  //D
if (GetAsyncKeyState(0x57) & 0x8000) posX=1.0f;  //W
if (GetAsyncKeyState(0x53) & 0x8000) posX=-1.0f; //S

После проверки некоторых операторов printf визуальный отладчик, похоже, не получает никаких входных данных. Я знаю о WM_KEYDOWN и WM_KEYUP, но не могу найти простых объяснений того, как их использовать, и, насколько я могу судить, они больше основаны на событиях, чем на асинхронности.

Есть ли проблема с приведенным выше фрагментом или мне следует попробовать другой подход?


person paperbd    schedule 06.07.2011    source источник
comment
& 0x8000 ‹ -- Для чего этот бит?   -  person MGZero    schedule 06.07.2011
comment
(ссылка) На этой странице написано что если установлен старший бит [КОРОТКОГО], ключ нажат. Итак, нужно проверить самый значащий бит.   -  person paperbd    schedule 06.07.2011
comment
Так разве вы не должны использовать == 0x8000? Я чувствую, что если вы пройдёте через это, вы обнаружите, что часть решения отбрасывает что-то.   -  person MGZero    schedule 06.07.2011
comment
Это должно работать, хотя будет сложно зарегистрировать какие-либо ключи при пошаговом выполнении в отладчике. В рабочем режиме это не работает?   -  person Ben Voigt    schedule 06.07.2011
comment
Это должно сработать. Более традиционный способ — if (GetAsyncKeyState('A') < 0)   -  person Hans Passant    schedule 06.07.2011
comment
Я более внимательно работаю со своим кодом и понимаю, что проблема может быть в другом месте, с использованием GetForegroundWindow(). Я написал этот код: HWND curWin = FindWindow(NULL,TEXT("HavokVisualDebugger")); if (GetForegroundWindow() != curWin) return;, и он, кажется, возвращается каждый раз, когда он запускается.   -  person paperbd    schedule 06.07.2011


Ответы (2)


Лучшее предположение: вы проверяете "A" вместо "a". Если, конечно, вы не удерживаете клавишу Shift, простое нажатие клавиши a не вызовет ваш код.

person Stefan    schedule 06.07.2011
comment
Нет, это виртуальные ключи. Между A и a нет разницы до WM_CHAR. - person Hans Passant; 06.07.2011

Похоже, моя проблема была не в GetAsyncKeyState(), а в использовании FindWindow() и GetWindowRect(). Он не распознавал, что текущее окно было визуальным отладчиком. Фиксированный.

person paperbd    schedule 07.07.2011