代码之家  ›  专栏  ›  技术社区  ›  Jake Petroules

Windows和QWidget中的活动窗口::ActivateWindow()

  •  4
  • Jake Petroules  · 技术社区  · 15 年前

    qt文档 QWidget::activateWindow() 国家:

    在Windows上,如果您正在调用 当应用程序当前不是 那么它就不会 它是活动窗口。它会改变 任务栏项的颜色 指示窗口已更改 在某种程度上。这是因为微软 不允许应用程序 中断用户当前的状态 在另一个应用程序中执行。

    然而,Skype似乎违背了这条规则。如果Skype正在运行但不是活动的应用程序,我可以从“开始”菜单启动它,它将现有实例置于前台,激活它并获取输入焦点。

    以及如何 这样做吗?

    4 回复  |  直到 9 年前
        1
  •  6
  •   Jake Petroules    15 年前

    ( 注意:这特定于qtsingleapplication的工作方式 )

    对我的问题来说,解决办法太简单了。简单呼叫 AllowSetForegroundWindow(ASF_ANY); 在应用程序的开始,原始进程将因此被允许通过使用 SetForegroundWindow() . 没有奇怪的黑客,只需要添加一行代码,也不需要修改qtsingleapplication。

        2
  •  1
  •   sje397    15 年前

    我认为单凭qt api就不能可靠地做到这一点。

    Windows有多种解决方案。例如。 here here here .

    我以前使用的方法是声明 shared memory section 并在那里编写应用程序的窗口句柄。稍后,当程序的第二个实例启动时,您可以找到第一个的窗口句柄并激活它。

    在这种情况下,我认为您没有Windows阻止您执行此操作的问题,因为您的第二个实例是活动的应用程序,因此允许将焦点“传递”到其他窗口。

        3
  •  0
  •   Mason Zhang    15 年前

    使用 Single Application QT解决方案

    对于某些应用,它是有用的,或者 甚至关键的是他们已经开始 任何用户只能使用一次。未来尝试 启动应用程序应该 激活任何已经运行的实例, 可能执行请求 操作,例如加载文件 实例。

        4
  •  -1
  •   have.a.test    9 年前

    您可以将setWindowOpacity设置为0到1。唯一的事情是您可以一直打开它。