TL; DR: вы можете использовать GetAsyncKeyState для проверки, не нажата ли клавиша в настоящее время , но для лучшего реагирования приложения на нажатия и отпускание клавиш вы хотите использовать код конвейера Win32 рядом сВнизу моего поста.
GetAsyncKeyState прекрасно работает для определения, является ли клавиша в данный момент нажатой, но с точки зрения определения, была ли клавиша нажата первойили выпустил и сколько раз это было сделано, GetAsyncKeyState пропускает нажатия клавиш в приложении, интенсивно использующем процессор, даже после сохранения предыдущего состояния ключа.
Это было то, что я пытался:
static const unsigned int NumberOfKeys = 256U;
bool previousKeyboardState[NumberOfKeys];
//Get the current state of each key as the application starts to ensure that keys held down beforehand are not processed as pressed keys.
for (unsigned int keyNum = 0U; keyNum < NumberOfKeys; ++keyNum)
{
previousKeyboardState[keyNum] = isKeyDown(keyNum);
}
//Works fine.
bool isKeyDown(int key)
{
return (GetAsyncKeyState(key) & (1 << 16));
}
//Misses key presses when application is bogged down.
bool isKeyFirstPressed(int key)
{
bool previousState = previousKeyboardState[key];
previousKeyboardState[key] = isKeyDown(key);
return (previousKeyboardState[key] && !previousState);
}
//Misses key releases when application is bogged down.
bool isKeyFirstReleased(int key)
{
bool previousState = previousKeyboardState[key];
previousKeyboardState[key] = isKeyDown(key);
return (!previousKeyboardState[key] && previousState);
}
//Example usage:
if (isKeyDown(VK_W))
{
//W key.
}
if (isKeyFirstReleased(VK_SNAPSHOT))
{
//Print screen.
}
GetKeyboardState также не годится, так как он не отслеживает количество нажатий или отпусканий клавиш.Как сказал в своем ответе Эрик Филипс, это небуферизованные решения, которые бесполезны, например, если вы пишете игру.Вам придется обрабатывать все нажатия клавиш быстрее, чем они получены.
Теперь мой код выше работает прилично хорошо и может подойти многим, но я предпочитаю не пропускать ни одного нажатия клавиши.Я ненавижу , используя приложения, которые не отвечают.Я думаю, что лучшее решение для приложений Win32 - перехватывать в конвейере сообщения WM_KEYDOWN и WM_KEYUP и обрабатывать их.Что приятно, так это то, что WM_KEYDOWN также предоставляет счетчик автоповтора, который может быть полезен для приложений, которые поддерживают ввод текста (например, чат, IDE и т. Д.).Это также добавляет небольшую сложность, о которой упоминается в документации WM_KEYDOWN:
Из-за функции автоповтора может быть отправлено более одного сообщения WM_KEYDOWN до публикации сообщения WM_KEYUP.Предыдущее состояние ключа (бит 30) можно использовать для определения того, указывает ли сообщение WM_KEYDOWN первый нисходящий или повторный нисходящий переход.
Существуют также комбинации клавиш Windows, на которые вы можете посмотреть, но ониболее сложны в использовании.Они хороши для получения глобальных нажатий клавиш.