我编写了一个 C ++控制台程序,它显示了一个菜单,其中包含多个用户选项,其中一个进入连续循环,退出循环的条件是!GetAsyncKeyState(VK_ESCAPE)。因此,如果用户按下ESC,则在该循环的下一个开始时它将退出并且主菜单将再次显示。
问题发生在用户没有关注我的程序并按下ESC键时,GetAsyncKeyState仍会返回按下ESC键并且循环将退出。
如何只在我的节目处于焦点时才能实现一个只能听取ESC键的解决方案?
这对于编写c ++控制台程序的人来说非常有用,该程序在按下按键并且程序处于焦点时会有一个循环退出。
提前致谢!
答案 0 :(得分:1)
使用GetForegroundWindow解决问题并将其与Console窗口处理程序进行比较。示例代码如下。
使用IsWindowEnabled的@NathanOliver没有工作,因为如果为键盘和鼠标输入启用了窗口,它会返回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键按下的问题。