2010-02-25 22 views
15

我很新的可可編程和我找不到做如下的方式:如何啓動應用程序並使用Cocoa API將它展現在前面?

  • 按名稱
  • 啓動特定的應用做了一些工作
  • 後來把該應用程序我已經開始成爲前臺進程

從我在Carbon API中找到的內容看起來應該使用的調用是launchApplication()和setFrontProcess()。

但如何在可可中做到這一點?即啓動它,獲得PID,將PID設置爲前臺進程。我想谷歌的例子,並沒有發現任何...

如果你們能提供一個簡約樣本,這將是真棒:)

在此先感謝。

回答

29

要啓動的應用程序:

[[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]; 
+0

我試圖從後臺進程這種方式啓動應用程序,但似乎這種啓動方法不能在獅子或更高版本中工作,如果進行它的過程不是GUI應用程序。 –

+1

'NSApplicationActivateAllWindows'選項將導致所有的應用程序窗口出現,這幾乎總是不是你想要的。相反,您可以傳入'NSApplicationActivateIgnoringOtherApps'來激活應用程序中最近激活的窗口。 – thomasfuchs

4

要啓動的應用程序,使用NSWorkspace類:NSWorkspace Reference

具體地說,launchApplication:功能。

我不知道激活部分的答案我的頭。您可以使用-[NSApplication activateIgnoringOtherApps:]激活自己的應用程序,但我不知道如何爲其他應用程序執行此操作。

+0

謝謝。這是正確的功能,是的,我看到了,但是我找不到找到pid並稍後重用它的方法。讓我們等待,也許有人知道答案:) – dimsuz

1

NSRunningApplication可以在Mac OS X 10.6或更高版本。

如果您必須支持較早的系統,則可以使用GetCurrentProcess()和SetFrontProcess()等API和舊的ProcessSerialNumber結構完成此操作。

0

對於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   
      { 
      } 

我仍然在試圖找到知道 「主動」 的方式, 「隱藏」等應用程序狀態,但至今尚未成功。

0

在swift 4中,您可以使用NSWorkspace.shared.launchApplication(appName:)來打開一個應用程序。它也使我推出的應用程序在我的情況。

你還可以嘗試:

do { 
    try NSWorkspace.shared.launchApplication(at: yourAppURL, 
              options: .andHideOthers, 
              configuration: [:]) 
} catch { 
    printError("Failed to launch the app.") 
} 

選項andHideOthers:隱藏除了新推出的一個所有的應用程序。

相關問題