【问题标题】:Determine if window is focused/Active/foreground确定窗口是否聚焦/活动/前景
【发布时间】:2013-12-16 10:59:01
【问题描述】:

我正在处理一个有多个窗口的项目。 当我按下回车键时,我想关闭活动窗口。

问题是所有的窗口都关闭了。我想检查窗口是聚焦/活动还是在前台,以便我可以更改焦点,使其不会关闭所有窗口。

当我运行代码时,我总是得到“我没有关闭”。过了一会儿,它们都关闭了。

if(GetFocus() == currentWindow->getHandler() || GetForegroundWindow() == currentWindow->getHandler() || GetActiveWindow() == currentWindow->getHandler() )
{                       
                std::cout << "Is the same";
                if(windows.front() != currentWindow)
                {
                    SetForegroundWindow(SetFocus(windows.front()->getHandler()));                                   
                    DeleteWindow(currentWindow)                     
                }
                else
                {
                    SetForegroundWindow(SetFocus(windows.back()->getHandler()));
                    DeleteWindow(currentWindow);
                }
            }
            else
            {
                std::cout << "I dont close!";
                DeleteWindow(currentWindow);
            }
            Sleep(500);
}

【问题讨论】:

  • 做一些调试。看看 out if 中的条件如何评估。这将告诉您为什么选择“我不关闭”分支。显然我们不能告诉你。打电话给Sleep 是为了什么?
  • 我使用了调试和焦点窗口的更改按我的计划进行,但所有窗口仍然关闭。睡眠是为了让我可以正常监控它。否则我每秒得到 50 次更改。在 DeleteWindow(currentWindow) 我只说 exit(1);有没有更好的关闭窗口的方法?

标签: c++ window focus


【解决方案1】:

对于像您这样具有多个窗口的应用程序,我遇到了类似的问题。我发现 GetForegroundWindow 将始终返回应用程序的顶级父窗口,而不是实际聚焦的窗口。此外,根据 MSDN,GetFocus 和 GetActiveWindow 返回 NULL,除非调用线程有窗口的消息队列(即它拥有窗口)。所以,这可能就是你的检查都不起作用的原因。

你试过GetGUIThreadInfo吗? hwndFocus 成员持有具有键盘焦点的窗口。该函数对调用线程或窗口所有权没有任何限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2011-04-25
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    相关资源
    最近更新 更多