Подтвердить что ты не робот

В полноэкранном режиме на дополнительном мониторе

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Существует статья

Ответ 3

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

Ответ 4

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

Ответ 5

Я замечаю ответ, который защищает установку позиции в событии 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;
}

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

Ответ 6

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

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

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

Ответ 7

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

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