Indo em canvas cheia no monitor secundário

Como você pode programar um aplicativo dotNet Windows (ou WPF) para deixá-lo ir em canvas cheia no monitor secundário?

Método de extensão para maximizar uma janela para o monitor secundário (se houver). Não assume que o monitor secundário seja 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; } } } } 

Para aplicativos do WPF, veja este post . Em última análise, isso depende de quando o WindowState está definido como Maximized. Se você configurá-lo no XAML ou no construtor de janela (ou seja, antes que a janela seja carregada), ele sempre será maximizado na exibição principal. Se, por outro lado, você definir WindowState para Maximized quando a janela for carregada – ela será maximizada na canvas em que ela foi maximizada antes.

Veja este artigo do codeproject.

O código lá vai funcionar, mas padrão para o seu monitor primário. Para alterar isso, você precisará replace as chamadas para GetSystemMetrics chamadas para GetMonitorInfo . Usando GetMonitorInfo, você pode obter o RECT apropriado para passar para SetWindowPos.

GetMonitorInfo permite que você obtenha o RECT para qualquer monitor.

Há um artigo do MSDN sobre aplicativos de posição em configurações de vários monitores que pode ajudar a explicar as coisas um pouco melhor.

Percebo uma resposta que defende a configuração da posição no evento Loaded, mas isso causa cintilação quando a janela é mostrada pela primeira vez como normal e maximizada. Se você assinar o evento SourceInitialized em seu construtor e definir a posição lá, ele irá lidar com a maximização em monitores secundários sem flicker – estou assumindo o WPF aqui

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

Substitua coords por qualquer no seu monitor secundário

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

Não está claro na sua pergunta se você está procurando uma maneira de mover a janela para o monitor secundário e depois ir para a canvas inteira, ou se está apenas olhando para o modo de canvas cheia em qualquer monitor em que a janela esteja (que pode ser primária ou secundária ).

Se o mais tardar, para uma janela do WPF, embora não seja o mesmo que o modo de canvas inteira, você poderá remover as bordas quando ela estiver maximizada e restaurar a borda quando não estiver maximizada. Não há necessidade de verificar qual monitor, etc. A exibição da barra de título / legenda é controlada pelo estado da borda.

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

O crédito vai para Pavel por sua resposta baseada em formulários na pergunta atual e para Nir por sua resposta nesta questão .

No WPF: Defina a propriedade WindowState em Normal (não Maximixed) e crie o evento Loaded. No evento escreva este código:

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