如何使用Cocoa API启动应用程序并将其置于前台?

18

我对Cocoa编程非常陌生,无法找到以下操作的方法:

  • 通过名称启动特定应用程序
  • 执行一些工作
  • 稍后将我启动的应用程序带到前台进程

从Carbon API中找到的内容显示需要使用launchApplication()和setFrontProcess()。

但是在Cocoa中应该如何实现呢?即启动它,获取PID,将该PID设置为前台进程。我尝试搜索示例却发现了空白...

如果您能提供最简单的示例,那将是太棒了:)

提前感谢。

7个回答

35

启动一个应用程序:

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

我尝试从后台进程以这种方式启动应用程序,但是如果执行此操作的进程不是GUI应用程序,则似乎在Lion或更高版本中无法使用此启动方法。 - Bob Murphy
2
NSApplicationActivateAllWindows选项会导致所有应用程序窗口都前置,这几乎总是不是您想要的。相反,您可以传递NSApplicationActivateIgnoringOtherApps来激活应用程序中最近活动的窗口。 - thomasfuchs

4

要启动一个应用程序,使用NSWorkspace类:NSWorkspace参考文档

具体来说,使用launchApplication:函数。

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


谢谢。那是正确的函数,我看到了,但我找不到一种方法来查找pid并稍后重用它。让我们等一下,也许有人知道答案 :) - dimsuz

1

1

NSRunningApplication可在Mac OS X 10.6或更高版本中使用。

如果您需要支持早期系统,则可以使用诸如GetCurrentProcess()和SetFrontProcess()以及旧的ProcessSerialNumber结构等API来实现。


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:除了新打开的应用之外,隐藏所有其他应用程序。

0

针对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        
            {
            }

我仍在努力寻找了解应用程序的“活动”,“隐藏”等状态的方法,但到目前为止还没有成功。


0

在 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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接