una teclado suspender portatil pasos para pantalla encendido encender desde con computadora computador como boton apagarla apagar windows winapi

teclado - ¿Hay alguna manera de detectar el estado del monitor en Windows(encendido o apagado)?



como encender un computador portatil (8)

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 en función del estado del monitor.

¿Alguien sabe si hay una API para activar o desactivar el estado actual del monitor en Windows (XP / Vista / 2000/2003)?

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

Este hilo intenta usar GetDevicePowerState que, de acuerdo con los documentos de Microsoft, no funciona para los dispositivos de visualización.

En Vista, puedo escuchar GUID_MONITOR_POWER_ON, pero parece que no recibo eventos cuando el monitor se apaga manualmente.

En XP puedo conectarme a WM_SYSCOMMAND SC_MONITORPOWER , buscando el estado 2. Esto solo funciona en situaciones en las que el sistema desencadena el apagado.

La clase WMI Win32_DesktopMonitor no parece ayudar también.

Editar : Aquí hay una discusión sobre comp.os.ms-windows.programmer.win32 indicando que no hay una manera confiable de hacer esto.

Alguien más tiene alguna otra idea?


Con el código Delphi, puede detectar la geometría del monitor no válida mientras el modo en espera está en progreso:

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:

Controlar la geometría antes del modo de espera:

Monitor0: 0, 0, 1600, 900

Monitoree la geometría mientras espera en Deplhi7:

Monitor0: 1637792, 4210405, 31266576, 1637696

Monitoree la geometría mientras espera en DeplhiXE:

Monitor0: 4211194, 40, 1637668, 1637693



Esta es una publicación realmente antigua, pero si puede ayudar a alguien, he encontrado una solución para detectar si una pantalla está disponible o no: la API de Windows de Conexión y Configuración de Pantallas (CCD).

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, PathInfo contiene una propiedad TargetInfo que tiene un indicador de 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.

Aquí un contenedor CCD para .Net


Puede conectar una cámara web, apuntarla a su pantalla y hacer un análisis de las imágenes que recibe;)


Si su monitor tiene algún tipo de hub USB incorporado, puede probar y usar eso para detectar si el monitor está encendido / apagado.
Por supuesto, esto solo funcionará si el concentrador USB no permanece conectado cuando el monitor se considera "apagado".


GetDevicePowerState a veces 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 energía del monitor, salvo escribir un controlador de dispositivo y filtrar todos los IRP de potencia hacia arriba y hacia abajo en la cadena del controlador de la pantalla. Y eso tampoco es muy confiable.


No puedes.

Parezca que todas las capacidades de energía del monitor están conectadas al "modo seguro de energía"
Después de buscar, encontré aquí el código que conecta el mensaje SC_MONITORPOWER y los valores del sistema (número de publicación 2)
Utilizo el código para probar si los valores del sistema cambian cuando desconecto 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.
Ahí está 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 el monitor, no se puede capturar por Windows (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" .