2011-03-13 14 views
5

Ho bisogno di chiudere altre applicazioni nel cacao. Ho un dizionario utente di Info da una notifica che mi dice il nome dell'applicazione. Ho provato i metodi a terminare ea forzare i terminali, ma non hanno funzionato (penso che siano disponibili solo nel leopardo delle nevi)Chiudere altre applicazioni nel cacao

+0

Se non si dispone di 300 punti come si può fare una taglia? –

+2

@boyfarrell - Ho messo la taglia su di essa. – pasawaya

risposta

2

È possibile inviare l'applicazione a uscire da AppleEvent, richiedendo l'uscita dall'applicazione, ma non credo può forzare un'applicazione a uscire senza privilegi elevati. Dai uno sguardo al framework Scripting Bridge per il modo più cacao-y per inviare gli eventi richiesti.

3

Utilizziamo -[NSWorkspace runningApplications]. Richiede 10.6 o superiore.

void SendQuitToProcess(NSString* named) 
{ 

    for (id app in [[NSWorkspace sharedWorkspace] runningApplications]) 
    { 
     if ([named isEqualToString:[[app executableURL] lastPathComponent]]) 
     { 
      [app terminate]; 
     } 
    } 

} 

in caso contrario, è necessario utilizzare AppleScript. Si può fare qualcosa di simile banale:

void AESendQuitToProcess(const char* named) 
{ 
    char temp[1024]; 

    sprintf(temp, "osascript -e \"tell application \\\"%s\\\"\" -e \"activate\" -e \"quit\" -e \"end tell\"", named); 

    system(temp); 
} 
+0

Sembra buono, lo proverò più tardi oggi. – pasawaya

3

La soluzione migliore (contabilità per tutti i diversi di API disponibili negli ultimi 3-4 versioni di OS X) sta per essere utilizzando AppleScript. Basta generare lo script necessario in Obj-C/Python/Java, qualunque cosa tu stia effettivamente usando (sto assumendo Obj-C dal momento che hai detto esplicitamente "In Cocoa"). Ed eseguirla utilizzando la classe NSAppleScript (un esempio inventato):

// Grab the appName 
NSString *appName = [someDict valueForKey:@"keyForApplicationName"]; 
// Generate the script 
NSString *appleScriptString = 
    [NSString stringWithFormat:@"tell application \"%@\"\nquit\nend tell", 
           appName]; 
// Execute the script 
NSDictionary *errorInfo = nil; 
NSAppleScript *run = [[NSAppleScript alloc] initWithSource:theScript]; 
NSAppleEventDescriptor *theDescriptor = [run executeAndReturnError:&errorInfo]; 
// Get the result if your script happens to return anything (this example 
// really doesn't return anything) 
NSString *theResult = [theDescriptor stringValue]; 
NSLog(@"%@",theResult); 

Questo viene eseguito in modo efficace uno script che (se appName era 'Safari') si presenta come:

tell application "Safari" 
quit 
end tell 

Quella dell'arrivo o della partenza questo SO domanda

Terminating Another App Running - Cocoa

+0

Questo era buono ma non funziona per tutte le app, quindi ho fatto un upvoted ma non ho assegnato il bounty. – pasawaya

Problemi correlati