2011-01-07 4 views
8

Мое приложение для какао должно запускать и завершать другие приложения. Пожалуйста, дайте мне знать любой пример кода, который может сделать следующее:Как запустить и завершить приложение из приложения какао на Mac

  1. Запуск приложения внутри Cocoa кода
  2. Прервать приложение внутри какао кода

ответ

3

Если предположить, что это направлено на 10.6, вы можете использовать NSRunningApplication вместе с NSWorkspace. Во-первых, вы должны определить, если приложение уже работает с помощью:

[[NSWorkspace sharedWorkspace] runningApplications] 

Если он не работает, то вы можете запустить его с помощью NSWorkspace, но я рекомендую более новый вызов, launchApplicationAtURL:options:configuration:error:, который будет возвращать NSRunningApplication, который вам может использовать для завершения приложения. См. NSWorkspace для более подробной информации.

7

Как упоминалось ранее, это довольно легко запускать другие приложения с помощью класса NSWorkspace, например:

- (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]; 
} 

Вы должны сделать немного больше работы, чтобы завершить другое приложение, особенно если цель - до 10.6, но это не слишком сложно. Вот пример:

- (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; 
} 
Смежные вопросы