如何使用 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启动URL(Objective C)-macosx.com