仅当程序处于焦点时退出循环的关键侦听器(c ++)
Key listener to exit loop only when program is on focus (c++)
我写了一个 C++ 控制台程序,它为用户显示一个带有多个选项的菜单,其中一个进入连续循环,退出循环的条件是 !GetAsyncKeyState (VK_ESCAPE)。因此,如果用户按下 ESC,在下一次循环开始时,它将退出并再次显示主菜单。
当用户没有让我的程序处于焦点状态并按下 ESC 键时,就会出现问题,GetAsyncKeyState 仍将 return 按下 ESC 键并退出循环。
如何实现仅在我的程序处于焦点时才监听 ESC 键的解决方案?
- 我不能使用 getline、getch 或任何行输入法,因为我会有循环 运行,而且我不能在每次迭代时都要求用户输入。
- 解决方案可能取决于平台,因为这只会 运行 Windows。
- 我必须坚持使用 C++,因为我使用的库唯一 "usable" 实现是 C++ 版本。
这可能对任何其他编写 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 键按下的问题。
我写了一个 C++ 控制台程序,它为用户显示一个带有多个选项的菜单,其中一个进入连续循环,退出循环的条件是 !GetAsyncKeyState (VK_ESCAPE)。因此,如果用户按下 ESC,在下一次循环开始时,它将退出并再次显示主菜单。
当用户没有让我的程序处于焦点状态并按下 ESC 键时,就会出现问题,GetAsyncKeyState 仍将 return 按下 ESC 键并退出循环。
如何实现仅在我的程序处于焦点时才监听 ESC 键的解决方案?
- 我不能使用 getline、getch 或任何行输入法,因为我会有循环 运行,而且我不能在每次迭代时都要求用户输入。
- 解决方案可能取决于平台,因为这只会 运行 Windows。
- 我必须坚持使用 C++,因为我使用的库唯一 "usable" 实现是 C++ 版本。
这可能对任何其他编写 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 键按下的问题。