在没有停靠栏图标的Mac OS X中启动GUI过程

时间:2011-07-22 20:56:16

标签: c++ multithreading qt macos

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

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

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

任何解决方案?

2 个答案:

答案 0 :(得分:8)

来自here的动机,您可以这样做:

[NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory];

[NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited];

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

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

# 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"

答案 1 :(得分:2)

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

此代码适用于我的非GUI背景python脚本。