2009-08-24 34 views
5

Tôi đang viết một ứng dụng trong C cho Mac (Leopard) cần thực hiện một số công việc khi nhận được thông báo nguồn, ví dụ: ngủ, thức dậy, tắt máy, khởi động lại. Nó chạy qua launchd làm khởi chạy khi đăng nhập, sau đó bắt đầu theo dõi thông báo. Mã Tôi đang sử dụng để làm điều này là như sau:Nhận thông báo nguồn (đặc biệt là tắt máy) trên 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; 
    } 
} 

Tuy nhiên, chỉ có phía trên hai cho giấc ngủ và thức dậy (kIOMessageSystemWillSleepkIOMessageSystemHasPoweredOn) bao giờ được gọi. Tôi không bao giờ nhận được bất kỳ thông báo nào để khởi động lại hoặc tắt máy (kIOMessageSystemWillRestartkIOMessageSystemWillPowerOff).

Tôi có làm gì sai không? Hoặc là có một API mà sẽ cung cấp cho tôi các thông báo khởi động lại và tắt máy? Tôi muốn giữ nó như là một chương trình C (như thats những gì tôi quen thuộc với) nhưng am mở cho bất kỳ gợi ý hợp lý của lựa chọn thay thế (Tôi đã có một cái nhìn đăng nhập/đăng xuất móc nhưng những dường như không được chấp thuận trong lợi của launchd).

Cảm ơn trước vì bất kỳ trợ giúp/mẹo nào!

Trả lời

4

Tôi biết bạn có thể đăng ký thông báo NSWorkspaceWillPowerOffNotification từ NSWorkspace, không phải là chức năng C nhưng hoạt động.

#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; 
} 

Sau đó, trong WorkspaceResponder.m:

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

Cảm ơn vì điều đó! Bạn có biết nếu tôi cần một biểu tượng cửa sổ hoặc bến tàu để nhận các thông báo này không? – binarybob

+1

Không, bạn không biết. Tôi đã thêm một số mã mẫu. –

+0

Cảm ơn Rob lần nữa, điều đó được nhiều người đánh giá cao. – binarybob

0

Sử dụng IORegisterForSystemPower không cung cấp những sự kiện mà bạn tìm kiếm. Trích dẫn từ tài liệu chức năng:

/*! @function IORegisterForSystemPower

@abstract Kết nối người gọi với Tên miền nguồn gốc IOService với mục đích nhận ngủ & thông báo đánh thức cho hệ thống.

Không cung cấp thông báo tắt máy và khởi động lại hệ thống.

Các vấn đề liên quan