我需要在cocoa中退出其他应用程序。我有一个来自通知的userInfo字典,告诉我应用程序的名称。我尝试使用terminate和forceTerminate方法,但它们没有用(我认为它们只适用于雪豹。)
答案 0 :(得分:4)
我们使用-[NSWorkspace runningApplications]
。它需要10.6或更高。
void SendQuitToProcess(NSString* named)
{
for ( id app in [[NSWorkspace sharedWorkspace] runningApplications] )
{
if ( [named isEqualToString:[[app executableURL] lastPathComponent]])
{
[app terminate];
}
}
}
否则,您将不得不使用AppleScript。你可以这样做一些粗鲁的事情:
void AESendQuitToProcess(const char* named)
{
char temp[1024];
sprintf(temp, "osascript -e \"tell application \\\"%s\\\"\" -e \"activate\" -e \"quit\" -e \"end tell\"", named);
system(temp);
}
答案 1 :(得分:3)
最佳解决方案(考虑到OS X的最后3-4个版本中可用的所有不同API)将使用AppleScript。只需在Obj-C / Python / Java中生成必要的脚本,无论你实际使用它是什么(我假设Obj-C,因为你特意说'在Cocoa')。并使用NSAppleScript类(一个人为的例子)执行它:
// Grab the appName
NSString *appName = [someDict valueForKey:@"keyForApplicationName"];
// Generate the script
NSString *appleScriptString =
[NSString stringWithFormat:@"tell application \"%@\"\nquit\nend tell",
appName];
// Execute the script
NSDictionary *errorInfo = nil;
NSAppleScript *run = [[NSAppleScript alloc] initWithSource:theScript];
NSAppleEventDescriptor *theDescriptor = [run executeAndReturnError:&errorInfo];
// Get the result if your script happens to return anything (this example
// really doesn't return anything)
NSString *theResult = [theDescriptor stringValue];
NSLog(@"%@",theResult);
这有效地运行了一个脚本(如果appName是'Safari'),如下所示:
tell application "Safari"
quit
end tell
那或查看这个问题
答案 2 :(得分:2)
您可以发送应用程序退出AppleEvent,请求退出应用程序,但我不认为您可以在没有提升权限的情况下强制退出应用程序。查看Scripting Bridge框架,了解最可靠的方式来发送所需的事件。