【问题标题】:Programmatically setting the Mac menubar title以编程方式设置 Mac 菜单栏标题
【发布时间】:2013-01-02 12:47:19
【问题描述】:

如何以编程方式更改 Mac 菜单栏中的应用程序标题(启动应用程序之后)?

我知道我可以在运行程序之前通过 Info.plist 文件中的 CFBundleName 进行设置。但是,我需要在初始化应用程序后对其进行更改。操作我自己的 Info.plist 也行不通。

没有官方的 API 可以这样做,但在 this discussion 中有人暗示有一个秘密的函数调用可以更改包名称/菜单栏标题:

“如果你足够仔细地寻找它,你可以使用 SPI,但是 我不会向任何人指出它,除非他们能证明他们为什么 需要使用它:-)"

我认为 Java 也使用了类似的东西。那么秘密 API 是什么?

【问题讨论】:

    标签: macos nsbundle


    【解决方案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")
    

    请注意,如果您将其与 .app 包结合使用,您可以获得非常好的 Python 应用程序系统集成。虽然您可以更改图标、Finder 显示名称……,但我尝试的所有方法都将 CFBundleName(菜单栏中的那个)保留为“Python”。 (例如This answer 仅更改长名称(显示在停靠图标上)。还有很多其他的几乎可以工作。)

    虽然这个答案给出了预期的结果,但它不是很优雅。我希望能深入了解为什么我需要超时...我认为 Python 或 pygtk 在我第一次导入 gtk 或运行主循环时会更改进程名称。

    【讨论】:

      猜你喜欢
      • 2011-03-10
      • 1970-01-01
      • 2020-05-31
      • 2012-11-26
      • 2015-11-25
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      相关资源
      最近更新 更多