2011-02-09 11 views
7

Mac OS X tiene una función de ahorro de energía que permite que el sistema operativo apague el monitor. ¿Hay una API para detectar en el código si el monitor está actualmente encendido o apagado?Compruebe de forma programática si el monitor está apagado

+0

posible duplicado de [Comprobar si la pantalla está en el sueño o recibir notificaciones de sueño] (http : //stackoverflow.com/questions/4929731/check-if-display-is-at-sleep-or-receive-sleep-notifications) –

+0

No es exactamente un duplicado exacto; esa pregunta es buscar notificaciones, solo quiero verificar el estado actual. –

Respuesta

3

Consulte la sección de administración de energía de IOKit. http://developer.apple.com/library/mac/#documentation/DeviceDrivers/Conceptual/IOKitFundamentals/PowerMgmt/PowerMgmt.html#//apple_ref/doc/uid/TP0000020-TPXREF104

Es posible que pueda utilizar IORegistryExplorer y buscar un nodo con información de estado sobre la configuración que está buscando. Puede haber múltiples monitores en una Mac en diferentes estados, por lo que debe enumerar el árbol buscando todos los nodos con el tipo de clase que necesita.

El estado de suspensión se maneja en IOPMrootDomain.cpp en el Kernel de Darwin. Puedes probarlo con IOKit, creo. http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/iokit/Kernel/IOPMrootDomain.cpp

Algo así como:

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; 

Hay una función en IOKit llama getPowerState(). No estoy seguro si es accesible.

Espero que ayude.

+0

Genial, echaré un vistazo a esto. Gracias. –

4

Utilicé el IORegistryExplorer y compruebo el valor IOPMrootDomain IOSleepSupported y se registró como verdadero mientras el monitor no estaba dormido (lo que tendría sentido, pero supongo que el código anterior no devolvería el estado de reposo actual del monitor)

Después de un poco de búsqueda me encontré con este pedazo de código que parece volver adecuadamente el estado de sueño del monitor principal

CGDisplayIsAsleep(CGMainDisplayID()) 
+0

'#include ' para obtener acceso a estas funciones. –

Cuestiones relacionadas