2011-07-22 153 views
3

我有一个通常使用标准图形界面运行的应用程序。但是,对于某些长时间运行的任务,它会产生以“脚本模式”运行的相同应用程序的附加进程,在该模式下,我正在从父进程控制它。一切都很好,除了每个子进程我都会得到另一个停靠图标,它会弹出一两秒钟然后消失。在Mac OS X中启动GUI进程,无需停靠图标

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

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

任何解决方案?

回答

7

动机从here,你可以这样做:

[NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory]; 

[NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited]; 

本应隐藏的Dock图标。有关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

当我将activationpolicy设置为Accessory时,所有窗口都关闭。你如何避免这种情况? – Mark

+0

@Albert:Thx,你用这些提示拯救了我的生命。 – Dalen

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

此代码为我的非GUI背景蟒蛇脚本。