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

Nic*_*ore 7 macos cocoa objective-c

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

ilo*_*aly 5

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

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

CGDisplayIsAsleep(CGMainDisplayID())
Run Code Online (Sandbox Code Playgroud)


Zac*_*ing 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;
Run Code Online (Sandbox Code Playgroud)

IOKit 中有一个函数叫做 getPowerState()。不确定是否可以访问。

希望有帮助。