2008-10-24 18 views

Respuesta

13

MSDN Device Context Functions

Lo que básicamente tiene que hacer:

uso los EnumDisplayDevices() llamada a la API para enumerar los dispositivos de visualización en el sistema y busque los que no tienen el DISPLAY_DEVICE_ATTACHED_TO_DESKTOP conjunto del indicador (esto incluye ninguna dispositivos que reflejan lo que no todos estarán demostraciones físicas.) Una vez que haya encontrado el dispositivo de visualización que necesita para obtener un modo de visualización válido para cambiarlo a, que puede encontrar esta llamando a la llamada a la API EnumDisplaySettingsEx() - Generalmente se habría mostrar todas las modos disponibles y permiten al usuario elegir sin embargo, en su caso suena como esto puede ser posible difícil que el código y guardar usted un paso adicional. Para el bien del futuro a prueba su aplicación aunque yo sugeriría que tiene esta sean fácilmente intercambiables sin tener que excavar a través la fuente cada vez, una clave de registro sería la opción obvia . Una vez que tenga que salir ordenadas rellenar una estructura DEVMODE pantalla con la información sobre el posicionamiento pantalla (establecer el PelsWidth/altura, posición, DisplayFrequency y BitsPerPel propiedades) a continuación, establecer estas banderas en el miembro campos. Finalmente, llame al ChangeDisplaySettingsEx() con esta estructura de configuración y asegúrese de enviar el restablecimiento y actualizar las marcas de registro. Eso debería ser todo lo que necesita, espero que esto ayuda a ,

DISPLAY_DEVICE estructura de importación utilizando PInvoke

EnumDisplayDevices

EnumDisplaySettingsEx

etc. El resto de ellos funciones de la función de importación función de importación puede se encuentra con una simple búsqueda por nombre.

+0

Hola Pop, puedo usar su método si el monitor secundario ya está activado, pero no puedo' t usarlo para activar el método secundario, siempre falla. ¿Debería este método ser capaz de hacer esto? –

+0

Esto podría ser un problema específico del controlador, el controlador no habilita automáticamente un monitor cuando la API establece algunas configuraciones de monitor válidas. En mi caso, estaba trabajando con una vieja tarjeta Matrox, y no tuve este problema. Puede ser útil buscar algunos documentos específicos del fabricante. –

+0

O mejor aún, formule la pregunta en los foros de desarrollo de controladores de MSDN :) –

2

No tengo la respuesta completa aquí, pero estoy casi seguro de que va a tener que llamar a cabo de .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 quiere, pero que probablemente encontrará en algún lugar de pinvoke.net

1

Estoy buscando la misma solución.He escrito el siguiente código para llamar 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á activado, 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?

11

Si usted tiene Windows 7, a continuación, sólo iniciar un proceso:

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

continuación DisplayChanger.Start();

+0

Funciona para habilitar 1 monitor en el primer adaptador de pantalla pero no en el segundo adaptador de pantalla. –

1

Para habilitar un monitor, ajuste su posición a algo distinto de 0,0, al igual que 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); 
Cuestiones relacionadas