Как запустить приложение и перенести его на передний план, используя Cocoa api?

Я очень новичок в программировании cocoa, и я не могу найти способ сделать следующее:

  • Запустить конкретное приложение по имени
  • Сделайте некоторые работы.
  • Позже принесите это приложение, которое я начал быть передним процессом.

Из того, что я нашел в Carbon API, похоже, что вызовы, которые я должен использовать, - это launchApplication() и setFrontProcess().

Но как это сделать в Cocoa? То есть запустить его, получить PID, установить, что PID будет фронт-процессом. Я попробовал Google на примерах и ничего не нашел...

Если любой из вас может предоставить минималистский образец, который был бы потрясающим:)

Спасибо заранее.

Ответы

Ответ 1

Запустить приложение:

[[NSWorkspace sharedWorkspace] launchApplication:@"/Applications/Safari.app"];

Чтобы активировать приложение:

NSRunningApplication* app = [NSRunningApplication
                             runningApplicationWithProcessIdentifier: PID];
[app activateWithOptions: NSApplicationActivateAllWindows];
// or
NSArray* apps = [NSRunningApplication
                 runningApplicationsWithBundleIdentifier:@"com.bla.blah"];
[(NSRunningApplication*)[apps objectAtIndex:0]
 activateWithOptions: NSApplicationActivateAllWindows];

Ответ 2

Чтобы запустить приложение, используйте класс NSWorkspace: Справка NSWorkspace

В частности, функция launchApplication:.

Я не знаю ответа части активации с моей головы. Вы можете активировать собственное приложение с помощью -[NSApplication activateIgnoringOtherApps:], но я не знаю, как это сделать для других приложений.

Ответ 4

NSRunningApplication доступен в Mac OS X 10.6 или новее.

Если вам нужно поддерживать более ранние системы, это можно сделать с помощью API, таких как GetCurrentProcess() и SetFrontProcess() и старой структуры ProcessSerialNumber.

Ответ 5

Для версии Swift2

Запустить приложение:

let task = NSTask()
task.launchPath = "/usr/bin/env"
task.arguments = ["/Applications/TextEdit.app/Contents/MacOS/TextEdit"]
task.launch()

Чтобы получить приложение с помощью идентификатора пакета:

    var apps: [AnyObject] = NSRunningApplication.runningApplicationsWithBundleIdentifier("com.apple.TextEdit")
    var MyApp: [NSRunningApplication] = apps as! [NSRunningApplication]        
            for app in MyApp        
            {
            }

Я все еще пытаюсь найти способ узнать "активное", "скрытое" и т.д. состояние приложения, но не удалось до сих пор.