2012-07-12 87 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

相關問題