以编程方式检查显示器是否关闭

8

Mac OS X有一种省电功能,可以让操作系统关闭显示器。是否有API可以在代码中检测当前显示器是开启还是关闭状态?


不完全是一个精确的副本;那个问题正在寻找通知,我只想检查当前状态。 - Nick Moore
2个回答

5
我使用了IORegistryExplorer,检查了IOPMrootDomain IOSleepSupported的值,发现在显示器未休眠时为true(这很合理,但我猜上述代码不会返回显示器的当前睡眠状态)。
经过一番搜索,我找到了下面这段代码,似乎可以正确返回主监视器的睡眠状态。
CGDisplayIsAsleep(CGMainDisplayID())

1
使用#include <ApplicationServices/ApplicationServices.h>来访问这些功能。 - Patrick Linskey

4

请查看IOKit的电源管理部分。 http://developer.apple.com/library/mac/#documentation/DeviceDrivers/Conceptual/IOKitFundamentals/PowerMgmt/PowerMgmt.html#//apple_ref/doc/uid/TP0000020-TPXREF104

您可以使用IORegistryExplorer并查找具有所需设置状态信息的节点。Mac上可能存在多个处于不同状态的监视器,因此您必须枚举树以查找所有需要的类类型节点。

睡眠状态在Darwin内核中的IOPMrootDomain.cpp中处理。我相信您可以使用IOKit对其进行探测。 http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/iokit/Kernel/IOPMrootDomain.cpp

类似于:

mach_port_t         masterPort;
io_registry_entry_t     root;
kern_return_t       kr;
boolean_t           flag = false;

kr = IOMasterPort(bootstrap_port,&masterPort);

if ( kIOReturnSuccess == kr ) {
    root = IORegistryEntryFromPath(masterPort,kIOPowerPlane ":/IOPowerConnection/IOPMrootDomain");
    if ( root ) {
        CFTypeRef data;

        data = IORegistryEntryCreateCFProperty(root,CFSTR("IOSleepSupported"),kCFAllocatorDefault,kNilOptions);
        if ( data ) {
            flag = true;
            CFRelease(data);
        }
        IOObjectRelease(root);
    }
}
return flag;

在IOKit中有一个名为getPowerState()的函数。不确定是否可访问。

希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接