Objective-C: получить информацию о меню из внешнего приложения

Я пытаюсь написать дополнительное приложение меню Mac OS, которое отображает контекстное меню, содержащее элементы строки меню текущего активного приложения, когда пользователь нажимает какую-либо горячую клавишу. Отображение контекстного меню я могу сделать нормально, но я не могу получить элементы строки меню активного в данный момент приложения. На данный момент я использую [[[NSWorkspace sharedWorkspace] runningApplications] filteredArrayUsingPredicate:] для получения имени активного приложения, но NSRunningApplication, похоже, содержит очень мало другой информации. Есть ли способ получить информацию о меню приложения из внешнего приложения?

ОБНОВЛЕНИЕ:

Использование структуры 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


person alaroldai    schedule 12.07.2012    source источник
comment
СПАСИБО! Я хотел бы поставить вам больше, чем +1, но я не знаю, как это сделать. Компиляция /System/Library/CoreServices/System Events.app в заголовок, вероятно, самая странная вещь, которую я когда-либо делал с Xcode, но, эй, это работает! Вы случайно не знаете, где скрыт ярлык или свойство keyEquivalent в SystemEventsMenuItem?   -  person epologee    schedule 04.09.2012


Ответы (1)


Вы можете использовать AppleScript для имитации выбора пункта меню, как показано здесь, но я не уверен, можно ли динамически захватывать названия всех пунктов меню, чтобы использовать этот метод вам нужно, чтобы имена уже были жестко запрограммированы в приложении.

person stonesam92    schedule 16.07.2012
comment
Эй, спасибо за совет по яблочному скрипту! Я немного покопался и нашел эту статью, в которой используется AppleScript. в значительной степени именно то, что я хочу... Тем не менее, я буду продолжать искать метод Objective-c. Включение яблочного скрипта в мое приложение может стать очень грязным. - person alaroldai; 18.07.2012
comment
Вы можете без особых проблем использовать appleScript из приложений какао, см. NSAppleScript. Очевидно, что это не так хорошо, как обычный objc, но я не знаю, найдете ли вы простое встроенное решение в чистом objc. Удачи, хотя - person stonesam92; 18.07.2012