2008-10-15 22 views
17

¿Alguien sabe si hay una API para obtener el estado del monitor actual (encendido o apagado) en Windows (XP/Vista/2000/2003)?¿Hay alguna manera de detectar el estado del monitor en Windows (encendido o apagado)?

Todas mis búsquedas parecen indicar que no hay una forma real de hacerlo.

This thread intenta usar GetDevicePowerState que de acuerdo con los documentos de Microsoft no funciona para dispositivos de visualización.

En Vista puedo escuchar GUID_MONITOR_POWER_ON pero parece que no aparece ningún evento cuando el monitor se apaga manualmente.

En XP puedo conectarme al WM_SYSCOMMANDSC_MONITORPOWER, buscando el estado 2. Esto solo funciona en situaciones donde el sistema desencadena la desconexión.

La clase WMI Win32_DesktopMonitor no parece ayudar también.

Editar: Aquí es a discussion en comp.os.ms-windows.programmer.win32 lo que indica que no hay manera segura de hacer esto.

¿Alguien más tiene alguna otra idea?

+0

pregunta relacionada: http://stackoverflow.com/questions/328490/monitoring-a-displays-state-in-python – CesarB

+1

¿Qué está tratando de lograr con esta información? Tal vez podríamos ayudar a resolver el problema real. Saludos. – Mick

+1

Para estimar aproximadamente la potencia consumida por monitores conectados físicamente a una computadora –

Respuesta

11

GetDevicePowerStateveces funciona para monitores. Si está presente, puede abrir el dispositivo \\. \ LCD. Ciérralo inmediatamente después de que hayas terminado con él.

Básicamente, no tiene suerte: no hay una manera confiable de detectar el estado de alimentación del monitor, salvo escribir un controlador de dispositivo y filtrar todos los IRP de alimentación hacia arriba y hacia abajo de la cadena del controlador de la pantalla. Y eso tampoco es muy confiable.

+1

Creo que esta es la respuesta más cercana a la pregunta. Es una falla real de las mfgs de hardware por no darnos ese nivel de comunicaciones en el estándar DVI. –

+0

En serio, ciérrelo inmediatamente después de que haya terminado con él. Una vez rompí el modo de presentación en la computadora portátil de Michael Dell al no hacer eso :) –

7

Antes de hacer nada en función del estado del monitor, recuerde que los usuarios pueden usar una máquina con escritorio remoto de otros sistemas que no requieren un monitor conectado a la máquina, por lo que no desactive ninguna visualización basada en el controlar el estado.

+1

La API de Windows te permite averiguar si un monitor es "real" o no. Ver: DISPLAY_DEVICE_MIRRORING_DRIVER. –

+0

Las aplicaciones de escritorio remoto aún afectan el protector de pantalla, ¿no? (Al menos, RealVNC sí). Sé que las sesiones de escritorio remoto de Windows usan otro sistema, por lo que las cosas pueden variar allí. – Macke

6

No puede.

Look como todas las capacidades de potencia monitor conectado al "modo seguro poder"
después de buscar i encontré here código que la conexión entre SC_MONITORPOWER de mensajes y el sistema de valores (post número 2)
utilizo el código para probar si los valores del sistema cambian cuando apago manualmente el monitor.

int main() 
{ 
    for(;monitorOff()!=1;) 
     Sleep(500); 
    return 0; 
}//main 

Y el código nunca se detiene, sin importar cuánto tiempo me desconecte el monitor.
Allí el código de la función monitorOff:

int monitorOff() 
{ 
    const GUID MonitorClassGuid = 
     {0x4d36e96e, 0xe325, 0x11ce, 
      {0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}}; 

    list<DevData> monitors; 
    ListDeviceClassData(&MonitorClassGuid, monitors); 

    list<DevData>::iterator it = monitors.begin(), 
          it_end = monitors.end(); 
    for (; it != it_end; ++it) 
    { 
     const char *off_msg = ""; 

     //it->PowerData.PD_PowerStateMapping 
     if (it->PowerData.PD_MostRecentPowerState != PowerDeviceD0) 
     { 
      return 1; 
     } 
    }//for 

    return 0; 
}//monitorOff 

Conclusión: cuando se cambia manualmente del monitor, no puedes cogerlo por las ventanas (si no hay una interfaz de controlador inusual para esto), porque todas las capacidades de Windows están conectadas al "modo seguro de energía".

12

Se puede conectar una cámara web, lo señala en su pantalla y hacer un análisis de las imágenes que recibe;)

+3

Pero luego puede confundir las reflexiones con la acción de la pantalla.Creo que está convirtiendo un problema de controlador de dispositivo en un problema de procesamiento de imagen. ME GUSTA :) – cpatrick

+2

Esta técnica se ha utilizado para supervisar bastidores llenos de equipos en ubicaciones remotas. Apunte una cámara al estante y observe los cambios "inusuales" en las luces indicadoras. Su fuerza bruta, pero en algunos casos es la única respuesta razonable. – RBerteig

0

Si el monitor tiene algún tipo de concentrador integrado USB, puede probar y usar eso para detectar si el monitor es apagado en.
Esto, por supuesto, solo funcionará si el concentrador USB no permanece conectado cuando el monitor se considera "apagado".

0

Con código de Delphi, puede detectar geomerty del monitor no válido mientras espera en curso:

i := 0 
('Monitor'+IntToStr(i)+': '+IntToStr(Screen.Monitors[i].BoundsRect.Left)+', '+ 
IntToStr(Screen.Monitors[i].BoundsRect.Top)+', '+ 
IntToStr(Screen.Monitors[i].BoundsRect.Right)+', '+ 
IntToStr(Screen.Monitors[i].BoundsRect.Bottom)) 

Resultados: geometría

monitor antes de espera: la geometría

Monitor0: 0, 0, 1600, 900 

monitor mientras espera en Deplhi7 :

Monitor0: 1637792, 4210405, 31266576, 1637696 
geometría

monitor mientras espera en DeplhiXE:

Monitor0: 4211194, 40, 1637668, 1637693 
0

Este es un post muy viejo, pero si puede ayudar a alguien, he encontrado una solución para detectar una pantalla que está disponible o no: la Conexión y configuración de Muestra (CCD) API de Windows.

Es parte de User32.ddl y las funciones interesantes son GetDisplayConfigBufferSizes y QueryDisplayConfig. Nos da todas las informaciones que se pueden ver en el Panel de Configuración de Windows.

En particular, el PathInfo contiene una propiedad TargetInfo que tiene un indicador targetAvailable. Esta bandera parece estar correctamente actualizada en todas las configuraciones que he probado hasta ahora.

Esto le permite conocer el estado de cada pantalla conectada a la PC y configurar sus configuraciones.

Here a CCD wrapper for .Net

+0

Esto no funcionó para mí con un solo monitor Dell conectado a través de DisplayPort a Windows 10 PC. targetAvailable siempre fue 1 independientemente del estado de alimentación del monitor. Gracias por compartir sus resultados sin embargo. – Greg

Cuestiones relacionadas