需要在Windows上将应用程序带到前台

时间:2008-10-15 09:45:08

标签: windows winapi qt

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

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

有人可以告诉我如何做到这一点,最好使用Qt虽然没有使用WIN32 API会没问题。


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

6 个答案:

答案 0 :(得分:4)

QWidget::activateWindow方法之上,您应该致电QWidget::raise

这就是所说的here

答案 1 :(得分:4)

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

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

另一方面,如果它只是向另一个试图向其自身尝试SetForeground的应用程序发送消息,那么它将失败。 AllowSetForegroundWindow用于需要为“遗留”应用程序授予前景应用程序权限以获取前景的情况。再一次,AllowSet ...仅在从拥有当前活动前景窗口的线程调用时才有效。

答案 2 :(得分:2)

我有类似的情况。

我有两个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窗口小部件,然后恢复子窗口。

答案 3 :(得分:1)

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

            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几乎总是将窗口强制到前台。之后,你真的不希望窗口总是保持在最顶层,所以重置为以前的标志。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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