【问题标题】:Objective-C: get menu information from external applicationObjective-C:从外部应用程序获取菜单信息
【发布时间】: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);
        }
    }

将打印出应用程序菜单栏中可用的菜单列表。还没有找到获取上下文菜单的方法,所以我暂时不会称之为回答...

这也很有用:http://robnapier.net/blog/scripting-bridge-265

【问题讨论】:

  • 谢谢!我很乐意给你一个 +1,但我不知道怎么做。将/System/Library/CoreServices/System Events.app 编译到标题中可能是我用 Xcode 做过的最奇怪的事情,但是嘿,它有效!您是否知道快捷方式或keyEquivalent 属性隐藏在SystemEventsMenuItem 中的位置?

标签: objective-c macos cocoa menubar scripting-bridge


【解决方案1】:

您可以使用AppleScript 来模拟单击菜单项,如here 所示,但我不确定是否可以动态获取所有菜单项的名称,以使用您需要的方法名称硬编码到应用程序中。

【讨论】:

  • 嘿,感谢您的 applescript 提示!我做了一些挖掘,发现this article 它有一个applescript 方法可以做几乎我想要的......不过我会继续寻找一个Objective-c 方法。将 applescript 捆绑到我的应用程序中可能会变得非常混乱。
  • 你可以在 cocoa 应用程序中使用 appleScript 而不会太麻烦,请参阅NSAppleScript。显然它不如直接 objc 好,但我不知道你是否会在纯 objc 中找到一个简单的内置解决方案。祝你好运