gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:23:55 27 4
gpt4 key购买 nike

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

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

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

  • 我不能使用 getline、getch 或任何行输入方法,因为我将运行循环并且我不能在每次迭代时都要求用户输入。
  • 解决方案可以依赖于平台,因为它只能在 Windows 上运行。
  • 我必须坚持使用 C++,因为我使用的库唯一“可用”的实现是 C++ 版本。

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

提前致谢!

最佳答案

问题是使用 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 键按下的问题。

关于c++ - 仅当程序处于焦点时退出循环的关键监听器(c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29679790/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com