2011-01-07 11 views

Odpowiedz

3

Zakładając ten jest skierowany do 10,6, można użyć NSRunningApplication wraz z NSWorkspace. Po pierwsze, należy ustalić, czy aplikacja jest już uruchomiona przy użyciu:

[[NSWorkspace sharedWorkspace] runningApplications] 

Jeśli to nie działa, to można go uruchomić za pomocą NSWorkspace, ale polecam nowszą rozmowę, launchApplicationAtURL:options:configuration:error:, która zwróci NSRunningApplication, który cię może użyć do zakończenia aplikacji. Aby uzyskać więcej informacji, patrz NSWorkspace.

7

Jak wcześniej wspomniano jest to dość łatwe do uruchomienia innych aplikacji za pomocą klasy NSWorkspace, na przykład:

- (BOOL)launchApplicationWithPath:(NSString *)path 
{ 
    // As recommended for OS X >= 10.6. 
    if ([[NSWorkspace sharedWorkspace] respondsToSelector:@selector(launchApplicationAtURL:options:configuration:error:)]) 
     return nil != [[NSWorkspace sharedWorkspace] launchApplicationAtURL:[NSURL fileURLWithPath:path isDirectory:NO] options:NSWorkspaceLaunchDefault configuration:nil error:NULL]; 

    // For older systems. 
    return [[NSWorkspace sharedWorkspace] launchApplication:path]; 
} 

trzeba zrobić trochę więcej pracy, aby zamknąć inną aplikację, zwłaszcza jeśli cel jest przed 10,6, ale nie jest to zbyt trudne. Oto przykład:

- (BOOL)terminateApplicationWithBundleID:(NSString *)bundleID 
{ 
    // For OS X >= 10.6 NSWorkspace has the nifty runningApplications-method. 
    if ([[NSWorkspace sharedWorkspace] respondsToSelector:@selector(runningApplications)]) 
     for (NSRunningApplication *app in [[NSWorkspace sharedWorkspace] runningApplications]) 
      if ([bundleID isEqualToString:[app bundleIdentifier]]) 
       return [app terminate]; 

    // If that didn‘t work then try using the apple event method, also works for OS X < 10.6. 

    AppleEvent event = {typeNull, nil}; 
    const char *bundleIDString = [bundleID UTF8String]; 

    OSStatus result = AEBuildAppleEvent(kCoreEventClass, kAEQuitApplication, typeApplicationBundleID, bundleIDString, strlen(bundleIDString), kAutoGenerateReturnID, kAnyTransactionID, &event, NULL, ""); 

    if (result == noErr) { 
     result = AESendMessage(&event, NULL, kAEAlwaysInteract|kAENoReply, kAEDefaultTimeout); 
     AEDisposeDesc(&event); 
    } 
    return result == noErr; 
} 
Powiązane problemy