GetKeyState() против GetAsyncKeyState() против getch()?

В чем разница между нажатием клавиши:

  • GetKeyState()
  • GetAsyncKeyState()
  • getch()?

Когда я должен использовать один над другим?

Ответ 1

GetKeyState() и GetAsyncKeyState() являются специфичными для Windows API, а getch() работает с другими компиляторами, не связанными с Windows.

GetKeyState() получает статус ключа, возвращенный из очереди сообщений потока. Состояние не отражает состояние уровня прерывания, связанного с оборудованием.

GetAsyncKeyState() указывает, был ли нажат ключ с момента последнего вызова GetAsyncKeyState(), и будет ли текущий ключ вверх или вниз. Если установлен самый старший бит, клавиша опущена, и если установлен младший значащий бит, клавиша была нажата после предыдущего вызова GetAsyncKeyState().

То, что я видел на практике, состоит в том, что если вы удерживаете нажатой клавишу и назначаете поведение при нажатии клавиши, если вы используете GetKeyState(), поведение будет вызываться больше раз, чем если бы вы использовали GetAsyncKeyState().

В играх я предпочитаю использовать GetAsyncKeyState().

(Вы также можете проверить дополнительную информацию в блоге MSDN).

Ответ 2

Подумайте, что означает асинхронность.

  • GetAsyncKeyState() получает состояние ключа в асинхронном режиме, то есть без ожидания чего-либо, т.е. сЕЙЧАС.

  • GetKeyState() получает состояние ключа синхронно, это состояние ключа ключа, который вы собираетесь прочитать с помощью getch(). Он ставится в очередь в буфере клавиатуры вместе с самими клавишами.

В качестве примера представьте, что было напечатано следующее, но еще не прочитано:

  • h
  • i
  • shift + 1
  • ctrl (удерживается)

GetAsyncKeyState() вернет ctrl pressed

GetKeyState() will return H нажал until you call getch() '

GetKeyState() будет возвращать I pressed, пока вы не позвоните getch()

Затем GetKeyState() будет возвращать shift pressed, 1 pressed до тех пор, пока вы не вызовете getch(), что вернет ! (результат нажатия shift + 1)

GetKeyState() вернется ctrl pressed