Macos 以编程方式设置Mac菜单栏标题

Macos 以编程方式设置Mac菜单栏标题,macos,nsbundle,Macos,Nsbundle,如何以编程方式(启动应用程序后)更改Mac菜单栏中的应用程序标题 我知道我可以在运行程序之前通过Info.plist文件中的CFBundleName进行设置。但是,我需要在初始化应用程序后更改它。操纵我自己的Info.plist也行不通 没有官方的API可以这样做,但有人暗示有一个秘密函数调用会更改捆绑包名称/菜单栏标题: “如果你仔细观察周围,你可以使用SPI,但是 除非他们能证明他们为什么要这么做,否则我不会向任何人指出 需要使用它:-)” 我认为Java也使用类似的东西。那么什么是秘密AP

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

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

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

“如果你仔细观察周围,你可以使用SPI,但是 除非他们能证明他们为什么要这么做,否则我不会向任何人指出 需要使用它:-)”


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

好的,我找到了一种方法。这是Python中的代码(已获取)。它可能需要一些清理和一些错误处理,但它可以工作。密钥是ApplicationServices中未记录的CPSSetProcessName

def\u osx\u set\u流程名称(应用程序标题):
“”“更改OSX应用程序标题”“”
从ctypes导入cdll、c_int、指针、结构
从ctypes.util导入查找库
app\u services=cdll.LoadLibrary(查找库(“应用服务”))
如果app_services.CGMainDisplayID()=0:
打印“没有OS X窗口管理器无法运行”
其他:
类ProcessSerialNumber(结构):
_字段\=[(“highLongOfPSN”,c_int),
(“lowLongOfPSN”,c_int)]
psn=ProcessSerialNumber()
psn_p=指针(psn)
如果((app_services.GetCurrentProcess(psn_p)<0)或
(app_services.SetFrontProcess(psn_p)<0)):
打印“没有OS X gui进程无法运行”
打印“设置进程名称”
app_services.CPSSetProcessName(psn_p,app_title)
返回错误
如果您立即调用它,它会更改活动监视器中的进程名称。出于某种原因,我不得不在短暂的超时后调用它,以更改菜单栏名称:

导入gobject
gobject.timeout\u add(100,\u osx\u set\u process\u name,“MyTitle”)
请注意,如果将其与.app包结合使用,您可以获得python应用程序的非常好的系统集成。虽然您可以更改图标、Finder显示名称,…,但我尝试的所有方法都将CFBundleName(菜单栏中的那个)保留为“Python”。(例如,仅更改长名称(显示在dock图标上)。还有许多其他名称几乎可以使用。)

虽然这个答案给出了预期的结果,但并不十分优雅。我想知道为什么我需要暂停。。。我认为Python或pygtk在我第一次导入gtk或运行主循环时会更改进程名称本身