Событие нажатия клавиш в C ++ - PullRequest
1 голос
/ 02 апреля 2011

В настоящее время я использую GetAsyncKeyState() для обнаружения событий Keydown, но затем эти события будут повторяться, пока вы удерживаете нажатой клавишу.

Какой простой способ остановить повторение события?


Пример

Если я удержу некоторое время клавишу i на клавиатуре, я получу вывод, подобный этому:

iiiiiiiiiiiiiiiiiiiiiiiii

Вместо этого:

i


Я хочу заставить пользователя снова нажать клавишу, чтобы вызвать событие.

Ответы [ 2 ]

2 голосов
/ 02 апреля 2011

Избегайте использования сообщений, связанных с клавиатурой, таких как WM_KEYDOWN или WM_CHAR, для обнаружения клавиши, Windows повторяет WM_KEYDOWN, когда пользователь удерживает ее нажатой.Вам просто нужен собственный флаг bool, который отслеживает состояние ключа.Изменяйте состояние игрового объекта только тогда, когда вы видите разницу между состоянием, сообщаемым GetAsyncKeyState (), и этим флагом.Примерно:

bool movingLeft = false;
...
if ((GetAsyncKeyState(VK_LEFT) < 0) != movingLeft) {
    movingLeft = !movingLeft;
    gameObject->setVelocity(movingLeft ? -10 : 0);
}
1 голос
/ 02 апреля 2011

Использовать события KeyPress (или KeyUp).

Кстати в соответствии с MSDN SHORT WINAPI GetAsyncKeyState (__ в int vKey);

Определяет, является ли ключвверх или вниз во время вызова функции и от того, была ли нажата клавиша после предыдущего вызова GetAsyncKeyState.

Это ничего не говорит об обнаружении события нажатия клавиши.

...