如何从Mac上的cocoa应用程序内部启动和终止应用程序
我的Cocoa应用程序需要启动和终止其他应用程序。请让我知道任何可以执行以下操作的示例代码:如何从Mac上的cocoa应用程序内部启动和终止应用程序,cocoa,Cocoa,我的Cocoa应用程序需要启动和终止其他应用程序。请让我知道任何可以执行以下操作的示例代码: 从代码内部启动应用程序 从代码内部终止应用程序 要启动应用程序,请执行以下操作: [[NSWorkspace sharedWorkspace] launchApplication:@"App"]; 从 退出: NSApp应用程序有一个-terminate:method:[NSApp terminate:nil] 从假设这是针对10.6的,您可以使用NSRunningApplication以及NSWor
[[NSWorkspace sharedWorkspace] launchApplication:@"App"];
从
退出:
NSApp应用程序有一个-terminate:method:[NSApp terminate:nil]代码>
从假设这是针对10.6的,您可以使用NSRunningApplication
以及NSWorkspace
。首先,您应该使用以下方法确定应用程序是否已在运行:
[[NSWorkspace sharedWorkspace] runningApplications]
如果它未运行,则可以使用NSWorkspace
启动它,但我建议使用较新的调用launchApplicationAtURL:options:configuration:error:
,该调用将返回一个NSRunningApplication
,您可以使用该调用终止应用程序。有关更多详细信息,请参阅。如前所述,在NSWorkspace类的帮助下启动其他应用程序非常容易,例如:
- (BOOL)launchApplicationWithPath:(NSString *)path
{
// As recommended for OS X >= 10.6.
if ([[NSWorkspace sharedWorkspace] respondsToSelector:@selector(launchApplicationAtURL:options:configuration:error:)])
return nil != [[NSWorkspace sharedWorkspace] launchApplicationAtURL:[NSURL fileURLWithPath:path isDirectory:NO] options:NSWorkspaceLaunchDefault configuration:nil error:NULL];
// For older systems.
return [[NSWorkspace sharedWorkspace] launchApplication:path];
}
为了退出另一个应用程序,您必须做更多的工作,特别是如果目标是10.6之前的版本,但这并不太难。以下是一个例子:
- (BOOL)terminateApplicationWithBundleID:(NSString *)bundleID
{
// For OS X >= 10.6 NSWorkspace has the nifty runningApplications-method.
if ([[NSWorkspace sharedWorkspace] respondsToSelector:@selector(runningApplications)])
for (NSRunningApplication *app in [[NSWorkspace sharedWorkspace] runningApplications])
if ([bundleID isEqualToString:[app bundleIdentifier]])
return [app terminate];
// If that didn‘t work then try using the apple event method, also works for OS X < 10.6.
AppleEvent event = {typeNull, nil};
const char *bundleIDString = [bundleID UTF8String];
OSStatus result = AEBuildAppleEvent(kCoreEventClass, kAEQuitApplication, typeApplicationBundleID, bundleIDString, strlen(bundleIDString), kAutoGenerateReturnID, kAnyTransactionID, &event, NULL, "");
if (result == noErr) {
result = AESendMessage(&event, NULL, kAEAlwaysInteract|kAENoReply, kAEDefaultTimeout);
AEDisposeDesc(&event);
}
return result == noErr;
}
-(BOOL)terminateApplicationWithBundleID:(NSString*)bundleID
{
//对于OS X>=10.6的NSWorkspace,它有一个漂亮的runningApplications方法。
if([[NSWorkspace sharedWorkspace]respondsToSelector:@selector(运行应用程序)])
对于(在[[NSWorkspace sharedWorkspace]运行应用程序]中运行NSRunningApplication*应用程序)
if([bundleID IsequalString:[app bundleID标识符]])
返回[应用程序终止];
//如果这不起作用,那么尝试使用apple事件方法,也适用于OS X<10.6。
AppleEvent事件={typeNull,nil};
常量字符*bundleIDString=[BundleIDUTF8String];
OSStatus result=AEBuildAppleeEvent(kCoreEventClass、kAEQuitApplication、typeApplicationBundleID、bundleIDString、strlen(bundleIDString)、kAutoGenerateReturnID、kAnyTransactionID和event,NULL,“”);
如果(结果==noErr){
结果=AESendMessage(&event,NULL,kAEAlwaysInteract | kAENoReply,kAEDefaultTimeout);
AEDisposeDesc(和事件);
}
返回结果==noErr;
}