【问题标题】:Bring one application in front of another in Windows 10在 Windows 10 中将一个应用程序放在另一个应用程序前面
【发布时间】:2018-02-05 11:07:43
【问题描述】:

我有两个使用 Qt 运行的独立进程,我需要能够将一个放在另一个前面。他们都相互交流,所以你认为这不会是一个大问题。但是 Windows 10 对此特别严格。我所能做的就是让我想放在前面的窗口在窗口工具栏中闪烁橙色。

到目前为止我正在尝试使用的代码:

A 类(当前活跃):

AllowSetForegroundWindow(ASFW_ANY);

B班(我要带到前面的那个):

#ifdef WIN32
    if(hWnd)
    {
        SetForegroundWindow(hWnd);
        SetActiveWindow(hWnd);
        BringWindowToTop(hWnd);
    }
#endif

hWnd 较早获得(而 B 类是活动窗口):

hWnd = GetActiveWindow();

我是不是误会了什么?为什么这仍然不起作用?

【问题讨论】:

  • 这个 Qt 解决方法至少在 Windows 7 和 8.1 下对我有用 也许它在 Windows 10 下仍然有效。 this->setWindowState((this->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); this->setVisible(false); this->setVisible(true); this->setFocus(); BringWindowToTop((HWND)this->winId()); this 是 QWidget 的子类
  • AllowSetForegroundWindow 是否返回成功,在调用AllowSetForegroundWindow 和尝试激活进程 B 之间是否有用户输入(因为授予进程 B expires as soon as the user generates more input 的权限)?
  • @GSerg 我不知道 AllowSetForegroundWindow 在用户输入时到期。在通话之间确实有输入。这解决了问题:) 谢谢!
  • @AcerExtensa 你的代码似乎和我的一样。只要 AllowSetForegroundWindow 设置正确,它就可以工作。
  • @AcerExtensa 我要补充一点,与 GetActiveWindow() 相比,((HWND)this->winId() 是一种更优雅的获取 hwnd 的方法,因为后者仅在窗口处于当前处于活动状态,而前者随时可用。

标签: c++ windows qt windows-10


【解决方案1】:

如何始终将 Qt/Windows 小部件设置在顶部?

遇到了很多类似上述的问题,以下解决方案对我有用:

void widgetToTop(QWidget* widget)
{
    bool wasMax = widget->isMaximized();
    bool wasMin = widget->isMinimized();
    HWND h = (HWND)widget->winId();
    if (wasMax || wasMin)
    {
        ::ShowWindow(h, SW_SHOW);
        ::ShowWindow(h, wasMax ? SW_MAXIMIZE : SW_RESTORE);
        ::SetForegroundWindow(h);
    }
    else
    {
        ::ShowWindow(h, SW_SHOWNORMAL);
        ::SetForegroundWindow(h);
    }
}

这当然可以用纯 Win32 API 重新设计。

附:也许解决方案并不完全是“在另一个之上”,但可能就足够了。

【讨论】:

  • 如果两个窗口是同一进程的一部分,这将起作用。如果它们是单独的进程,就像我的情况一样,那么它只有在前台窗口专门允许另一个进程跳转到前台时才会起作用,并且(这是我的错误)这个权限只会持续到下一个用户输入。我相信这是在 Windows 10 中引入的,以阻止潜在的垃圾邮件弹出窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多