2012-08-16 12 views
7

Sto scrivendo un'applicazione che richiede due display: uno per la centrale, l'altro per l'uscita. Quello che ho è questo: se c'è un solo display, l'applicazione mostra entrambi i moduli, ma se ce ne sono due, il modulo di output va all'altro. Il problema è che questo accade solo all'avvio dell'applicazione. In altre parole, se l'applicazione è già in esecuzione prima della connessione del secondo display, non accade nulla a meno che l'utente non invii manualmente l'output al nuovo display (supponendo che sappiano come farlo). Quello che voglio è che quando un nuovo display è collegato, il modulo di output viene automaticamente inviato ad esso anche mentre l'applicazione è in esecuzione. Penso che abbia a che fare con il polling di una porta in una discussione ma non so come farlo. Qualcuno può aiutare con come farlo? Se c'è una soluzione migliore, la accolgo volentieri.Rileva quando è collegato un nuovo display

(avrei fornito una parte del codice, ma sto scrivendo questo da un telefono)

+0

Si potrebbe creare un loop di polling per controllare regolarmente per un nuovo display in un lavoratore thread in background/sfondo. Per esempio. leggi la proprietà ['Screen.AllScreens'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.screen.allscreens.aspx) ed esegui del codice se diventa'> 1' . –

+0

Questo è quello che pensavo ma ho bisogno di codice su come farlo. Ho problemi con la scrittura di thread. Puoi aiutare? – afaolek

+1

Puoi usare questa classe: http://msdn.microsoft.com/en-us/library/system.windows.forms.screen(v=vs.100).aspx E puoi usare BackgroundWorker: http: // msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.100).aspx – Davio

risposta

8

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

C'è un esempio che dovrebbe aiutare. Provare qualcosa di simile:

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

È possibile includere un timer che controlla per esempio ogni 2 secondi se il numero di schermi è più di uno. Il codice potrebbe essere il seguente:

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

È facile da utilizzare per i principianti in C#.

+0

Questo è sbagliato! Non devi includere alcun timer! – sergiol

+0

Questo non è sbagliato. Funziona.Non è necessario includere alcun timer, questo è giusto, ma per favore sii più specifico, quale codice senza un timer sembrerebbe loike – Paedow

+0

@sergiol È meglio così? – ANeves

0

È possibile utilizzare WndProc e 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); 
    } 

Maggiori informazioni:

Problemi correlati