2009-04-15 3 views

ответ

7

См this codeproject article.

Код, там будет работать, но по умолчанию для основного монитора. Чтобы изменить это, вам нужно будет заменить вызовы на GetSystemMetrics будет звонить на GetMonitorInfo. Используя GetMonitorInfo, вы можете получить соответствующий RECT для передачи в SetWindowPos.

GetMonitorInfo позволяет получить RECT для любого монитора.

Существует MSDN Article on Position Apps in Multi-Monitor Setups, что может помочь объяснить ситуацию немного лучше.

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

Это работает, но требует ссылки на System.Windows.Forms.dll –

0

Это не ясно из вашего вопроса, если вы ищете способ, чтобы переместить окно на второй монитор, а затем перейти в полноэкранный, или если вы просто хотите поддерживать полноэкранный режим на любом мониторе окно на (которые могут быть первичными или вторичными).

Если позднее, для окна WPF, хотя и не совсем то же, что и в полноэкранном режиме, вы можете удалить границы при максимальном увеличении и восстановить границу, если она не максимизирована. Нет необходимости проверять, какой монитор и т. Д. Отображение заголовка/заголовка контролируется граничным состоянием.

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

Заслуга Павлу за его основе форм ответа на текущий вопрос и Nir его ответа в this question.

8

Для приложений WPF смотрите this post. В конечном счете это зависит от того, когда WindowState установлен на Maximized. Если вы установите его в XAML или в конструкторе окон (то есть перед загрузкой окна), он всегда будет максимальным на основном дисплее. Если, с другой стороны, вы устанавливаете WindowState Maximized при загрузке окна - он будет максимизироваться на экране, на котором он был максимально увеличен.

+0

** Спасибо! ** Помогло переместить код позиции восстановления из конструктора класса окна в обработчик _Loaded_. Единственное, что я должен добавить, это то, что класс Window отправляет уведомление _LocationChanged_ с настройками по умолчанию перед отправкой уведомления _Loaded_, поэтому вам следует пропустить уведомление _LocationChanged_, пока вы не восстановите позицию окна в обработчике _Loaded_. – Mar

-1

В WPF: установите свойство WindowState в Normal (не Maximixed) и создайте событие Loaded. В этом случае напишите этот код:

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

Предполагается, что вторичный монитор находится справа от основного. – Paul

32

Метод расширения для увеличения окна на дополнительный монитор (если таковой имеется). Не предполагает, что вторичным монитором является 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

работать как шарм ... – kennyzx

6

Я заметил, ответ, который выступает за установлением позиции в нагруженном событии, но это вызывает мерцание, когда окно впервые показано нормально, то до максимума. Если вы подписались на событие SourceInitialized в конструкторе и установить позицию там он будет обрабатывать максимизируя на вторичных мониторах без мерцания - Я предполагаю, что WPF здесь

public MyWindow() 
{ 
    SourceInitialized += MyWindow_SourceInitialized; 
} 

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

Substitute COORDS для любого на своем дополнительном мониторе

Смежные вопросы