2009-04-15 17 views

risposta

7

Vedi this codeproject article.

Il codice in là funziona, ma di default per il monitor principale. Per cambiare questo, sarà necessario sostituire le chiamate a GetSystemMetrics effettuerà chiamate a GetMonitorInfo. Utilizzando GetMonitorInfo, è possibile ottenere il RECT appropriato da passare a SetWindowPos.

GetMonitorInfo consente di ottenere il RECT per qualsiasi monitor.

C'è uno MSDN Article on Position Apps in Multi-Monitor Setups che potrebbe aiutare a spiegare le cose un po 'meglio.

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

Funziona ma richiede un riferimento a System.Windows.Forms.dll –

0

Non è chiaro dalla tua domanda, se siete alla ricerca di un modo per spostare la finestra sul monitor secondario e poi andare a schermo intero, o se si sta solo cercando di supportare la modalità a schermo intero su qualsiasi schermo la finestra è su (che può essere primario o secondario).

Se la finestra successiva, per una finestra WPF, sebbene non proprio uguale alla modalità a schermo intero, è possibile rimuovere i bordi quando è ingrandita e ripristinare il bordo quando non ingrandito. Non è necessario verificare per quale monitor, ecc. La visualizzazione della didascalia/barra del titolo è controllata dallo stato del confine.

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

merito va a Pavel per la sua risposta basata su form nella questione attuale e Nir la sua risposta in this question.

8

Per le app WPF, vedere this post. In definitiva dipende da quando WindowState è impostato su Massimizzato. Se lo si imposta in XAML o nel costruttore di finestre (ad esempio prima che la finestra venga caricata) sarà sempre massimizzato sul display principale. Se, al contrario, imposti WindowState su Massimizzato quando la finestra viene caricata, massimizzerà lo schermo su cui è stato ingrandito prima.

+0

** Grazie! ** Spostamento del codice di posizione di ripristino dal costruttore di classi di finestre al gestore _Loaded_ aiutato. L'unica cosa che dovrei aggiungere è che la classe Window invia la notifica _LocationChanged_ con le impostazioni predefinite prima di inviare la notifica _Loaded_, quindi è necessario saltare la notifica _LocationChanged_ finché non si ripristina la posizione della finestra in _Loaded_ handler. – Mar

-1

In WPF: imposta la proprietà WindowState in Normal (non Maximix) e crea l'evento Loaded. Nel caso scrivere questo codice:

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

Ciò presuppone che il monitor secondario si trovi a destra di quello principale. – Paul

32

Metodo di estensione per ingrandire una finestra sul monitor secondario (se ce n'è uno). Non si assume che il monitor secondario sia 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

funziona come un fascino ... – kennyzx

6

ho notato una risposta che sostiene l'impostazione della posizione in caso Loaded, ma questo provoca sfarfallio quando la finestra viene prima mostrato normale, e poi massimizzato. Se si sottoscrive l'evento SourceInitialized nel costruttore e impostare la posizione in là tratterà massimizzare sul monitor secondari senza sfarfallio - Sto assumendo WPF qui

public MyWindow() 
{ 
    SourceInitialized += MyWindow_SourceInitialized; 
} 

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

coordinate sostituire qualsiasi sul monitor secondario

Problemi correlati