2

プログラムで(アプリケーションの起動後に) Macメニューバーのアプリケーションタイトルを変更するにはどうすればよいですか?

Info.plistファイルのCFBundleNameを介してプログラムを実行する前に設定できることを知っています。ただし、アプリケーションの初期化後に変更する必要があります。自分のInfo.plistを操作することもできません。

これを行うための公式のAPIはありませんが、このディスカッションで、バンドル名/メニューバーのタイトルを変更する秘密の関数呼び出しがあることを誰かがほのめかしました。

「十分に注意深く見れば使用できるSPIがありますが、なぜそれを使用する必要があるのか​​を正当化できない限り、誰にもそれを指摘するつもりはありません:-)」

Javaも似たようなものを使っていると思います。では、秘密のAPIは何ですか?

4

1 に答える 1

1

わかりました、私は方法を見つけました。これは Python のコードです (ここから取得)。いくつかのクリーニングとエラー処理が必要になる可能性がありますが、機能します。キーは、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

すぐに呼び出すと、Activity Monitor のプロセス名が変更されます。メニューバーの名前も変更するには、何らかの理由で短いタイムアウトの後に呼び出す必要がありました。

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

これを .app パッケージと組み合わせると、Python アプリの非常に優れたシステム統合が得られることに注意してください。アイコン、Finder の表示名などを変更することはできますが、私が試したすべての方法では、CFBundleName (メニュー バーにあるもの) を「Python」のままにしておきます。(たとえば、この回答は長い名前(ドックアイコンの上に表示される)のみを変更します。ほとんど機能する他のものがたくさんあります。)

この回答は意図した結果をもたらしますが、あまりエレガントではありません。タイムアウトが必要な理由についての洞察をいただければ幸いです...最初にgtkをインポートするか、メインループを実行するときに、Pythonまたはpygtkがプロセス名自体を変更すると思います。

于 2013-01-02T13:41:02.943 に答える