Как заставить убить другое приложение в какао Mac OS X 10.5

У меня есть эта задача, из моего приложения мне нужно убить другое мое приложение, проблема в том, что у другого приложения есть диалог подтверждения завершения (нет важных данных для сохранения, только подтверждение намерения пользователя выйти).

  • На 10.6+ вы будете использовать:

    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;
    }
    
  • но на <10.6 это обычно используемое событие Apple:

    // 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;
    

    не может принудительно выйти!!!

Так что вы можете использовать?

1 ответ

Решение

Вы можете использовать этот простой код, который я выкопал на 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;
Другие вопросы по тегам