2009-09-01 15 views
23

estoy tratando de establecer un formulario Windows en el monitor secundario, de la siguiente manera:¿Mostrando un formulario de Windows en un monitor secundario?

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 los dos métodos que he probado, esto maximiza la forma en el monitor principal. ¿Algunas ideas?

+0

Para estar seguro, el WindowState en MatrixView no está * Maximizado *, ¿verdad? –

+0

@Austin No, WindowState es Normal. –

Respuesta

21

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

+2

Sí, haciendo form.StartPosition = FormStartPosition.Manual; Hizo el truco. ¿Alguna idea de por qué? –

+1

@Henk No, es Windows Forms. Aquí hay un enlace: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.startposition(VS.80).aspx –

+3

De MSDN: "Establecer WindowStartupLocation en Manual hace que una ventana se coloque de acuerdo con sus valores de propiedad Izquierda y Superior. Si no se especifican las propiedades Superior o Izquierda, Windows determina sus valores". http://msdn.microsoft.com/en-us/library/system.windows.window.windowstartuplocation.aspx – Sesh

2

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


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

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

que da un poco de parpadeo no deseado. Sin embargo, es probable que pueda hacer:

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

Relativamente seguro: el uso de pantallas [0] y pantallas [1] da el mismo resultado. –

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

Ésta es la referencia de formularios.

+1

(+1) Esta debería ser la respuesta aprobada. Esta línea de código funcionó para mí, pero los otros no: D, sigan el trabajo @Gengi – jkell311

+2

Sin embargo, parece que está ordenado por algún otro criterio que no sea la configuración del monitor de Windows. Mi primaria, por ejemplo, estaba en la posición [1] mientras que mi segundo monitor estaba en [0]. – cvsguimaraes

1

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

¡Increíble hombre genial ...! –

0

Establecer posición formulario de inicio Manual de propiedad a

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

     } 
2

para mostrar la forma 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 recorrer "Screen.AllScreens" y usar el proceso anterior.

7

@ La respuesta de Gengi es sucinta y funciona bien. Si la ventana está maximizada, no mueve la ventana. Este fragmento resuelve que (aunque sospecho que las ventanas de dimensiones "normales" deben ser menores 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; 
      } 
     } 
    } 
-1
Screen[] screens = Screen.AllScreens; 
       sc aoc = new sc(); 
       aoc.Show(); 
    aoc.Location = Screen.AllScreens[INDEX OF YOUR AVAILABLE SCREENS TARGET].WorkingArea.Location; 

DE ESTADO ventana maximizada

aoc.WindowState = FormWindowState.Maximized; 

DE CUALQUIER X, Y POSICIÓN

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