【发布时间】:2023-08-29 12:21:01
【问题描述】:
我正在尝试编写一个 Mac OS 菜单额外应用程序,当用户按下某个热键时,它会显示一个包含当前活动应用程序菜单栏项的上下文菜单。上下文菜单的显示我可以做得很好,但我似乎无法获得当前活动应用程序的菜单栏项。目前我正在使用[[[NSWorkspace sharedWorkspace] runningApplications] filteredArrayUsingPredicate:] 来获取活动应用程序的名称,但 NSRunningApplication 似乎包含很少的其他信息。有什么方法可以从外部应用程序获取有关应用程序菜单的信息?
更新:
如果您对使用 AppleScript 感到满意,使用 ScriptingBridge 框架似乎效果很好:
SystemEventsApplication* sevApp = [SBApplication applicationWithBundleIdentifier:@"com.apple.systemevents"];
SystemEventsProcess* proc = [[sevApp applicationProcesses] objectWithName:appName];
for (SystemEventsMenuBar* menuBar in proc.menuBars) {
for (SystemEventsMenuBarItem* menuBaritem in menuBar.menuBarItems) {
NSLog(@"%@", menuBaritem.name);
}
}
将打印出应用程序菜单栏中可用的菜单列表。还没有找到获取上下文菜单的方法,所以我暂时不会称之为回答...
【问题讨论】:
-
谢谢!我很乐意给你一个 +1,但我不知道怎么做。将
/System/Library/CoreServices/System Events.app编译到标题中可能是我用 Xcode 做过的最奇怪的事情,但是嘿,它有效!您是否知道快捷方式或keyEquivalent属性隐藏在SystemEventsMenuItem中的位置?
标签: objective-c macos cocoa menubar scripting-bridge