Как заставить убить другое приложение в какао 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;