windows — ключевой слушатель для выхода из цикла, только когда программа находится в фокусе (c ++)

Я написал Консольная программа на C ++ это отображает меню с несколькими опциями для пользователя, один из которых входит в непрерывный цикл, и условие для выхода из цикла: GetAsyncKeyState (VK_ESCAPE). Таким образом, если пользователь нажимает ESC, при следующем запуске этого цикла он выйдет и главное меню отобразится снова.

Проблема возникает, когда пользователь не имеет моей программы в фокусе и нажимает клавишу ESC, GetAsyncKeyState по-прежнему будет возвращать, что клавиша ESC была нажата, и цикл завершится.

Как я могу реализовать решение, которое будет прослушивать клавишу ESC, только когда моя программа находится в фокусе?

  • Я не могу использовать getline, getch или любые методы ввода строки, потому что у меня будет запущен цикл, и я не могу запрашивать ввод данных пользователем на каждой итерации.
  • Решение может зависеть от платформы, так как оно будет работать только в Windows.
  • Я должен придерживаться C ++, потому что я использую библиотеку, единственная «полезная» реализация — это версия C ++.

Это может быть полезно всем, кто написал бы консольную программу на С ++, которая имеет цикл, который завершается, когда нажата клавиша и программа находится в фокусе.

Заранее спасибо!

4

Решение

Проблема была решена с помощью GetForegroundWindow и сравнения его с обработчиком окна консоли. Пример кода ниже.

@NathanOliver, использующий IsWindowEnabled, не работал, потому что он возвращает значение true, если окно включено для ввода с клавиатуры и мыши, и даже если оно свернуто.
Я также попробовал IsWindowVisible, и оба вместе, и он тоже не работал, он все еще захватывал ввод ESC, даже когда я работал над другими окнами.
Но благодаря вашему вкладу, при исследовании некоторых других связанных методов, я наткнулся на GetForegroundWindow (), который возвращает обработчик для текущего окна, над которым работает пользователь, затем мне просто нужно было сравнить его с обработчиком окон консоли, который я получил с помощью GetConsoleWIndow ( ), как вы упомянули выше, то если бы это условие было истинным, как и GetKeyState (VK_ESC), цикл завершился бы!

HWND hWnd = GetConsoleWIndow();
boolean leaveAuto = false;
while(!leaveAuto) {
...
leaveAuto = (GetAsyncKeyState(VK_ESCAPE) && (GetForegroundWindow() == hWnd));
}

Obs: очень важно, чтобы вы проверяли, была ли нажата клавиша ESC, прежде чем проверять окно переднего плана, потому что GetAsyncKeyState вернет true, если клавиша была нажата после последнего вызова этой функции, и если вы сначала проверяете текущее окно , нажатие клавиши ESC, которое произошло в другом окне некоторое время назад, выйдет из цикла при следующем выводе окна на передний план. Проверка перед этим гарантирует, что вы чистите нажатия клавиш ESC, когда окно не было в фокусе.

Это решение решает вопрос только прослушивания нажатия клавиши ESC, когда окна находятся в фокусе.

1

Другие решения


По вопросам рекламы [email protected]