检查显示器是处于睡眠状态还是接收睡眠通知

时间:2011-02-08 04:58:06

标签: objective-c cocoa macos

我有一个应用程序实用程序,在没有用户时变得无用。因此,为了节省资源,我希望知道显示何时/是否处于睡眠状态。

有一个关于苹果唤醒/睡眠通知的dedicated article,但它仅处理计算机睡眠而不显示睡眠。

当显示器处于睡眠状态时,应用程序是否可以“休眠”?

谢谢

3 个答案:

答案 0 :(得分:9)

DisplayWrangler服务会在显示屏关机时发送通知:

// Doesn't include error checking - just a quick example
io_service_t displayWrangler;
IONotificationPortRef notificationPort;
io_object_t notification;

displayWrangler = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceNameMatching("IODisplayWrangler");
notificationPort = IONotificationPortCreate(kIOMasterPortDefault);
IOServiceAddInterestNotification(notificationPort, displayWrangler, kIOGeneralInterest, displayPowerNotificationsCallback, NULL, &notification);

CFRunLoopAddSource (CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(notificationPort), kCFRunLoopDefaultMode);
IOObjectRelease (displayWrangler);

然后回调看起来像这样:

void displayPowerNotificationsCallback(void *refcon, io_service_t service, natural_t messageType, void *messageArgument)
{
   switch (messageType) {
   case kIOMessageDeviceWillPowerOff :
      // This is called twice - once for display dim event, then once 
      // for display power off
      break;
   case kIOMessageDeviceHasPoweredOn :
      // Display powering back on
      break;
   }
}

答案 1 :(得分:5)

这是对前一段时间提出的问题的回答 - 但我认为添加答案会很有用。

NSWorkspace有几个关于何时显示唤醒和睡眠的通知:NSWorkspaceScreensDidSleepNotification和NSWorkspaceScreensDidWakeNotification

答案 2 :(得分:1)

由于我无法找到显示器发出的任何呼叫进入睡眠状态(屏幕保护程序可能会这样做?很可能在系统进入睡眠状态之前启动),我建议手动检测空闲时间然后将其与显示器睡眠设置进行比较。 This article介绍了如何从IOKit获取空闲时间,您应该能够轻松获取当前的睡眠设置,例如用“pmset -g | grep sleep”。

发布上述内容两分钟后,我发现了一个开源命令行工具,它可能会帮助你实现目标:SleepWatcher似乎能够满足你的要求。