Come si determina su quale monitor è in esecuzione il programma .NET Windows Forms?

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.

Sto usando la class 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.

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

Screen[] screens = Screen.AllScreens; 

Puoi anche capire su quale schermo ti trovi, eseguendo questo codice ( questo è il modulo di Windows in cui ti trovi)

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

in breve, controlla la class Screen ei metodi di supporto statici, potrebbero aiutarti.

MSDN Link , non ha molto … ti consiglio di fare un pasticcio nel codice da solo.

Se ricordi la posizione e le dimensioni 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 1280×1024 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 sei preoccupato che il secondo monitor non sia presente quando l’applicazione viene avviata la prossima volta, puoi utilizzare questo metodo per determinare se la tua finestra interseca uno qualsiasi degli schermi:

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

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

È ansible ottenere la schermata corrente con

 var s = Screen.FromControl(this); 

dove this è il modulo (o qualsiasi controllo sul modulo). 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.

La posizione del modulo ti dirà in quale schermata è inserito il modulo. 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 puoi fare qualcosa del genere:

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

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

Inoltre, forniscono fondamentalmente una funzione che fa altrettanto bene nella class Screen

 Screen screen = Screen.FromControl(form); 

È ansible utilizzare l’object “Schermo”: System.Windows.Forms.Screen

Inizia a giocare con qualcosa del genere:

  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()); } 

Potrebbe farti ciò di cui hai bisogno