Windows上的QML:使窗口保持最佳状态

我真的需要让自己的窗口保持在Windows上,但Windows本身似乎不愿意让我这样做。

我无法使用解决方法设置registry值,因为我无法要求用户注销/login。

此外,我使用QML和QWidget :: raise()和QApplication :: setActiveWindow()的解决scheme似乎也没有工作,因为我还没有设法得到QML根对象作为QWidget指针与下面的代码:

QWidget* mainWin = qobject_cast<QWidget*>(engine.rootObjects().at(0)); if (mainWin) { mainWin->raise(); QApplication::setActiveWindow(mainWin); mainWin->activateWindow(); } 

我也试图使QML中的窗口处于活动状态:

 window.raise() window.requestActivate() 

但也没有运气。

有没有办法把窗口放在Windows上,而不用改变registry,最好是纯粹从QML开始?

编辑 :目前使用的窗口标志是:

 Qt.Popup Qt.FramelessWindowHint Qt.WindowStaysOnTopHint Qt.CustomizeWindowHint Qt.BypassWindowManagerHint Qt.MSWindowsFixedSizeDialogHint 

我正在Windows 10 x64机器部署Qt 5.7应用程序 。 我发现了这两个错误修正:

  • https://bugreports.qt.io/browse/QTBUG-14062
  • https://bugreports.qt.io/browse/QTBUG-37435

从中我可以得出结论,QWidget :: activateWindow()和QWindow :: requestActive()应该在Windows XP和Windows 7上工作。

这是我的mcve ,正如@derM所问:

 import QtQuick 2.7 import QtQuick.Window 2.2 Window { flags: Qt.WindowStaysOnTopHint width: 100 height: 100 visible: true } 

它使用MinGW x32在Windows 10 x64下编译。

更简单的重现方法:在命令提示符下运行

 timeout 5 && debug\Test.exe 

其中debug \ Test.exe是mcve二进制文件的path,然后打开文件资源pipe理器并在某处导航。 当窗户打开时,它不会在前台。

更难的方法 :如果你只是运行它,窗口将保持在最佳状态。 但是如果你按下Qt Creator中的运行button,并切换焦点(我想,鼠标焦点应该改变,只需按Alt + Tab不会帮助)到另一个进程(在我的情况下 – 文件资源pipe理器),窗口显示在当前活动的文件资源pipe理器窗口下,即使我点击它,它也会在我select任何其他应用程序后立即启动。

真正的应用程序是从一个服务开始的,所以当我的应用程序启动时,经常会有一个应用程序保持鼠标焦点。 我想Qt能够将窗口设置为前景是通过使用SetForegroundWindow API调用实现的,该调用注意到以下限制:

  • 该过程是前台进程。
  • 该过程由前台进程启动。
  • 该进程收到最后一个input事件。
  • 没有前台进程。
  • 该进程正在被debugging。
  • 前台进程不是现代应用程序或开始屏幕。
  • 前景未被locking(请参阅LockSetForegroundWindow)。
  • 前台locking超时已过期(请参阅SystemParametersInfo中的SPI_GETFOREGROUNDLOCKTIMEOUT)。
  • 没有菜单处于活动状态

所以我想知道,如果进程是由服务启动的,而不是用户(即进程在启动期间还没有活动的进程),那么是否有可能将窗口置于前台。

正如您所发布的:如果窗口是从前台进程创建的,那么我们将确保在创建窗口之前,我们的进程是前台进程。

 import QtQuick 2.7 import QtQuick.Window 2.2 Item { id: root Component { // Like a splash screen: Claim to be foreground process, // then create main window. id: winInit Window { flags: Qt.WindowStaysOnTopHint width: 1 height: 1 Component.onCompleted: { requestActivate() mainWin.createObject(root) } } } Component { id: mainWin Window { flags: Qt.WindowStaysOnTopHint width: 100 height: 100 visible: true } } Component.onCompleted: { var w1 = winInit.createObject(null) w1.destroy() } }