c++ - 在没有停靠栏图标的 Mac OS X 中启动 GUI 进程

标签 c++ multithreading qt macos

我有一个通常使用标准图形界面运行的应用程序。但是,对于某些长时间运行的任务,它会生成以“脚本模式”运行的同一应用程序的其他进程,我从父进程控制它。一切都很好,除了对于每个子进程,我都会得到另一个停靠图标,该图标会弹出一两秒钟然后消失。

有没有办法有时运行应用程序而应用程序图标不显示在停靠栏上?我无法编辑 info.plist 或任何东西,因为通常我想要停靠栏图标。该选项必须能够通过更改进程的属性或通过命令行参数来设置。我可以完全控制应用程序的源代码。它是用 C++ (Qt) 编写的,但针对 native Cocoa 库的解决方案很好。

如果我将这段代码放到一个单独的应用程序中,它会导致大量重复,所以我宁愿保持原样。我不能在后台线程中运行长时间运行的任务,因为它们正在做必须在 GUI 线程中完成的事情。 (在 Qt 中,您不能可靠地使用字体、像素图或将 SVG 内容渲染到后台线程的 QGraphicsScene 上。)

有什么解决办法吗?

最佳答案

灵感来自 here ,你可以这样做:

[NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory];

[NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited];

这应该隐藏停靠栏图标。参见 here有关 NSApplicationActivationPolicy 的一些文档。

在Python中,隐藏dock图标的代码是:

# https://stackoverflow.com/a/9220857/133374
import AppKit
# https://developer.apple.com/library/mac/#documentation/AppKit/Reference/NSRunningApplication_Class/Reference/Reference.html
NSApplicationActivationPolicyRegular = 0
NSApplicationActivationPolicyAccessory = 1
NSApplicationActivationPolicyProhibited = 2
AppKit.NSApp.setActivationPolicy_(NSApplicationActivationPolicyProhibited)

另见相关问题 "How to hide the Dock icon" .


如果你想避免停靠栏图标在一开始就弹出,你可以这样做:

import AppKit
info = AppKit.NSBundle.mainBundle().infoDictionary()
info["LSBackgroundOnly"] = "1"

关于c++ - 在没有停靠栏图标的 Mac OS X 中启动 GUI 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6796028/

相关文章:

c++ - 函数模板特化失败

c++ - Microsoft XMLLite 的 XML 绑定(bind)

c++ - 如何在 C++11 的 Mac OS X 上命名 std::thread?

qt - Qt和LNK1104无法打开文件

c++ - 使用 StyleSheet 悬停时 qt 加宽 QScrollBar

Qt纯虚函数报错

c++ - 给定头节点,如何递归地找到链表中的最大项?

c++ - 使用键盘输入暂停 C++ GLUT 程序

c - 没有阻塞线程

multithreading - 多线程排序