2010-04-01 22 views
17

Tengo una aplicación en la que hay un formulario que quiero mostrar en la segunda pantalla.¿Cómo me aseguro de que se muestre un formulario en el monitor "adicional" en un escenario de monitor dual?

Mean Si la aplicación se ejecuta en la pantalla A y cuando hago clic en el menú para mostrar la forma debe aparecer en la pantalla B y lo mismo con si la aplicación se está ejecutando en la pantalla B y cuando hago clic en el menú para mostrar en la pantalla A.

+0

¿Qué pasa si hay tres monitores? – SLaks

+0

la aplicación se ejecutará solo en doble pantalla. – Mohsan

+1

¿Está ** seguro **? ¿Qué sucede cuando uno de tus usuarios compra un tercer monitor? ¿Qué sucede si la aplicación se usa en el Escritorio remoto? – SLaks

Respuesta

37

es necesario utilizar la clase Screen para encontrar una pantalla que la forma original no está encendido, a continuación, establezca la propiedad de la segunda forma Location basado en que la pantalla de Bounds.

Por ejemplo:

var myScreen = Screen.FromControl(originalForm); 
var otherScreen = Screen.AllScreens.FirstOrDefault(s => !s.Equals(myScreen)) 
       ?? myScreen; 
otherForm.Left = otherScreen.WorkingArea.Left + 120; 
otherForm.Top = otherScreen.WorkingArea.Top + 120; 

Esto funcionará para cualquier número de pantallas.

Tenga en cuenta que es posible que la tarjeta de video esté configurada para que Windows vea una pantalla grande en lugar de dos más pequeñas, en cuyo caso esto se vuelve mucho más difícil.

+0

si el formulario original no está disponible ?? – Mohsan

+0

@Mohsan use 'this' – Xander

+0

Tengo dos pantallas configuradas como "extendidas" en mi Windows7. Si uso su código, mi ventana permanecerá en la primera pantalla porque otherScreen.WorkingArea siempre se coloca en (0,0); Tuve que usar otherScreen.Bounds para mover ventanas en la parte superior izquierda de la segunda pantalla. ¿Estoy en lo correcto? – Marco

18

A continuación se muestra una función que le permite mostrar un formulario en cualquier monitor. Para su escenario actual, puede llamar a este showOnMonitor(1);.

Esencialmente, usted tiene que conseguir información de la pantalla de Screen.AllScreens y luego obtener las dimensiones de cada uno, a continuación, coloque el formulario en el que se necesita

function void showOnMonitor(int showOnMonitor) 
{ 
    Screen[] sc; 
    sc = Screen.AllScreens; 

    Form2 f = new Form2(); 

    f.FormBorderStyle = FormBorderStyle.None; 
    f.Left = sc[showOnMonitor].Bounds.Left; 
    f.Top = sc[showOnMonitor].Bounds.Top; 
    f.StartPosition = FormStartPosition.Manual; 

    f.Show(); 
} 

Nota no se olvide de hacer la validación para asegurar que realmente tiene dos pantallas, etc. demás una excepción serán lanzados para acceder sc[showOnMonitor]

+0

Esto todavía no responde completamente la pregunta. – SLaks

+2

Debe ser f.Left = sc [showOnMonitor] .Bounds.Left; f.Top = sc [showOnMonitor] .Bounds.Top; – Wildhorn

11

En el método OnLoad, cambie la Ubicación de la ventana.

protected void Form1_OnLoad(...) { 
    showOnMonitor(1); 
} 

private void showOnMonitor(int showOnMonitor) 
{ 
    Screen[] sc; 
    sc = Screen.AllScreens; 
    if (showOnMonitor >= sc.Length) { 
     showOnMonitor = 0; 
    } 

    this.StartPosition = FormStartPosition.Manual; 
    this.Location = new Point(sc[showOnMonitor].Bounds.Left, sc[showOnMonitor].Bounds.Top); 
    // If you intend the form to be maximized, change it to normal then maximized. 
    this.WindowState = FormWindowState.Normal; 
    this.WindowState = FormWindowState.Maximized; 
} 
+1

¿Por qué no simplemente' this.Location = sc [showOnMonitor] .Bounds.Location'? –

+0

Sí, puedes hacerlo también. – Nap

+0

@Nap, ¿Funciona tu código si conecto el segundo monitor a través del puerto hdmi? –

0

He utilizado este para una aplicación XNA 4 Dual Screen (Pantalla completa XNA Game Ventana + 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); 
Cuestiones relacionadas