【问题标题】:Qt Need to bring Qt application to foreground called from win32 applicationQt 需要将 Qt 应用程序带到从 win32 应用程序调用的前台
【发布时间】:2011-08-20 16:00:41
【问题描述】:

我有一个简单的 win32 应用程序,它使用 createProcess 方法调用 Qt 应用程序。

问题是我喜欢把 Qt 应用程序带到前台。

谁对此负责?父 win32 应用还是 Qt 应用?

【问题讨论】:

    标签: c++ winapi qt


    【解决方案1】:

    获取Qt应用程序的窗口句柄并调用SetForegroundWindow

    http://msdn.microsoft.com/en-us/library/ms633539.aspx

    【讨论】:

      【解决方案2】:

      当前具有前景焦点的应用程序是唯一允许改变前景焦点的应用程序。您需要使用SetForegroundWindow function 来行使此权利。

      文档中的“备注”部分包含适用的限制列表:

      系统限制哪些进程可以设置前台窗口。只有满足以下条件之一,进程才能设置前台窗口:

      • 该进程是前台进程。
      • 进程由前台进程启动。
      • 进程收到最后一个输入事件。
      • 没有前台进程。
      • 正在调试前台进程。
      • 前景未锁定(请参阅LockSetForegroundWindow)。
      • 前台锁定超时已过期(请参阅SystemParametersInfo 中的SPI_GETFOREGROUNDLOCKTIMEOUT)。
      • 没有处于活动状态的菜单。

      当用户正在使用另一个窗口时,应用程序不能将一个窗口强制置于前台。相反,Windows 会闪烁窗口的任务栏按钮以通知用户。

      真正的问题是您为什么需要这样做。更改前台应用程序很可能会给您带来麻烦,无论是 Windows 对其施加的所有限制,还是您的用户。这是一种对用户非常不利的行为,这也是 Windows 近几年来收紧对它的限制的原因之一。

      【讨论】:

      • 没有Qt的方式吗?我的问题:当用户按下设置时,会打开一个新窗口,但如果他们没有观察它并再次按下设置,设置窗口将留在后面,我想说“嘿,我在这里。在这里,我弹回来了在前面为你”。一个解决方案是先设置 setVisible(false),然后设置 setVisible(true),但我不喜欢这个解决方案,它应该只是弹回到前面,而无需关闭并再次打开它。我不能使用 Windows API,因为该应用程序是跨平台的,不想阻止它。
      • @Moraru:是的,这相对简单,因为设置窗口是由您自己的应用程序创建的。这里的问题是尝试从 other 应用程序(进程)激活窗口。 Windows 试图阻止它,因为它曾经被开发人员严重滥用。
      • 设置前台窗口是一个完全有效的操作,但是,如果您这样做是为了响应用户发起的操作(单击、热键),而这是用户期望的行为发生。
      • 设置前台window和改变前台application是有区别的。
      【解决方案3】:

      您可能希望从父进程执行此操作。使用SetForegroundWindow 的最简洁/最可靠的方法是从当前处于前台的进程中调用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-19
        • 2011-01-28
        • 2012-07-30
        • 1970-01-01
        • 1970-01-01
        • 2017-09-27
        • 1970-01-01
        • 2011-09-08
        相关资源
        最近更新 更多