2009-08-24 9 views
5

Ich schreibe eine Anwendung in C für den Mac (Leopard), die einige Arbeit bei Erhalt von Power-Benachrichtigungen, z. schlafen, aufwachen, herunterfahren, neu starten. Es läuft über launchd als ein Launchagent bei der Anmeldung und beginnt dann mit der Überwachung von Benachrichtigungen. Der Code, den ich mit diesem zu tun ist, wie folgt:Empfangen von Strombenachrichtigungen (insbesondere Herunterfahren) auf Mac OSX

/* ask for power notifications */ 
static void StartPowerNotification(void) 
{ 
    static io_connect_t rootPort; 
    IONotificationPortRef notificationPort; 
    io_object_t notifier; 

    rootPort = IORegisterForSystemPower(&rootPort, &notificationPort, 
             PowerCallback, &notifier); 
    if (!rootPort) 
     exit (1); 

    CFRunLoopAddSource (CFRunLoopGetCurrent(), 
         IONotificationPortGetRunLoopSource(notificationPort), 
         kCFRunLoopDefaultMode); 
} 

/* perform actions on receipt of power notifications */ 
void PowerCallback (void *rootPort, io_service_t y, 
        natural_t msgType, void *msgArgument) 
{ 
    switch (msgType) 
    { 
     case kIOMessageSystemWillSleep: 
      /* perform sleep actions */ 
      break; 

     case kIOMessageSystemHasPoweredOn: 
      /* perform wakeup actions */ 
      break; 

     case kIOMessageSystemWillRestart: 
      /* perform restart actions */ 
      break; 

     case kIOMessageSystemWillPowerOff: 
      /* perform shutdown actions */ 
      break; 
    } 
} 

jedoch nur die oberen zwei für Schlafen und Wachsein (kIOMessageSystemWillSleep und kIOMessageSystemHasPoweredOn) jemals aufgerufen. Ich bekomme nie irgendwelche Benachrichtigungen für Neustart oder Herunterfahren (und kIOMessageSystemWillPowerOff).

Mache ich etwas falsch? Oder gibt es eine andere API, die mir die Benachrichtigungen zum Neustart und zum Herunterfahren geben würde? Ich würde es lieber als ein C-Programm behalten (wie mir das bekannt ist), bin aber offen für vernünftige Vorschläge von Alternativen (Ich habe mir die Login-/Logout-Hooks angeschaut, aber diese scheinen eher verpönt zu sein von launchd).

Vielen Dank im Voraus für jede Hilfe/Tipps!

Antwort

4

Ich weiß, dass Sie für die NSWorkspaceWillPowerOffNotification Benachrichtigung von NSWorkspace registrieren können, die keine C-Funktion ist, funktioniert aber.

#import <AppKit/AppKit.h> 
#import "WorkspaceResponder.h" 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    NSNotificationCenter *nc = [[NSWorkspace sharedWorkspace] notificationCenter]; 
    WorkspaceResponder *mainController = [[WorkspaceResponder alloc] init]; 

    //register for shutdown notications 
    [nc addObserver:mainController 
selector:@selector(computerWillShutDownNotification:) 
      name:NSWorkspaceWillPowerOffNotification object:nil]; 
    [[NSRunLoop currentRunLoop] run]; 
    [pool release]; 
    return 0; 
} 

Dann in WorkspaceResponder.m:

- (void) computerWillShutDownNotification:(NSNotification *)notification { 
    NSLog(@"Received Shutdown Notification"); 
} 
+0

Danke dafür! Weißt du, ob ich ein Fenster- oder Docksymbol brauche, um diese Benachrichtigungen zu erhalten? – binarybob

+1

Nein, das tust du nicht. Ich habe einen Beispielcode hinzugefügt. –

+0

Nochmals vielen Dank Rob, das ist sehr zu schätzen. – binarybob

0

Mit IORegisterForSystemPower bietet nicht die Ereignisse, die Sie suchen. Zitat aus der Funktionsdokumentation:

/*! @function IORegisterForSystemPower

@abstract Verbindet den Anrufer mit dem Root-Power-Domain-IOService für den Empfang von Sleep-Benachrichtigungen für das System &.

Bietet keine Benachrichtigungen zum Herunterfahren und Neustarten des Systems.