Mostrare un modulo Windows su un monitor secondario?

Sto cercando di impostare un Windows Form sul monitor secondario, come segue:

private void button1_Click(object sender, EventArgs e) { MatrixView n = new MatrixView(); Screen[] screens = Screen.AllScreens; setFormLocation(n, screens[1]); n.Show(); } private void setFormLocation(Form form, Screen screen) { // first method Rectangle bounds = screen.Bounds; form.SetBounds(bounds.X, bounds.Y, bounds.Width, bounds.Height); // second method //Point location = screen.Bounds.Location; //Size size = screen.Bounds.Size; //form.Left = location.X; //form.Top = location.Y; //form.Width = size.Width; //form.Height = size.Height; } 

Le proprietà dei limiti sembrano corrette, ma in entrambi i metodi che ho provato, questo massimizza il modulo sul monitor principale. Qualche idea?

Prova a impostare il parametro WindowStartUpLocation come “manuale” all’interno del metodo SetFormLocation.

 this.Location = Screen.AllScreens[1].WorkingArea.Location; 

questo è il riferimento del Form.

@ La risposta di Gengi è succinta e funziona bene. Se la finestra è ingrandita, non sposta la finestra. Questo snippet risolve il problema (anche se sospetto che le dimensioni “normali” di Windows debbano essere inferiori alle dimensioni dello schermo per far funzionare tutto questo):

  void showOnScreen(int screenNumber) { Screen[] screens = Screen.AllScreens; if (screenNumber >= 0 && screenNumber < screens.Length) { bool maximised = false; if (WindowState == FormWindowState.Maximized) { WindowState = FormWindowState.Normal; maximised = true; } Location = screens[screenNumber].WorkingArea.Location; if (maximised) { WindowState = FormWindowState.Maximized; } } } 

Sei sicuro che le screens[1] siano secondarie? Dare uno screens[0] a provare. Il tuo codice è fondamentalmente corretto.


Ok, ho controllato, dovrai farlo dopo lo Show ():

 n.Show(); setFormLocation(n, screens[1]); 

che dà qualche sfarfallio indesiderato. Ma probabilmente puoi fare:

 n.SetBounds(-100, -100, 10, 10); // or similar n.Show(); setFormLocation(n, screens[1]); 

Per visualizzare il modulo sullo schermo secondario:

  Screen primaryFormScreen = Screen.FromControl(primaryForm); //Use this if you are looking for secondary screen that is not primary Screen secondaryFormScreen = Screen.AllScreens.FirstOrDefault(s => !s.Primary) ?? primaryFormScreen; //Use this if you are looking for screen that is not being used by specific form Screen secondaryFormScreen = Screen.AllScreens.FirstOrDefault(s => !s.Equals(primaryFormScreen)) ?? primaryFormScreen; //Putting the form on the other screen secondaryForm.Left = secondaryFormScreen.Bounds.Width; secondaryForm.Top = secondaryFormScreen.Bounds.Height; //Recommended to use, You can change it back later to the settings you wish secondaryForm.StartPosition = FormStartPosition.Manual; secondaryForm.Location = secondaryFormScreen.Bounds.Location; Point p = new Point(secondaryFormScreen.Bounds.Location.X, secondaryFormScreen.Bounds.Location.Y); secondaryForm.Location = p; secondaryForm.Show(); 

Se non vedi l’ora di una schermata specifica, puoi eseguire il loop su “Screen.AllScreens” e utilizzare la procedura precedente.

L’ho usato per un’applicazione Dual Screen XNA 4 (finestra di gioco XNA a schermo intero + WinForm)

Nel metodo Form_Load (), inserire il seguente codice:

 var primaryDisplay = Screen.AllScreens.ElementAtOrDefault(0); var extendedDisplay = Screen.AllScreens.FirstOrDefault(s => s != primaryDisplay) ?? primaryDisplay; this.Left = extendedDisplay.WorkingArea.Left + (extendedDisplay.Bounds.Size.Width / 2) - (this.Size.Width / 2); this.Top = extendedDisplay.WorkingArea.Top + (extendedDisplay.Bounds.Size.Height / 2) - (this.Size.Height / 2); 

Imposta la proprietà Posizione di avvio modulo su Manuale

  public void MoveWindowToProjector () { Rectangle rectMonitor; // Create New Process Process objProcess = new Process(); //Get All the screens associated with this Monitor Screen[] screens = Screen.AllScreens; // Get Monitor Count int iMonitorCount = Screen.AllScreens.Length; // Get Parameters of Current Project string[] parametros = Environment.GetCommandLineArgs(); // if (parametros.Length > 0) // { //objProcess.StartInfo.FileName = parametros[0]; // objProcess.Start(); // } // Get Window Handle of this Form IntPtr hWnd = this.Handle; Thread.Sleep(1000); if (IsProjectorMode) { if (iMonitorCount > 1) // If monitor Count 2 or more { //Get the Dimension of the monitor rectMonitor = Screen.AllScreens[1].WorkingArea; } else { //Get the Dimension of the monitor rectMonitor = Screen.AllScreens[0].WorkingArea; } } else { rectMonitor = Screen.AllScreens[0].WorkingArea; } if (hWnd != IntPtr.Zero) { SetWindowPos(hWnd, 0, rectMonitor.Left, rectMonitor.Top, rectMonitor.Width, rectMonitor.Height, SWP_SHOWWINDOW); } } 
  Screen[] screens = Screen.AllScreens; sc aoc = new sc(); aoc.Show(); aoc.Location = Screen.AllScreens[INDEX OF YOUR AVAILABLE SCREENS TARGET].WorkingArea.Location; 

PER LO STATO DELLA FINESTRA MASSIMA

 aoc.WindowState = FormWindowState.Maximized; 

PER QUALSIASI POSIZIONE X, Y.

 aoc.Location = new Point(TARGET X POSITION, TARGET Y POSITION);