2010-02-25 20 views
15

soy muy nuevo en una programación de cacao y no puedo encontrar la manera de hacer lo siguiente:¿Cómo iniciar la aplicación y llevarla al frente con la aplicación Cocoa?

  • iniciar una aplicación en particular por su nombre
  • hacer algún trabajo
  • Posteriormente llevar esa solicitud I He empezado a ser el proceso principal

Según lo que he encontrado en Carbon API, parece que las llamadas que debo usar son launchApplication() y setFrontProcess().

¿Pero cómo hacer esto en Cocoa? Es decir. iniciarlo, obtener PID, establecer ese PID como un proceso frontal. Traté de google para ver ejemplos y no encuentro nada ...

Si alguno de ustedes puede proporcionar una muestra minimalista que sería impresionante :)

Gracias de antemano.

Respuesta

29

para iniciar una aplicación:

[[NSWorkspace sharedWorkspace] launchApplication:@"/Applications/Safari.app"]; 

Para activar una aplicación:

NSRunningApplication* app = [NSRunningApplication 
          runningApplicationWithProcessIdentifier: PID]; 
[app activateWithOptions: NSApplicationActivateAllWindows]; 
// or 
NSArray* apps = [NSRunningApplication 
       runningApplicationsWithBundleIdentifier:@"com.bla.blah"]; 
[(NSRunningApplication*)[apps objectAtIndex:0] 
activateWithOptions: NSApplicationActivateAllWindows]; 
+0

Intenté lanzar una aplicación de este modo desde un proceso en segundo plano, pero parece que este método de lanzamiento no funciona en Lion o posterior si el proceso que lo realiza no es una aplicación GUI. –

+1

La opción 'NSApplicationActivateAllWindows' causará que aparezca toda la ventana de la aplicación, que casi siempre no es la que desea. En su lugar, puede pasar 'NSApplicationActivateIgnoringOtherApps' para activar la ventana que estuvo activa más recientemente en la aplicación. – thomasfuchs

4

Para iniciar una aplicación, utilice la clase NSWorkspace: NSWorkspace Reference

En concreto, la función launchApplication:.

No sé la respuesta de la parte de activación de mi cabeza. Puede activar su propia aplicación con -[NSApplication activateIgnoringOtherApps:], pero no sé cómo hacerlo para otras aplicaciones.

+0

Gracias. Esa es la función correcta, sí, lo vi, pero no puedo encontrar una manera de encontrar pid y reutilizarlo más tarde. Esperemos que alguien sepa la respuesta :) – dimsuz

1

NSRunningApplication está disponible en Mac OS X 10.6 o posterior.

Si tiene que admitir sistemas anteriores, esto se puede hacer con API como GetCurrentProcess() y SetFrontProcess() y la estructura de ProcessSerialNumber anterior.

0

Para la versión Swift2

Iniciar aplicación:

let task = NSTask() 
task.launchPath = "/usr/bin/env" 
task.arguments = ["/Applications/TextEdit.app/Contents/MacOS/TextEdit"] 
task.launch() 

para conseguir la aplicación utilizando paquete Identificador:

var apps: [AnyObject] = NSRunningApplication.runningApplicationsWithBundleIdentifier("com.apple.TextEdit") 
    var MyApp: [NSRunningApplication] = apps as! [NSRunningApplication]   
      for app in MyApp   
      { 
      } 

Todavía estoy tratando de encontrar la manera de saber "activa", "ocultar" etc. estado de la aplicación, pero no ha tenido éxito hasta ahora.

0

En swift 4, puede usar NSWorkspace.shared.launchApplication(appName:) para abrir una aplicación. También hace que la aplicación lanzada al frente en mi caso.

También puede probar:

do { 
    try NSWorkspace.shared.launchApplication(at: yourAppURL, 
              options: .andHideOthers, 
              configuration: [:]) 
} catch { 
    printError("Failed to launch the app.") 
} 

Opción andHideOthers: ocultar todas las aplicaciones, excepto el recién lanzado uno.

Cuestiones relacionadas