如何使用 Cocoa api 启动应用程序并将其置于最前面?

Posted

技术标签:

【中文标题】如何使用 Cocoa api 启动应用程序并将其置于最前面?【英文标题】:How to launch application and bring it to front using Cocoa api? 【发布时间】:2010-02-25 09:55:43 【问题描述】:

我对可可编程很陌生,我找不到执行以下操作的方法:

按名称启动特定应用程序 做一些工作 稍后带上我已经开始做前台进程的那个应用程序

从我在 Carbon API 中找到的内容来看,我应该使用的调用是 launchApplication() 和 setFrontProcess()。

但是如何在 Cocoa 中做到这一点? IE。启动它,获取 PID,将该 PID 设置为前端进程。我试图用谷歌搜索示例,但一无所获......

如果你们中的任何人都可以提供一个很棒的简约样本:)

提前致谢。

【问题讨论】:

【参考方案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];

【讨论】:

我试图以这种方式从后台进程启动应用程序,但如果执行此操作的进程不是 GUI 应用程序,这种启动方法似乎在 Lion 或更高版本中不起作用。跨度> NSApplicationActivateAllWindows 选项将导致所有应用程序窗口出现,这几乎总是不是您想要的。相反,您可以传入 NSApplicationActivateIgnoringOtherApps 来激活应用程序中最近处于活动状态的窗口。【参考方案2】:

要启动应用程序,请使用NSWorkspace 类:NSWorkspace Reference

具体来说,launchApplication: 函数。

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

【讨论】:

谢谢。那是正确的功能,是的,我看到了,但是我找不到找到pid并稍后重用它的方法。让我们等待也许有人知道答案:)【参考方案3】:

你查看NSRunningApplication了吗?

【讨论】:

【参考方案4】:

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

如果您必须支持较早的系统,可以使用 GetCurrentProcess() 和 SetFrontProcess() 等 API 以及旧的 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        
            
            

我还在寻找方法来了解应用程序的“活动”、“隐藏”等状态,但直到现在还没有成功。

【讨论】:

【参考方案6】:

在 swift 4 中,您可以使用NSWorkspace.shared.launchApplication(appName:) 打开应用程序。在我的情况下,它也使启动的应用程序位于前面。

你也可以试试:

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

选项andHideOthers:隐藏除新启动的应用之外的所有应用。

【讨论】:

【参考方案7】:

使用 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;

【讨论】:

以上是关于如何使用 Cocoa api 启动应用程序并将其置于最前面?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据到 Cocoa Touch 框架

Cocoa Interface Builder 对象初始化

如何使用Cocoa启动URL(Objective C)-macosx.com

恢复 Python/Cocoa 项目以使用默认的 OSX 10.5 Python (2.5)

Sparkle 框架在启动时不检查更新

Cocoa - 如何检测泛在容器中的变化