2011-07-22 91 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背景蟒蛇腳本。