Переход на полноэкранный режим на дополнительном мониторе - PullRequest
25 голосов
/ 16 апреля 2009

Как можно запрограммировать приложение dotNet для Windows (или WPF), чтобы оно работало на дополнительном мониторе в полноэкранном режиме?

Ответы [ 7 ]

33 голосов
/ 10 октября 2011

Метод расширения для максимизации окна на дополнительном мониторе (если он есть). Не предполагает, что вторичным монитором является 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;
            }
        }
    }
}
9 голосов
/ 14 апреля 2011

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

7 голосов
/ 04 августа 2016

Я заметил ответ, в котором предлагается установить позицию в событии Loaded, но это вызывает мерцание, когда окно сначала отображается нормальным, а затем развернутым. Если вы подпишитесь на событие 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;
}

Замените координаты для любого на вашем дополнительном мониторе

7 голосов
/ 16 апреля 2009

См. эту статью проекта кода.

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

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

Существует статья MSDN о приложениях определения местоположения в настройках нескольких мониторов , которая может помочь объяснить вещи немного лучше.

5 голосов
/ 07 сентября 2009
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 голосов
/ 14 апреля 2011

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

this.Left = SystemParameters.PrimaryScreenWidth + 100;
this.WindowState = System.Windows.WindowState.Maximized;
0 голосов
/ 09 февраля 2010

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

Если позднее, для окна 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);
    }

Благодарность предоставляется Павлу за его ответ на основе форм в текущем вопросе и Ниру за его ответ в на этот вопрос .

...