She*_*uka 1 cocoa kill appleevents sigkill nsworkspace
我有这个任务,我需要从我的应用程序中杀死另一个我的应用程序,问题是另一个应用程序有一个“终止确认”对话框(没有要保存的关键数据,只有用户退出意愿的确认)。
在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;
}
Run Code Online (Sandbox Code Playgroud)但在<10.6上,此常用的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;
Run Code Online (Sandbox Code Playgroud)
无法强制退出!!!
那你能用什么呢?
您可以使用我在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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2271 次 |
| 最近记录: |