2012-07-12 49 views
6

我正试图编写一个Mac OS菜单的额外应用程序,该应用程序显示包含当前活动应用程序的菜单栏项目的上下文菜单,当用户按下某个热键时。上下文菜单的显示我可以做得很好,但我似乎无法获得当前活动的应用程序的菜单栏项目。目前我使用[[[NSWorkspace sharedWorkspace] runningApplications] filteredArrayUsingPredicate:]得到有效应用的名字,但NSRunningApplication似乎包含了珍贵的小的其他信息。有什么方法可以从外部应用程序获取有关应用程序菜单的信息吗?Objective-C:从外部应用程序获取菜单信息

UPDATE:

使用ScriptingBridge框架似乎工作得相当好,如果你很高兴使用AppleScript:

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

+0

**谢谢!**我想给你多一个+1,但我不知道如何。将'/ System/Library/CoreServices/System Events.app'编译成头文件可能是我用Xcode做过的最奇怪的事情,但是嘿,它可行!你会碰巧知道快捷方式或'keyEquivalent'属性隐藏在'SystemEventsMenuItem'中吗? – epologee 2012-09-03 22:30:12

回答

0

您可以使用AppleScript模拟像点击菜单项显示here,但我不知道,如果是可以动态地抓住所有的菜单项的名称,使用你需要已经有硬编码到应用程序的名称是方法。

+0

嘿,谢谢你的applescript提示!我做了一些挖掘,发现[这篇文章](http://hints.macworld.com/article.php?story=20111208191312748),它有一个几乎完全符合我想要的applescript方式...我会保持虽然寻找一个Objective-c方法。将applescript捆绑到我的应用程序可能会变得非常混乱。 – alaroldai 2012-07-18 00:52:05

+0

您可以使用可可应用程序中的appleScript,而不会有太多麻烦,请参阅[NSAppleScript](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSAppleScript_Class/Reference/Reference.html )。显然它不像直接的objc那么好,但我不知道你是否会在纯objc中找到一个简单的内置解决方案。祝你好运 – stonesam92 2012-07-18 11:43:31

相关问题