2013-01-02 100 views
2

如何以編程方式更改Mac菜單欄中的應用程序標題(啓動應用程序後後的)?以編程方式設置Mac菜單欄標題

我知道我可以在通過Info.plist文件中的CFBundleName運行程序之前對其進行設置。但是,我需要在初始化應用程序後對其進行更改。操縱我自己的Info.plist也是行不通的。

沒有官方的API這樣做,但在this discussion有人暗示,有一個祕密的函數調用改變包名稱/菜單欄標題:

「有SPI如果你看一下,你可以使用夠硬周圍,但 我不會指向任何人,除非他們能證明他們爲什麼 需要使用它:-)」

我認爲Java使用類似的東西了。那麼祕密API是什麼?

回答

1

好的,我找到了一個方法。這是Python中的代碼(拍下from here)。它可以使用一些清理和一些錯誤處理,但它可以工作。關鍵是來自ApplicationServices的未記錄的CPSSetProcessName。

def _osx_set_process_name(app_title): 
    """ Change OSX application title """ 

    from ctypes import cdll, c_int, pointer, Structure 
    from ctypes.util import find_library 

    app_services = cdll.LoadLibrary(find_library("ApplicationServices")) 

    if app_services.CGMainDisplayID() == 0: 
     print "cannot run without OS X window manager" 
    else: 
     class ProcessSerialNumber(Structure): 
      _fields_ = [("highLongOfPSN", c_int), 
         ("lowLongOfPSN", c_int)] 
     psn = ProcessSerialNumber() 
     psn_p = pointer(psn) 
     if ( (app_services.GetCurrentProcess(psn_p) < 0) or 
       (app_services.SetFrontProcess(psn_p) < 0)): 
      print "cannot run without OS X gui process" 

     print "setting process name" 
     app_services.CPSSetProcessName(psn_p, app_title) 

    return False 

如果你調用它的時候了,它改變了活動監視器的進程名。我只好叫它小超時後,由於某種原因,也改變了菜單欄的名字:

import gobject 
gobject.timeout_add(100, _osx_set_process_name, "MyTitle") 

請注意,如果你把這個有。應用程序包,你可以得到一個Python應用程序的一個非常好的系統集成。雖然您可以更改圖標,Finder顯示名稱,...,但我試過的所有方法都將「CFBundleName」(菜單欄中的那個)保留爲「Python」。 (This answer僅用於更改長名稱(在停靠欄圖標上顯示),還有很多其他人幾乎可以工作。)

雖然此答案給出了預期的結果,但並不十分優雅。我很欣賞爲什麼我需要超時的一些見解......我認爲當我第一次導入gtk或運行主循環時,Python或pygtk會更改進程名稱本身。

相關問題