需要将应用程序带到Windows上的前景

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

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

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


不幸的是,我只能用Qtfind一种方法。 我使用Chris Becke的build议从当前活动的应用程序中调用SetForegroundWindow来解决这个问题。

Solutions Collecting From Web of "需要将应用程序带到Windows上的前景"

你确定这不是一个调试问题? 这个交易是,如果一个应用程序具有前景,则允许改变前景。

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

另一方面,如果它只是发送一个消息给另一个应用程序,该应用程序尝试将自己置于SetForeground上,则会失败。 AllowSetForegroundWindow用于需要授予“传统”应用程序权限的情况 – 由前台应用程序执行前台操作。 再一次,AllowSet …只有在拥有当前活动前景窗口的线程中调用时才有效。

QWidget::activateWindow方法的顶部,你应该调用QWidget::raise

这就是这里所说的。

我也有类似的情况。

我有两个Qt应用程序,A和B,通过套接字进行通信。 我想通过应用程序A上的一个按钮来启动一个应用程序B的窗口。

我发现有时widget的状态设置不正确,所以在我的应用程序B的widget的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之后,应用程序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小部件,然后恢复子窗口。

这是俗气,但它适用于我:

  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几乎总是强制窗口前台。 之后,你并不是真的希望窗口始终保持在最前面,所以重新设置为之前的标志。

我认为你需要的API是AllowSetForegroundWindow()和SetForegroundWindow() 。 我不知道等价的Qt电话是什么。

使用showNormal()从图标化状态转换到可见状态。