2012-08-16 35 views
7

Estoy escribiendo una aplicación que requiere dos pantallas: una para el panel de control y otra para la salida. Lo que tengo es esto: si solo hay una pantalla, la aplicación muestra ambos formularios, pero si hay dos, la forma de salida va a la otra. El problema es que esto solo ocurre cuando se inicia la aplicación. En otras palabras, si la aplicación ya se está ejecutando antes de que se conecte la segunda pantalla, nada sucede a menos que el usuario envíe la salida a la nueva pantalla manualmente (suponiendo que sepan cómo hacerlo). Lo que quiero es que cuando se conecte una nueva pantalla, el formulario de salida se envíe automáticamente incluso mientras la aplicación se está ejecutando. Creo que tiene que ver con sondear un puerto en un hilo, pero no sé cómo hacerlo. ¿Alguien puede ayudar con cómo hacerlo? Si hay una solución mejor, con mucho gusto lo recibiré.Detectar cuando se conecta una nueva pantalla

(Me hubiera proporcionado alguna parte del código, pero estoy escribiendo esto desde un teléfono)

+0

Se puede crear un bucle de sondeo para comprobar regularmente para una nueva exhibición en un Trabajador de hilo/fondo. P.ej. lea la propiedad ['Screen.AllScreens'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.screen.allscreens.aspx) y ejecute código si se convierte en'> 1' . –

+0

Eso es lo que pensé, pero necesito un código sobre cómo hacerlo. Tengo problemas para escribir hilos. ¿Puedes ayudar? – afaolek

+1

Puede usar esta clase: http://msdn.microsoft.com/en-us/library/system.windows.forms.screen(v=vs.100).aspx Y puede usar BackgroundWorker: http: // msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.100).aspx – Davio

Respuesta

8

Lookie aquí: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc.aspx

Hay un ejemplo que debería ayudarle. Intentar algo como esto:

protected override void WndProc(ref Message m) 
    { 
     const uint WM_DISPLAYCHANGE = 0x007e; 

     // Listen for operating system messages. 
     switch (m.Msg) 
     { 
      case WM_DISPLAYCHANGE: 

       // The WParam value is the new bit depth 
       uint width = (uint)(m.LParam & 0xffff); 
       uint height = (uint)(m.LParam >> 16); 
       break;     
     } 
     base.WndProc(ref m); 
    } 
0

Puede incluir un temporizador que comprueba, por ejemplo, cada 2 segundos si el número de pantallas es más de uno. El código podría verse así:

timer_tick() 
{ 
    if(Screen.AllScreens.Length >= 2) 
    { 
     //run code to use the second screen 
    } 
} 

Es fácil de usar para principiantes en C#.

+0

¡Esto está mal! ¡No tiene que incluir ningún temporizador! – sergiol

+0

Esto no está mal. Funciona.No tiene que incluir ningún temporizador, eso es correcto, pero por favor sea más específico, lo que un código sin temporizador se vería igual – Paedow

+0

@sergiol ¿Es mejor así? – ANeves

0

Usted puede utilizar WndProc y Screen.AllScreens.Length:

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] 
    protected override void WndProc(ref Message m) 
    { 
     if (Screen.AllScreens.Length > 1) //example 
     { 


     } 
     base.WndProc(ref m); 
    } 

Más información:

Cuestiones relacionadas