2009-04-15 16 views

Respuesta

7

Ver this codeproject article.

El código no va a funcionar, pero por defecto para el monitor principal. Para cambiar esto, deberá reemplazar las llamadas a GetSystemMetrics llamadas a GetMonitorInfo. Usando GetMonitorInfo, puede obtener el RECT apropiado para pasar a SetWindowPos.

GetMonitorInfo le permite obtener el RECT para cualquier monitor.

Hay un MSDN Article on Position Apps in Multi-Monitor Setups que podría ayudar a explicar las cosas un poco mejor.

5
private void Form1_Load(object sender, EventArgs e) 
{ 
    this.FormBorderStyle = FormBorderStyle.None; 
    this.Bounds = GetSecondaryScreen().Bounds; 
} 

private Screen GetSecondaryScreen() 
{ 
    foreach (Screen screen in Screen.AllScreens) 
    { 
     if (screen != Screen.PrimaryScreen) 
     return screen; 
    } 
    return Screen.PrimaryScreen; 
} 
+0

Esto funciona pero requiere una referencia a System.Windows.Forms.dll –

0

No es claro por su pregunta si usted está buscando una manera de mover la ventana al monitor secundario y luego ir a pantalla completa, o si usted está buscando para soportar el modo de pantalla completa en cualquier monitor de la ventana está en (que puede ser primario o secundario).

Si la última, para una ventana WPF, aunque no es lo mismo que el modo de pantalla completa, puede eliminar los bordes cuando se maximiza y restablecer el borde cuando no se maximiza. No es necesario verificar qué monitor, etc. La visualización de la barra de título/título está controlada por el estado del borde.

protected override void OnStateChanged(EventArgs e) 
    { 
     if (WindowState == WindowState.Maximized) 
     { 
      if (WindowStyle.None != WindowStyle) 
       WindowStyle = WindowStyle.None; 
     } 
     else if (WindowStyle != WindowStyle.SingleBorderWindow) 
      WindowStyle = WindowStyle.SingleBorderWindow; 

     base.OnStateChanged(e); 
    } 

crédito va a Pavel por su respuesta basada en formularios en la pregunta actual y Nir por su respuesta en this question.

8

Para aplicaciones WPF, mire this post. En última instancia, depende de cuándo WindowState está configurado en Maximized. Si lo configura en XAML o en el constructor de la ventana (es decir, antes de que se cargue la ventana) siempre se maximizará en la pantalla principal. Si, por otro lado, establece WindowState en Maximizado cuando se carga la ventana, maximizará en la pantalla en la que se maximizó antes.

+0

** ¡Gracias! ** Se ayudó a mover el código de posición de restauración del constructor de la clase de ventana al controlador _Loaded_. Lo único que debería agregar es que la clase Window envía la notificación _LocationChanged_ con la configuración predeterminada antes de enviar la notificación _Loaded_, por lo que debe omitir la notificación _LocationChanged_ hasta que restablezca la posición de la ventana en _Loaded_ handler. – Mar

-1

En WPF: establezca la propiedad WindowState en Normal (no Maximixed) y cree el evento Cargado. En el caso de escribir este código:

this.Left = SystemParameters.PrimaryScreenWidth + 100; 
this.WindowState = System.Windows.WindowState.Maximized; 
+3

Eso supone que el monitor secundario está a la derecha del primario. – Paul

32

método de extensión para maximizar una ventana al monitor secundario (si lo hay). No supone que el monitor secundario sea System.Windows.Forms.Screen.AllScreens [2];

using System.Linq; 
using System.Windows; 

namespace ExtendedControls 
{ 
    static public class WindowExt 
    { 

     // NB : Best to call this function from the windows Loaded event or after showing the window 
     // (otherwise window is just positioned to fill the secondary monitor rather than being maximised). 
     public static void MaximizeToSecondaryMonitor(this Window window) 
     { 
      var secondaryScreen = System.Windows.Forms.Screen.AllScreens.Where(s => !s.Primary).FirstOrDefault(); 

      if (secondaryScreen != null) 
      { 
       if (!window.IsLoaded) 
        window.WindowStartupLocation = WindowStartupLocation.Manual; 

       var workingArea = secondaryScreen.WorkingArea; 
       window.Left = workingArea.Left; 
       window.Top = workingArea.Top; 
       window.Width = workingArea.Width; 
       window.Height = workingArea.Height; 
       // If window isn't loaded then maxmizing will result in the window displaying on the primary monitor 
       if (window.IsLoaded) 
        window.WindowState = WindowState.Maximized; 
      } 
     } 
    } 
} 
+0

funciona como un encanto ... – kennyzx

6

noto una respuesta que aboga por el establecimiento de la posición en el evento Loaded, pero esto hace que el parpadeo cuando la ventana se muestra primero normal, entonces maximizada. Si se suscribe al evento SourceInitialized en su constructor y establecer la posición en la que hay que se encargará de maximizar en monitores secundarios y sin parpadeo - Asumo WPF aquí

public MyWindow() 
{ 
    SourceInitialized += MyWindow_SourceInitialized; 
} 

void MyWindow_SourceInitialized(object sender, EventArgs e) 
{ 
    Left = 100; 
    Top = 50; 
    Width = 800; 
    Height = 600; 
    WindowState = WindowState.Maximized; 
} 

coords sustituto de ninguna en su monitor secundario

Cuestiones relacionadas