我对Cocoa编程非常陌生,无法找到以下操作的方法:
- 通过名称启动特定应用程序
- 执行一些工作
- 稍后将我启动的应用程序带到前台进程
从Carbon API中找到的内容显示需要使用launchApplication()和setFrontProcess()。
但是在Cocoa中应该如何实现呢?即启动它,获取PID,将该PID设置为前台进程。我尝试搜索示例却发现了空白...
如果您能提供最简单的示例,那将是太棒了:)
提前感谢。
启动一个应用程序:
[[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];
要启动一个应用程序,使用NSWorkspace
类:NSWorkspace参考文档
具体来说,使用launchApplication:
函数。
我不知道激活部分的答案。您可以使用-[NSApplication activateIgnoringOtherApps:]
激活自己的应用程序,但我不知道如何为其他应用程序执行此操作。
NSRunningApplication可在Mac OS X 10.6或更高版本中使用。
如果您需要支持早期系统,则可以使用诸如GetCurrentProcess()和SetFrontProcess()以及旧的ProcessSerialNumber结构等API来实现。
NSWorkspace.shared.launchApplication(appName:)
打开应用程序。它还会使启动的应用程序在我的情况下处于前台。do {
try NSWorkspace.shared.launchApplication(at: yourAppURL,
options: .andHideOthers,
configuration: [:])
} catch {
printError("Failed to launch the app.")
}
andHideOthers
:除了新打开的应用之外,隐藏所有其他应用程序。针对Swift2版本
启动应用:
let task = NSTask()
task.launchPath = "/usr/bin/env"
task.arguments = ["/Applications/TextEdit.app/Contents/MacOS/TextEdit"]
task.launch()
使用 Bundle Identifier 获取应用程序:
var apps: [AnyObject] = NSRunningApplication.runningApplicationsWithBundleIdentifier("com.apple.TextEdit")
var MyApp: [NSRunningApplication] = apps as! [NSRunningApplication]
for app in MyApp
{
}
我仍在努力寻找了解应用程序的“活动”,“隐藏”等状态的方法,但到目前为止还没有成功。
在 Objective C 中打开 Mac 应用程序
#import <Cocoa/Cocoa.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
[[NSWorkspace sharedWorkspace] launchApplication:@"/Applications/Books.app"];
}
return 0;
}
NSApplicationActivateAllWindows
选项会导致所有应用程序窗口都前置,这几乎总是不是您想要的。相反,您可以传递NSApplicationActivateIgnoringOtherApps
来激活应用程序中最近活动的窗口。 - thomasfuchs