2009-04-15 9 views

Antwort

7

Siehe this codeproject article.

Der Code in es wird funktionieren, aber standardmäßig auf Ihrem primären Monitor. Um dies zu ändern, müssen Sie die Aufrufe von GetSystemMetrics in Aufrufe GetMonitorInfo ersetzen. Mit GetMonitorInfo können Sie das entsprechende RECT an SetWindowPos übergeben.

Mit GetMonitorInfo können Sie den RECT für jeden Monitor abrufen.

Es gibt eine MSDN Article on Position Apps in Multi-Monitor Setups, die helfen könnte, die Dinge ein bisschen besser zu erklären.

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

Dies funktioniert, erfordert aber einen Verweis auf System.Windows.Forms.dll –

0

Es ist nicht von der Frage deutlich, wenn Sie nach einem Weg suchen, um das Fenster zu dem sekundären Bildschirm zu bewegen und dann Vollbild gehen, oder wenn Sie gerade suchen auf Vollbild-Modus zu unterstützen, was auch immer Monitor das Fenster auf ist (was primär oder sekundär sein kann).

Wenn das später für ein WPF-Fenster, obwohl nicht ganz das gleiche wie Vollbild-Modus, können Sie die Rahmen entfernen, wenn es maximiert ist und den Rahmen wiederherstellen, wenn nicht maximiert. Es muss nicht überprüft werden, welcher Monitor o.ä. angezeigt wird. Die Anzeige der Titel-/Titelleiste wird durch den Grenzzustand gesteuert.

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

Kredit geht an Pavel für seine formularbasierte Antwort in der aktuellen Frage und Nir für seine Antwort in this question.

8

Für WPF-Anwendungen sehen Sie this post. Letztendlich hängt es davon ab, wann der WindowState auf Maximiert gesetzt ist. Wenn Sie es in XAML oder im Fensterkonstruktor festlegen (d. H. Bevor das Fenster geladen wird), wird es immer auf die primäre Anzeige maximiert. Wenn Sie andererseits WindowState auf Maximum setzen, wenn das Fenster geladen wird, wird es auf dem Bildschirm maximiert, auf dem es zuvor maximiert wurde.

+0

** Vielen Dank! ** Das Verschieben des Wiederherstellungsstellungscodes aus dem Fensterklassenkonstruktor in den _Loaded_-Handler half. Das einzige, was ich hinzufügen sollte, ist, dass die Window-Klasse die _LocationChanged_-Benachrichtigung mit den Standardeinstellungen vor dem Senden der _Loaded_-Benachrichtigung sendet. Sie sollten daher die _LocationChanged_-Benachrichtigung überspringen, bis Sie die Fensterposition in _Loaded_ handler wiederherstellen. – Mar

-1

In WPF: Legen Sie die WindowState-Eigenschaft in Normal (nicht maximiert) fest und erstellen Sie das Ereignis Loaded. Für den Fall, schreibt diesen Code:

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

Das setzt voraus, dass der sekundäre Monitor rechts von dem primären Monitor ist. – Paul

32

Erweiterungsmethode ein Fenster zu dem sekundären Monitor zu maximieren (wenn es einen gibt). Nimmt nicht an, dass der sekundäre Monitor System.Windows.Forms.Screen.AllScreens [2] ist;

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

arbeiten wie ein Charme ... – kennyzx

6

Ich bemerke eine Antwort, die die Position in der Loaded-Ereignis tritt für Einstellung, aber dies führt zu flackern, wenn das Fenster der ersten Normal gezeigt wird dann maximiert. Wenn Sie in Ihrem Konstruktor zum SourceInitialized Ereignisse abonnieren und die Position in es handhabt es auf sekundäre Monitoren ohne Flimmern zu maximieren - ich nehme an, dass WPF hier

public MyWindow() 
{ 
    SourceInitialized += MyWindow_SourceInitialized; 
} 

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

Ersatz coords für jeden auf dem sekundären Monitor

Verwandte Themen