2010-02-25 26 views
15

Tôi rất mới cho một chương trình ca cao và tôi không thể tìm ra cách để làm như sau:Làm thế nào để khởi động ứng dụng và đưa nó lên phía trước bằng cách sử dụng api Cocoa?

  • Bắt đầu một ứng dụng cụ thể theo tên
  • làm một số công việc
  • Sau đó mang lại cho rằng ứng dụng tôi đã bắt đầu là quy trình trước

Từ những gì tôi tìm thấy trong API Carbon, có vẻ như các cuộc gọi tôi nên sử dụng là launchApplication() và setFrontProcess().

Nhưng cách thực hiện điều này trong Cocoa? I E. khởi chạy nó, lấy PID, thiết lập PID đó là một tiến trình phía trước. Tôi cố gắng để google cho các ví dụ và tìm không có gì ...

Nếu bất kỳ của bạn có thể cung cấp một mẫu Minimalistic đó sẽ là tuyệt vời :)

Cảm ơn trước.

Trả lời

29

Để khởi chạy một ứng dụng:

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

Để kích hoạt một ứng dụng:

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

Tôi đã cố gắng khởi chạy một ứng dụng theo cách này từ một tiến trình nền, nhưng có vẻ như phương pháp khởi chạy này không hoạt động trong Lion hoặc sau này nếu quá trình thực hiện nó không phải là một ứng dụng GUI. –

+1

Tùy chọn 'NSApplicationActivateAllWindows' sẽ khiến tất cả cửa sổ Ứng dụng xuất hiện, hầu như không phải là thứ bạn muốn. Thay vào đó, bạn có thể chuyển vào 'NSApplicationActivateIgnoringOtherApps' để chỉ kích hoạt cửa sổ được kích hoạt gần đây nhất trong ứng dụng. – thomasfuchs

4

Để bắt đầu một ứng dụng, sử dụng lớp NSWorkspace: NSWorkspace Reference

Cụ thể, launchApplication: chức năng.

Tôi không biết câu trả lời của phần kích hoạt khỏi đầu của tôi. Bạn có thể kích hoạt ứng dụng của riêng mình với -[NSApplication activateIgnoringOtherApps:], nhưng tôi không biết cách thực hiện nó cho các ứng dụng khác.

+0

Cảm ơn. Đó là chức năng đúng, vâng, tôi đã thấy nó, nhưng tôi không thể tìm được cách để tìm pid và tái sử dụng nó sau này. Hãy chờ ai đó biết câu trả lời :) – dimsuz

1

NSRunningApplication có sẵn trên Mac OS X 10.6 trở lên.

Nếu bạn phải hỗ trợ các hệ thống cũ hơn, điều này có thể được thực hiện với các API như GetCurrentProcess() và SetFrontProcess() và cấu trúc ProcessSerialNumber cũ.

0

Đối với phiên bản Swift2

Khởi chạy ứng dụng:

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

Để tải ứng dụng sử dụng bó Định danh:

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

tôi vẫn đang cố gắng để tìm ra cách nào để biết "tích cực", "ẩn" trạng thái của ứng dụng, nhưng không thành công cho đến bây giờ.

0

Trong nhanh 4, bạn có thể sử dụng NSWorkspace.shared.launchApplication(appName:) để mở ứng dụng. Nó cũng làm cho các ứng dụng đưa ra ở phía trước trong trường hợp của tôi.

Bạn cũng có thể thử:

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

Lựa chọn andHideOthers: Ẩn tất cả các ứng dụng trừ vừa được tung ra một.

Các vấn đề liên quan