2011-05-12 21 views
7

¿Hay algún evento o notificación que pueda recibir o enganchar cada vez que se conecta o desenchufa un monitor LCD externo desde una computadora portátil con Windows 7?Detectar la pantalla externa conectada o eliminada en Windows 7

La computadora portátil detecta esto y cambia mi pantalla a la pantalla externa y viceversa con ciertos tipos de cambio de tamaño o reposicionamiento, pero ¿está expuesto el sistema operativo para que las aplicaciones puedan proporcionar un controlador, adjuntar un script, etc.?

Si no es así, ¿hay alguna configuración de registro o API que pueda sondear de vez en cuando?

(prefiero programación C + API Win32)

ACTUALIZACIÓN

la respuesta de Mike a continuación, WM_DEVICECHANGE me llevó a RegisterDeviceNotification(), pero estoy luchando para ponerlo en práctica hasta ahora ...

ACTUALIZACIÓN 2

Esta pregunta se ha realizado con diferentes palabras un par de veces, pero no plenamente recibido ninguna respuesta en mi opinión:

+0

Me pregunto si usted fue capaz de avanzar en su búsqueda? – c00000fd

+0

@ user843732: En realidad, poco después de este hilo, viajé por todo el mundo durante un año y medio sin mi pantalla externa, pero recientemente he vuelto y este es nuevamente un proyecto en el que deseo trabajar. Llegué tan lejos como para recibir un mensaje cuando conecto/desconecto el monitor, pero no estoy seguro de cómo comprobar si el monitor lo generó o averiguar cuál fue exactamente el cambio ... – hippietrail

+0

Gracias. Estoy en el mismo barco: puedo recibir una notificación, pero luego la documentación no admite la información recibida. Lo que creo que terminaré haciendo es contar periódicamente el número de monitores que usan 'EnumDisplayMonitors (NULL, NULL ,,);' y si el conteo cambia, entonces esa es su notificación. (Lástima que no se puede llamar a EnumDisplayMonitors desde un servicio. Parece que se debe llamar desde una sesión de usuario interactiva. 'GetSystemMetrics (SM_CMONITORS);' tampoco funciona desde un servicio ...) – c00000fd

Respuesta

2

Usted puede intentar WM_DEVICECHANGE. Si eso no funciona, ejecuta tu ventana y adjunta Spy ++ que registrará todos los mensajes de ventana que recibe. Luego, conecte su monitor y verifique si recibió algún mensaje.

Como alternativa, puede sondear GetSystemMetrics() con SM_CMONITORS.

+0

Gracias Mike. 'WM_DEVICECHANGE' no puede hacerlo solo, ya que solo indica que se ha agregado o eliminado algo y nada más. Pero sus documentos me dirigieron a 'RegisterDeviceNotification()' que parece ser el indicado. No obstante, no es fácil de entender y todos los ejemplos que puedo encontrar son para USB, pero todavía lo intento ... – hippietrail

+1

Esta es una respuesta muy antigua, pero comentaré de todos modos. Solo podría escuchar este mensaje para indicar qué había cambiado y luego usar EnumDisplayMonitors (o algo similar, no es la única herramienta para este trabajo) para recorrer todos los monitores disponibles. – Wug

1

Según this article Windows envía el mensaje WM_DISPLAYCHANGE cuando cambia la resolución de la pantalla y también cuando se agrega o elimina una pantalla.

Si necesita reaccionar a los cambios en el tamaño del escritorio debido a la adición o eliminación del monitor, puede hacerlo en el controlador de este mensaje. El LPARAM le ofrece la nueva resolución de la pantalla en la que se encuentra la ventana. Tenga en cuenta que esta resolución se escalará si utiliza cualquier otra cosa que no sea el 100% para la escala de DPI del sistema y su programa no sea DPI-aware.

Como alternativa, utilice la función EnumDisplayMonitors para obtener la resolución de pantalla de cada monitor conectado y las posiciones relativas de los monitores en el escritorio virtual. Esta función utiliza los valores reales de píxel del dispositivo independientemente de la escala de PPP.

0

Como se ha dicho here:

verá mensajes registrados "UxdDisplayChangeMessage" y "HotplugDetected" (segunda sólo cuando se añade el monitor). Puede usar RegisterWindowMessage para obtener el identificador de estos mensajes.

También hay otros mensajes que puede verificar, simplemente vea la respuesta vinculada.

Cuestiones relacionadas