Я написал Консольная программа на C ++ это отображает меню с несколькими опциями для пользователя, один из которых входит в непрерывный цикл, и условие для выхода из цикла: GetAsyncKeyState (VK_ESCAPE). Таким образом, если пользователь нажимает ESC, при следующем запуске этого цикла он выйдет и главное меню отобразится снова.
Проблема возникает, когда пользователь не имеет моей программы в фокусе и нажимает клавишу ESC, GetAsyncKeyState по-прежнему будет возвращать, что клавиша ESC была нажата, и цикл завершится.
Как я могу реализовать решение, которое будет прослушивать клавишу ESC, только когда моя программа находится в фокусе?
Это может быть полезно всем, кто написал бы консольную программу на С ++, которая имеет цикл, который завершается, когда нажата клавиша и программа находится в фокусе.
Заранее спасибо!
Проблема была решена с помощью 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, когда окна находятся в фокусе.