2011-05-23 3 views
3

Je voudraisPerform certains événements système, Mac OS X

  • arrêt
  • Restart
  • Logoff
  • sommeil

Mon système grâce à une application que je fais, Je n'arrive pas à trouver un moyen natif de l'Objective C de le faire et c'est vraiment difficile.

Quelqu'un peut-il me guider sur la meilleure façon de le faire:

J'ai essayé:

NSString *scriptAction = @"restart"; // @"restart"/@"shut down"/@"sleep"/@"log out" 
NSString *scriptSource = [NSString stringWithFormat:@"tell application \"Finder\" to %@", scriptAction]; 
NSAppleScript *appleScript = [[[NSAppleScript alloc] initWithSource:scriptSource] autorelease]; 
NSDictionary *errDict = nil; 
if (![appleScript executeAndReturnError:&errDict]) { 
    // 
} 

qui avait pas de chance du tout, essayé aussi:

NSAppleScript* theScript = [[NSAppleScript alloc] initWithSource: 
          @"Tell application \"Finder\" to restart"]; 
if (theScript != NULL) 
{ 
    NSDictionary* errDict = NULL; 
    // execution of the following line ends with EXC 
    if (YES == [theScript compileAndReturnError: &errDict]) 
    { 
     [theScript executeAndReturnError: &errDict]; 
    } 
    [theScript release]; 
} 

Sans chance

+1

duplication possible de [Shutdown Mac Objective C] (http://stackoverflow.com/questions/4505632/shutdown-mac-objective-c) –

+2

La question technique 1134 devrait vous être utile: http://developer.apple.com /library/mac/#qa/qa1134/_index.html –

+0

Hi Josh. J'ai posté la première question en fait. Totalement oublié à ce sujet. J'ai essayé toutes les méthodes énumérées y compris le q & a un sans la chance –

Répondre

9

J'utilise le code suivant pour plus de 8 ans sans problèmes:

MDRestartShutdownLogout.h:

#import <CoreServices/CoreServices.h> 
/* 
    * kAERestart  will cause system to restart 
    * kAEShutDown  will cause system to shutdown 
    * kAEReallyLogout will cause system to logout 
    * kAESleep   will cause system to sleep 
*/ 
extern OSStatus MDSendAppleEventToSystemProcess(AEEventID eventToSend); 

MDRestartShutdownLogout.m:

#import "MDRestartShutdownLogout.h" 

OSStatus MDSendAppleEventToSystemProcess(AEEventID eventToSendID) { 
    AEAddressDesc targetDesc; 
    static const ProcessSerialNumber kPSNOfSystemProcess = {0, kSystemProcess }; 
    AppleEvent eventReply = {typeNull, NULL}; 
    AppleEvent eventToSend = {typeNull, NULL}; 

    OSStatus status = AECreateDesc(typeProcessSerialNumber, 
     &kPSNOfSystemProcess, sizeof(kPSNOfSystemProcess), &targetDesc); 

    if (status != noErr) return status; 

    status = AECreateAppleEvent(kCoreEventClass, eventToSendID, 
      &targetDesc, kAutoGenerateReturnID, kAnyTransactionID, &eventToSend); 

    AEDisposeDesc(&targetDesc); 

    if (status != noErr) return status; 

    status = AESendMessage(&eventToSend, &eventReply, 
          kAENormalPriority, kAEDefaultTimeout); 

    AEDisposeDesc(&eventToSend); 
    if (status != noErr) return status; 
    AEDisposeDesc(&eventReply); 
    return status; 
} 

Notez que le code ci-dessus est basé sur le code de Technical Q&A QA1134, mais le mien est retravaillé pour utiliser AESendMessage() plutôt que AESend(). AESend() est dans HIToolbox.framework, qui est dans Carbon.framework et n'est donc pas disponible pour les applications 64 bits. (AESendMessage() fait partie du AE.framework en CoreServices).

+0

Fonctionne parfaitement! Merci –

+0

Cela n'a pas fonctionné pour moi :(Utiliser cette fonction avec l'une des actions donnera le statut, lors de l'appel AESendMessage, de -600 '[" procNotFound "] (" aucun processus éligible avec descripteur spécifié ")' Any – Alex

+0

Cela fonctionne parfaitement sans bac à sable, mais une fois que SandBoxing est activé, cela ne fonctionne pas.Quelqu'un peut-il me dire quels sont les droits à activer pour le faire fonctionner. –

0

Cela devrait certainement fonctionner si vous êtes connecté à partir d'une session GUI.

Cela ne fonctionnera pas si vous êtes seulement connecté depuis la session ssh etc, sans l'interface graphique.

Veuillez décrire votre situation plus en détail, quel type d'erreur vous avez eu, etc. Sinon, nous ne pouvons pas vous aider.

+0

Je ne reçois aucune erreur du tout. J'ai correctement câblé tout dans le constructeur de l'interface. Assigné les méthodes et tout. Mais quand il s'agit de la partie où le code s'exécute. Rien ne se passe. Et oui, l'application sera exécutée sur une application basée sur l'interface graphique. –