【问题标题】:Key listener to exit loop only when program is on focus (c++)仅当程序处于焦点时才退出循环的键侦听器(C++)
【发布时间】:2015-06-23 03:48:57
【问题描述】:

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

当用户没有将我的程序放在焦点上并按下 ESC 键时会出现问题,GetAsyncKeyState 仍会返回按下 ESC 键并退出循环。

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

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

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

提前致谢!

【问题讨论】:

  • 因此,如果我理解正确,您会显示一个菜单,如果选择其中一个选项,将开始运行无限循环。然后你想让用户按下一个键来终止循环并将用户返回到主菜单?
  • @NathanOliver 是正确的。这已经可以工作了,问题是即使在用户做其他事情时按下了键,程序也会退出循环,而不是让我的程序处于焦点。
  • 在检查按下的键之前是否检查过windows is enabled
  • @nathan:你确定,你可以获得控制台程序的窗口句柄吗?
  • @MikeMB 当然。你可以使用GetConsoleWindow()

标签: c++ windows loops keylistener onfocus


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2014-03-14
    • 2012-04-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 2016-04-22
    相关资源
    最近更新 更多