tamaño redimensionar posicionar pantalla maximizado formularios formulario form control centrar cambiar bloquear apariencia ajustar c# winforms multiple-monitors setbounds

posicionar - redimensionar formulario c#



¿Mostrando un formulario de Windows en un monitor secundario? (8)

Estoy tratando de configurar un Windows Form en el monitor secundario, de la siguiente manera:

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

Las propiedades de los límites parecen correctas, pero en ambos métodos lo he intentado, esto maximiza la forma en el monitor principal. ¿Algunas ideas?


¿Estás seguro de que las screens[1] son tu secundaria? Prueba screens[0] . Tu código es básicamente correcto.

Ok, lo he comprobado, tendrás que hacerlo después del Show ():

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

que da un poco de parpadeo no deseado. Pero probablemente puedas hacer:

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


Establezca la propiedad Formulario de posición de inicio en Manual

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


Intenta configurar el parámetro WindowStartUpLocation como "manual" dentro de tu método SetFormLocation.


La respuesta de @Gengi es sucinta y funciona bien. Si la ventana está maximizada, no mueve la ventana. Este fragmento resuelve eso (aunque sospecho que las dimensiones "normales" de Windows deben ser más pequeñas que las nuevas dimensiones de la pantalla para que esto funcione):

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


Lo usé para una aplicación de pantalla doble XNA 4 (pantalla completa XNA Game Window + WinForm)

En el método Form_Load (), coloque el siguiente código:

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


Para mostrar el formulario en la pantalla secundaria:

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

Si está esperando una pantalla específica, puede hacer un bucle en "Screen.AllScreens" y usar el proceso anterior.


Screen[] screens = Screen.AllScreens; sc aoc = new sc(); aoc.Show(); aoc.Location = Screen.AllScreens[INDEX OF YOUR AVAILABLE SCREENS TARGET].WorkingArea.Location;

PARA EL ESTADO MAXIMIZADO DE VENTANA

aoc.WindowState = FormWindowState.Maximized;

PARA CUALQUIER POSICIÓN X, Y

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


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

esta es la referencia del formulario.