仅当程序处于焦点时退出循环的关键侦听器(c ++)

Key listener to exit loop only when program is on focus (c++)

我写了一个 C++ 控制台程序,它为用户显示一个带有多个选项的菜单,其中一个进入连续循环,退出循环的条件是 !GetAsyncKeyState (VK_ESCAPE)。因此,如果用户按下 ESC,在下一次循环开始时,它将退出并再次显示主菜单。

当用户没有让我的程序处于焦点状态并按下 ESC 键时,就会出现问题,GetAsyncKeyState 仍将 return 按下 ESC 键并退出循环。

如何实现仅在我的程序处于焦点时才监听 ESC 键的解决方案?

这可能对任何其他编写 C++ 控制台程序的人都有用,该程序有一个循环,当按下一个键并且程序处于焦点时退出。

提前致谢!

使用 GetForegroundWindow 并将其与控制台 window 处理程序进行比较解决了问题。下面的示例代码。

@NathanOliver 使用 IsWindowEnabled 不起作用,因为如果为键盘和鼠标输入启用 window,它 return 为真,即使它被最小化也是如此。 我也尝试了 IsWindowVisible,两者一起使用,但它也没有用,即使我在其他 windows 上工作,它仍在捕获 ESC 输入。 但是感谢您的输入,在研究其他一些相关方法时,我遇到了 GetForegroundWindow() ,它 return 是用户当前正在处理的 window 的处理程序,然后我只需要将它与我如上所述使用 GetConsoleWIndow() 检索的控制台 window 处理程序,然后如果此条件为真以及 GetKeyState(VK_ESC) 循环将退出!

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

Obs:在检查前景之前检查是否按下 ESC 键非常重要 window,因为如果在最后一次按下该键后 GetAsyncKeyState 将 return 为真这个函数被调用了,如果你先检查当前的 window,那么在下一次你把 window 放在前景。在 window 未聚焦时检查它以确保您清除 ESC 键按下。

此解决方案解决了在 windows 处于焦点上时只听 ESC 键按下的问题。