【问题标题】:Need to bring application to foreground on Windows需要在 Windows 上将应用程序置于前台
【发布时间】:2010-09-17 06:42:11
【问题描述】:

我有两个正在 Windows 上使用 Qt 开发的应用程序。我希望用户能够在一个应用程序中按下一个按钮,从而使另一个应用程序进入前台。 (程序使用 QLocalSocket 和命名管道进行通信。)

目前我正在使用 Qt 的 QWidget::activateWindow(),它偶尔会将应用程序带到前台,但大多数时候它只是突出显示任务栏上的程序。

有人可以告诉我如何做到这一点,最好使用 Qt,尽管使用 WIN32 API 会很好。


不幸的是,我找不到仅使用 Qt 的方法。我使用 Chris Becke 从当前活动的应用程序调用 SetForegroundWindow 的建议解决了这个问题。

【问题讨论】:

标签: windows winapi qt


【解决方案1】:

您确定这不是调试问题吗?交易是,如果应用程序具有前台,则允许更改前台。

单击窗口 A 上的按钮将激活该窗口线程前台。如果它在另一个窗口上调用 SetForegroundWindow(或等效项),则该窗口将被赋予前景。

另一方面,如果它只是向另一个应用程序发送一条消息,该应用程序尝试自行设置前景,那么它将失败。 AllowSetForegroundWindow 用于“旧版”应用程序需要获得权限(由前台应用程序)以占据前台的情况。再一次,AllowSet... 仅在从拥有当前活动前台窗口的线程调用时才有效。

【讨论】:

  • 谢谢!这个建议帮助我开发了一个需要将控制权传递给另一个实例的普通 Windows 窗体应用程序。
【解决方案2】:

QWidget::activateWindow 方法之上,您应该调用QWidget::raise

这就是here所说的。

【讨论】:

【解决方案3】:

我也有类似的情况。

我有两个 Qt 应用程序,A 和 B,它们在套接字上进行通信。 我想通过应用程序 A 上的按钮打开应用程序 B 的窗口。

我发现有时小部件状态设置不正确,所以在我的应用程序 B 小部件的 event() 函数中我做了以下操作:

bool MyWidgetB:event ( QEvent * e )
{
    QEvent::Type type = e->type ();

    // Somehow the correct state of window is not getting set,
    // so doing it manually
    if( e->type() == QEvent::Hide)
    {
        this->setWindowState(WindowMinimized);
    }
    else if( e->type() == QEvent::Show )
    {
        this->setWindowState((this->windowState() & ~WindowMinimized) |
                                 WindowActive);
    }
    return QWidget::event(e);
}

我正在从应用程序 A 向 B 发送命令。应用程序 B 收到命令后,会自行调用以下函数:

void BringUpWidget(QWidget* pWidget)
{
   pWidget ->showMinimized(); // This is to bring up the window if not minimized
                              // but beneath some other window

   pWidget ->setWindowState(Qt::WindowActive);
   pWidget ->showNormal();
}

这对我有用,在Windows XP,使用 Qt 3.3。我的MainWidget 是从QWidget 派生的。

我发现这也适用于派生自 QMainWindow 的小部件,但存在一些问题。就像其他一些子窗口打开一样。

对于这种情况,我存储子窗口的位置并隐藏它们,然后使用BringUpWidget 函数带上我的MainWindow 小部件,然后恢复子窗口。

【讨论】:

    【解决方案4】:

    这有点俗气,但对我有用:

                this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
                this->show();
                this->setWindowFlags(Qt::FramelessWindowHint);
                this->show();
    

    或者,如果您没有其他标志,

                this->setWindowFlags(Qt::WindowStaysOnTopHint);
                this->show();
                this->setWindowFlags(0);
                this->show();
    

    WindowStaysOnTopHint 几乎总是将窗口强制置于前台。之后,您并不真的希望窗口始终保持在顶部,因此请重置为之前的标志。

    【讨论】:

      【解决方案5】:

      我认为您需要的 API 是 AllowSetForegroundWindow()SetForegroundWindow()。我不知道等效的 Qt 调用是什么。

      【讨论】:

        【解决方案6】:

        使用 showNormal() 从图标化状态变为可见状态。

        【讨论】:

          猜你喜欢
          • 2012-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          • 1970-01-01
          • 2021-04-05
          • 2011-08-20
          相关资源
          最近更新 更多