How to force kill another application in cocoa Mac OS X 10.5

我的梦境 提交于 2019-12-08 08:04:37

问题


I've this task, from my application i need to kill another my application, the problem is that the other application has a Termination Confirm Dialog (there is no critical data to save, only confirmation of user intent to quit).

  • On 10.6+ you will use:

    bool TerminatedAtLeastOne = false;
    
    // For OS X >= 10.6 NSWorkspace has the nifty runningApplications-method.
    if ([NSRunningApplication respondsToSelector:@selector(runningApplicationsWithBundleIdentifier:)]) {
        for (NSRunningApplication *app in [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.company.applicationName"]) {
            [app forceTerminate];
            TerminatedAtLeastOne = true;
        }
        return TerminatedAtLeastOne;
    }
    
  • but on <10.6 this commonly used Apple Event:

    // If that didn‘t work either... then try using the apple event method, also works for OS X < 10.6.
    AppleEvent event = {typeNull, nil};
    const char *bundleIDString = "com.company.applicationName";
    
    OSStatus result = AEBuildAppleEvent(kCoreEventClass, kAEQuitApplication, typeApplicationBundleID, bundleIDString, strlen(bundleIDString), kAutoGenerateReturnID, kAnyTransactionID, &event, NULL, "");
    
    if (result == noErr) {
        result = AESendMessage(&event, NULL, kAENoReply|kAEAlwaysInteract, kAEDefaultTimeout);
        AEDisposeDesc(&event);
    }
    return result == noErr;
    

    can't Force Quit!!!

So what can you use?


回答1:


You can use this simple code that I've digged out on cocoabuilder:

// If that didn‘t work then try shoot it in the head, also works for OS X < 10.6.
NSArray *runningApplications = [[NSWorkspace sharedWorkspace] launchedApplications];
NSString *theName;
NSNumber *pid;
for ( NSDictionary *applInfo in runningApplications ) {
    if ( (theName = [applInfo objectForKey:@"NSApplicationName"]) ) {
        if ( (pid = [applInfo objectForKey:@"NSApplicationProcessIdentifier"]) ) {
            //NSLog( @"Process %@ has pid:%@", theName, pid );    //test
            if( [theName isEqualToString:@"applicationName"] ) {
                kill( [pid intValue], SIGKILL );
                TerminatedAtLeastOne = true;
            }
        }
    }
}
return TerminatedAtLeastOne;


来源:https://stackoverflow.com/questions/12919389/how-to-force-kill-another-application-in-cocoa-mac-os-x-10-5

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!