如何在 Qt 中打开和最小化外部应用程序到系统托盘

Posted

技术标签:

【中文标题】如何在 Qt 中打开和最小化外部应用程序到系统托盘【英文标题】:How to open and minimize external app to system tray in Qt 【发布时间】:2019-04-06 06:59:58 【问题描述】:

QProcess 可以用来打开外部程序,但它总是会在所有其他窗口的前面打开一个应用程序。

有没有办法打开一个外部应用程序,然后将此打开的应用程序最小化/隐藏到系统托盘?

QString path = QString("external app path here").replace("/", "\\");

QProcess process;
process.start(path); //open the external app, but it will stay on top of other windows 
if (process.isOpen()) 
    //then minimize this app to system tray;

这(open and minimize external app to system tray)可以使用 Qt 方法实现吗?

如果 Qt 无法将打开的外部应用程序最小化到系统托盘。我必须使用 Windows API 吗?任何建议或示例代码将不胜感激。

【问题讨论】:

Nitpick:您的意思是 taskbarnotification area(任务栏的),而不是“托盘”。见devblogs.microsoft.com/oldnewthing/20030910-00/?p=42583 您可以通过 CreateProcess()、STARTUPINFO.wShowWindow 成员向进程提供建议。这有点违背了使用 Qt 的意义,您可以通过创建进程的快捷方式(.lnk 文件)并改为启动该进程来领先。请注意,这只是一个建议,许多程序会忽略它。您会很快从快捷方式的行为方式中找出答案。 【参考方案1】:

这不应该特定于 Qt。也许Qt session management 可能是相关的。

这是window manager 和desktop environment 的问题。两者都是由(非常广泛地说)您的“操作系统”提供的,并且不依赖于使用 Qt 的特定进程。

系统托盘属于桌面环境。使用 Qt 的特定进程没有理由将其最小化。系统托盘的最小化是桌面环境的业务(不是一个特定的 Qt 应用程序)。我认为您的应用程序没有理由这样做(请记住,您的用户还可以运行其他应用程序,这些应用程序对他来说比您的应用程序更重要,并且还与系统托盘交互或需要使用系统托盘)。

当然,Qt 提供了一个 API 来与窗口管理器和桌面环境交互

PS。在 Linux 上,Qt 应用程序和窗口管理器或桌面环境之间的约定记录在 EWMH 和 ICCCM 中。您需要找到适用于 Windows 的等价物。我从未使用过 Windows,所以我不认识它们。在 Linux 上,可以使用 Qt 编写窗口管理器。

【讨论】:

如您所说,Qt 提供了一些与 Windows 管理器和桌面环境交互的方法。你知道我如何使用 Qt 方法实现这一点吗?因为我对系统API不熟悉。 Qt 文档写得非常好,恕我直言。所以请仔细阅读。您可能需要阅读 Qt 特定于 Windows 的部分。我从未读过它,因为我从未使用过 Windows。

以上是关于如何在 Qt 中打开和最小化外部应用程序到系统托盘的主要内容,如果未能解决你的问题,请参考以下文章

Qt设置系统托盘图标和程序图标

WPF - 将应用程序从系统托盘置于最前面

vc 如何实现关闭时最小化到托盘

最小化到系统托盘区是啥意思?

如何把程序最小化到托盘图标

如何将我的桌面 Flutter 应用最小化到系统托盘?