¿Cómo activo un segundo monitor en C #?

¿Es posible habilitar un segundo monitor programáticamente y extender el escritorio de Windows en C #? Necesita hacer el equivalente a activar la checkbox en la imagen a continuación.

texto alternativo http://sofes.miximages.com/c%23/27y8nt5.png

Funciones de contexto del dispositivo MSDN

Lo que básicamente necesitas hacer:

Use la llamada de API EnumDisplayDevices () para enumerar los dispositivos de visualización en el sistema y busque aquellos que no tengan el indicador DISPLAY_DEVICE_ATTACHED_TO_DESKTOP establecido (esto incluirá cualquier dispositivo de duplicación, por lo que no todos serán pantallas físicas). Una vez que haya encontrado el dispositivo de visualización que necesitará para obtener un modo de visualización válido para cambiarlo, puede encontrarlo llamando a la llamada de la API EnumDisplaySettingsEx () – En general, mostraría todos los modos disponibles y le permitiría al usuario elegir, sin embargo, en su caso Suena como que esto puede ser posible para codificar y guardar un paso adicional. Por el bien de su aplicación a prueba de futuro, aunque sugeriría que esto sea fácilmente modificable sin tener que buscar en la fuente cada vez, una clave de registro sería la elección obvia. Una vez que haya resuelto ese problema, llene una estructura de visualización DevMode con la información sobre el posicionamiento de la pantalla (establezca las propiedades PelsWidth / Height, Position, DisplayFrequency y BitsPerPel) y luego configure estos indicadores en el miembro fields. Finalmente, llame a ChangeDisplaySettingsEx () con esta estructura de configuración y asegúrese de enviar el restablecimiento y actualizar los indicadores de registro. Eso debería ser todo lo que necesita, espero que esto ayude,

DISPLAY_DEVICE structure import using PInvoke

Función de importación EnumDisplayDevices

Importación de función EnumDisplaySettingsEx

etc. el rest de las funciones se pueden encontrar con una simple búsqueda por nombre.

Si tiene Windows 7, simplemente inicie un proceso:

  private static Process DisplayChanger = new Process { StartInfo = { CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, FileName = "DisplaySwitch.exe", Arguments = "/extend" } }; 

luego DisplayChanger.Start ();

No tengo la respuesta completa aquí, pero estoy casi seguro de que tendrá que llamar a .Net para hacer esto. Deberá usar Pinvoke para llamar a un dll no administrado. Un gran recurso para esto es pinvoke.net.

Hice una búsqueda rápida y encontré http://www.pinvoke.net/default.aspx/user32/ChangeDisplaySettings.html que probablemente no es exactamente lo que quieres, pero probablemente lo encuentres en algún lugar de pinvoke.net

Estoy buscando la misma solución. He escrito el siguiente código para llamar a ChangeDisplaySettingsEx con PInvoke:

 DEVMODE dm = new DEVMODE(); dm.dmSize = (short)Marshal.SizeOf(dm); dm.dmPelsWidth = 1680; dm.dmPelsHeight = 1050; dm.dmBitsPerPel = 32; dm.dmDisplayFrequency = 60; dm.dmFields = DevModeFields.DM_BITSPERPEL | DevModeFields.DM_PELSWIDTH | DevModeFields.DM_PELSHEIGHT | DevModeFields.DM_DISPLAYFREQUENCY; int res = ChangeDisplaySettingsEx(@"\\.\DISPLAY2", ref dm, IntPtr.Zero, CDS_RESET | CDS_UPDATEREGISTRY, IntPtr.Zero); Console.WriteLine("result = " + res.ToString()); 

Si el monitor ya está habilitado, esto cambia la resolución con éxito. Pero si el monitor ya no está conectado al escritorio, esto no lo activará. Entonces, ¿alguien tiene un ejemplo de código que funciona?

Para habilitar un monitor, establezca su posición en algo diferente a 0,0, como se muestra:

 POINTL enabledPosition = new POINTL(); enabledPosition.x = -1280; enabledPosition.y = 0; dm.dmPosition = enabledPosition; dm.dmFields = DM.Position; res = ChangeDisplaySettingsEx(d.DeviceName, ref dm, IntPtr.Zero, (uint) DeviceFlags.CDS_UPDATEREGISTRY, IntPtr.Zero);