我有一个应用程序实用程序,在没有用户时变得无用。因此,为了节省资源,我希望知道显示何时/是否处于睡眠状态。
有一个关于苹果唤醒/睡眠通知的dedicated article,但它仅处理计算机睡眠而不显示睡眠。
当显示器处于睡眠状态时,应用程序是否可以“休眠”?
谢谢
答案 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, ¬ification);
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似乎能够满足你的要求。