【问题标题】:Active windows in Windows and QWidget::activateWindow()Windows 和 QWidget::activateWindow() 中的活动窗口
【发布时间】:2011-03-19 23:36:33
【问题描述】:

QWidget::activateWindow() 的 Qt 文档指出:

在 Windows 上,如果你调用这个 当应用程序当前不是 活跃的然后它不会做 它是活动窗口。它会改变 任务栏条目的颜色 表示窗口已更改 某种程度上来说。这是因为微软 不允许应用程序 打断用户当前的状态 在另一个应用程序中执行。

但是,Skype 似乎违反了这一规则。如果 Skype 正在运行但不是活动应用程序,我可以从开始菜单启动它,它将现有实例带到前台,激活它并获取输入焦点。

怎么能做到这一点?

【问题讨论】:

    标签: windows qt window-managers foreground


    【解决方案1】:

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

    【讨论】:

    • 在您的答案中更具描述性。你在哪里做这个设置?代码会是什么样子?
    【解决方案2】:

    注意:这是特定于 QtSingleApplication 的工作方式

    对于我的问题,解决方案非常简单。只需在应用程序开始时调用AllowSetForegroundWindow(ASF_ANY);,原始进程将因此被允许通过使用SetForegroundWindow() 将自己带到前台。没有奇怪的 hack,只需添加一行代码,也无需修改 QtSingleApplication。

    【讨论】:

    • 告诉任何说“不要接受你自己的答案”的人去阅读常见问题解答 :)
    • 我们需要在QtSingleApplication::activateWindow()函数中插入SetForegroundWindow()吗?
    • 不,你不需要修改QtSingleApplication。 QtSingleApplication::activateWindow() 调用 QWidget::activateWindow(),后者在 Windows 平台内部调用 SetForegroundWindow() - 所以它已经为你完成了。 :) 请参阅 Qt 源代码的 src\gui\kernel\qwidget_win.cpp:933
    • 根据AllowSetForegroundWindow function definition参数必须是将启用设置前台窗口的进程的标识符。如果该参数为ASFW_ANY,则所有进程都可以设置前台窗口。
    【解决方案3】:

    在 Qt 解决方案中使用 Single Application

    对于某些应用程序很有用或 甚至对他们开始至关重要 任何用户仅一次。未来的尝试 启动应用程序应该 激活任何已经运行的实例, 并可能执行请求 动作,例如加载一个文件,在那个 实例。

    【讨论】:

    • 我正在使用来自 Qt Solutions 的单一应用程序;我需要扩展它,以便它始终将窗口带到前台。
    • ... // 检查应用是否运行 DApplication app("ProductinternalName", argc, argv); if ( app.isRunning() ) { app.sendMessage( QString::null );返回0; } ... // 设置激活窗口 app.setActivationWindow( &w ); ... // 您可能还需要自定义如何通过 void DApplication::activateWindow() { if ( activationWindow() && !activationWindow()->isVisible() ) { activationWindow()->setVisible( true ) 来激活窗口; } 超级::activateWindow(); }
    • 很抱歉,注释字段中的代码格式不正确。
    【解决方案4】:

    我认为您不能仅使用 Qt API 可靠地做到这一点。

    Windows 有多种解决方案。例如。 hereherehere

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

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

    【讨论】:

      猜你喜欢
      • 2019-05-24
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多