2009-07-13 16 views
31

Ho un'applicazione Windows C# che voglio assicurarmi che venga visualizzata su un secondo monitor se l'utente lo sposta su uno. Ho bisogno di salvare la dimensione del modulo principale, la posizione e lo stato della finestra - che ho già gestito - ma ho anche bisogno di sapere su quale schermata si trovava quando l'utente ha chiuso l'applicazione.Come si determina su quale monitor è in esecuzione il programma .NET Windows Forms?

Sto utilizzando la classe Screen per determinare le dimensioni della schermata corrente ma non riesco a trovare nulla su come determinare su quale schermata è stata eseguita l'applicazione.

Modifica: Grazie per le risposte, tutti! Volevo determinare su quale monitor si trovava la finestra, in modo da poter eseguire il controllo corretto dei limiti nel caso in cui l'utente mettesse accidentalmente la finestra all'esterno dell'area di visualizzazione o cambiasse le dimensioni dello schermo in modo tale che il modulo non fosse più completamente visibile.

+0

Se questa non è una domanda simile a http://stackoverflow.com/questions/937298/restoring-window-size -Posizione-con-multiple-monitors – sgmoore

risposta

46

È possibile ottenere una serie di schermi che si utilizza questo codice.

Screen[] screens = Screen.AllScreens; 

È inoltre possibile capire quale schermo ci si trova, eseguendo questo codice (questo è il Windows Form si è in)

Screen screen = Screen.FromControl(this); //this is the Form class 

insomma controllare la classe Screen e statico metodi di supporto, potrebbero aiutarti.

MSDN Link, non ha molto..Io suggerisco di aggirare il codice da solo.

+0

Sì, le persone sembrano dimenticare che Form eredita da Control , quindi Screen.FromControl avrebbe funzionato su di esso. – Powerlord

+4

Forse dovrei riformulare che ... Form eredita da ContainerControl, che eredita da ScrollableControl, che eredita da Control. – Powerlord

+0

Questo è completamente sbagliato – Janie

6

Se si ricorda la posizione e la dimensione della finestra, sarà sufficiente. Quando si imposta la posizione sulla posizione utilizzata in precedenza, se si trova sul secondo monitor, tornerà indietro.

Ad esempio, se si dispone di 2 monitor, entrambi di dimensioni 1280x1024 e si imposta la posizione sinistra della finestra su 2000px, apparirà sul secondo monitor (supponendo che il secondo monitor sia alla destra del primo). :)

Se siete preoccupati per il secondo monitor non essere lì quando l'applicazione viene avviata la prossima volta, è possibile utilizzare questo metodo per determinare se la vostra finestra interseca una delle schermate:

private bool isWindowVisible(Rectangle rect) 
{ 
    foreach (Screen screen in Screen.AllScreens) 
    { 
     if (screen.Bounds.IntersectsWith(rect)) 
      return true; 
    } 
    return false; 
} 

Basta passare in la posizione desiderata della tua finestra e ti dirà se sarà visibile su una delle schermate. Godere!

+1

d'accordo, ma qualche controllo in fase di avvio sarebbe bello, in modo che dopo una riconfigurazione la vostra applicazione non sarà fuori tutto tutti i monitor –

+0

in realtà, se qualcuno rimuove il secondo monitor e la vostra applicazione tenterà di usa Top/Left della sessione precedente quando c'erano due monitor, Windows lo sposterebbe automaticamente sul primo monitor. Quindi, praticamente, non è necessario chiamare il metodoWindowVisible. – SolutionYogi

+0

Accetto Henk - controlla l'esempio che ho aggiunto in modo che tu possa verificare se la tua finestra sarà visibile. :) –

0

È possibile utilizzare l'oggetto 'Screen': System.Windows.Forms.Screen

iniziare a giocare con qualcosa di simile:

 Screen[] screens = Screen.AllScreens; 
     for (int i = 0; i < screens.Length ; i++) 
     { 
      Debug.Print(screens[i].Bounds.ToString()); 
      Debug.Print(screens[i].DeviceName); 
      Debug.Print(screens[i].WorkingArea.ToString()); 
     } 

si può ottenere quello che ti serve

4

è possibile ottenere la schermata corrente con

var s = Screen.FromControl(this); 

dove this è la forma (o qualsiasi controllo del form). Per quanto riguarda il modo in cui ricordarlo è un po 'complicato, ma andrei a cercare l'indice nell'array Screen.AllScreens o forse s.DeviceName. In entrambi i casi, controllare prima di utilizzare le impostazioni all'avvio, per evitare di utilizzare un monitor che è stato disconnesso.

+1

non vorrei andare per la DeviceName, il DeviceName potrebbe cambiare in qualsiasi momento, ad esempio quando si ottiene una nuova scheda video o monitor ... –

+0

li ricevo come \\. \ DISPLAY1 e \\. \ DISPLAY2, su Vista. Ma potrebbe essere diverso per XP, non ne sono sicuro. –

+0

Sono d'accordo, nessuno è veramente sicuro ... ecco perché non lo userei. :) –

3

La posizione del modulo vi dirà che la forma schermo è acceso. Non capisco davvero perché tu abbia bisogno di sapere su quale schermo è acceso, perché se lo ripristini usando la posizione che hai salvato, dovresti semplicemente ripristinare la stessa posizione (forse puoi ampliare il motivo).

Altrimenti si può fare qualcosa di simile:

Screen[] scr = Screen.AllScreens; 
scr[i].Bounds.IntersectsWith(form.Bounds); 

Ogni schermo ha una proprietà Bounds che restituisce un rettangolo. È possibile utilizzare la funzione IntersectsWith() per determinare se il modulo si trova all'interno dello schermo.

Inoltre, si tratta fondamentalmente di fornire una funzione che fa questo e sulla classe Screen

Screen screen = Screen.FromControl(form); 
Problemi correlati