退出可可中的其他应用程序

时间:2011-03-13 19:36:41

标签: cocoa

我需要在cocoa中退出其他应用程序。我有一个来自通知的userInfo字典,告诉我应用程序的名称。我尝试使用terminate和forceTerminate方法,但它们没有用(我认为它们只适用于雪豹。)

3 个答案:

答案 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

那或查看这个问题

Terminating Another App Running - Cocoa

答案 2 :(得分:2)

您可以发送应用程序退出AppleEvent,请求退出应用程序,但我不认为您可以在没有提升权限的情况下强制退出应用程序。查看Scripting Bridge框架,了解最可靠的方式来发送所需的事件。