2009-04-15 4 views

Répondre

7

Voir this codeproject article.

Le code là fonctionnera, mais par défaut à votre moniteur principal. Pour modifier cela, vous devrez remplacer les appels à GetSystemMetrics par des appels au GetMonitorInfo. À l'aide de GetMonitorInfo, vous pouvez obtenir le RECT approprié à transmettre à SetWindowPos. GetMonitorInfo vous permet d'obtenir le RECT pour n'importe quel moniteur. Il y a un MSDN Article on Position Apps in Multi-Monitor Setups qui pourrait aider à expliquer les choses un peu mieux.

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

Cela fonctionne mais nécessite une référence à System.Windows.Forms.dll –

0

On ne sait pas de votre question si vous êtes à la recherche d'un moyen de déplacer la fenêtre vers le moniteur secondaire puis passer en plein écran, ou si vous êtes à la recherche pour supporter le mode plein écran sur moniteur que la fenêtre est (qui peut être primaire ou secondaire). Si ce n'est pas le cas, pour une fenêtre WPF, mais pas tout à fait en mode plein écran, vous pouvez supprimer les bordures quand elles sont agrandies et restaurer la bordure lorsqu'elles ne sont pas agrandies. Pas besoin de vérifier quel moniteur, etc. L'affichage de la légende/barre de titre est contrôlé par l'état de la bordure.

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

Le crédit va à Pavel pour sa réponse basée sur les formulaires dans la question actuelle et Nir sa réponse à this question.

8

Pour les applications WPF, consultez this post. En fin de compte, cela dépend du moment où WindowState est défini sur Maximized. Si vous le définissez en XAML ou dans un constructeur de fenêtre (c'est-à-dire avant le chargement de la fenêtre), il sera toujours maximisé sur l'affichage principal. Si, d'un autre côté, vous définissez WindowState sur Maximized lorsque la fenêtre est chargée, elle maximisera sur l'écran sur lequel elle a été agrandie auparavant.

+0

** Merci! ** Le déplacement du code de position de restauration du constructeur de classe de fenêtre vers le gestionnaire _Loaded_ a aidé. La seule chose que je devrais ajouter est que la classe Window envoie la notification _LocationChanged_ avec les paramètres par défaut avant d'envoyer la notification _Loaded_, donc vous devez ignorer la notification _LocationChanged_ jusqu'à ce que vous restauriez la position de la fenêtre dans le gestionnaire _Loaded_. – Mar

-1

Dans WPF: Définissez la propriété WindowState dans Normal (non Maximixed) et créez l'événement Loaded. Dans l'événement, écrivez ce code:

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

Cela suppose que le moniteur secondaire se trouve à la droite du moniteur principal. – Paul

32

Méthode d'extension pour agrandir une fenêtre vers le moniteur secondaire (s'il y en a un). Ne suppose pas que le moniteur secondaire est 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

fonctionne comme un charme ... – kennyzx

6

je remarque une réponse qui préconise la création de la position en cas Loaded, mais cela provoque le scintillement lorsque la fenêtre est d'abord montrée normale puis agrandie. Si vous êtes abonné à l'événement SourceInitialized dans votre constructeur et définissez la position là, il se chargera maximiser sur les écrans secondaires sans scintillement - Je suppose WPF ici

public MyWindow() 
{ 
    SourceInitialized += MyWindow_SourceInitialized; 
} 

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

coords Remplacez tout sur votre moniteur secondaire