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

时间:2011-02-09 16:42:45

标签: objective-c cocoa macos

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

2 个答案:

答案 0 :(得分:4)

我使用了IORegistryExplorer并检出了IOPMrootDomain IOSleepSupported值,并且当监视器没有睡眠时它注册为true(这是有道理的,但我猜想上面的代码不会返回监视器的当前睡眠状态)

经过一些搜索后,我发现这段代码似乎正确地返回了主监视器的睡眠状态

CGDisplayIsAsleep(CGMainDisplayID())

答案 1 :(得分:3)

查看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()的函数。不确定它是否可访问。

希望有所帮助。