Как определить, на каком мониторе запущена моя программа .NET Windows Forms? - PullRequest
40 голосов
/ 13 июля 2009

У меня есть приложение C # для Windows, которое я хочу, чтобы оно отображалось на втором мониторе, если пользователь переместит его на один монитор. Мне нужно сохранить размер главной формы, ее расположение и состояние окна, которое я уже обработал, но мне также нужно знать, на каком экране она была, когда пользователь закрыл приложение.

Я использую класс Screen для определения размера текущего экрана, но не могу найти информацию о том, как определить, на каком экране запущено приложение.

Редактировать: Спасибо за ответы, все! Я хотел определить, на каком мониторе было включено окно, чтобы я мог выполнить правильную проверку границ в случае, если пользователь случайно разместил окно за пределами области просмотра или изменил размер экрана таким образом, чтобы форма больше не была полностью видимой.

Ответы [ 5 ]

54 голосов
/ 13 июля 2009

Вы можете получить массив экранов, которые вы используете с помощью этого кода.

Screen[] screens = Screen.AllScreens;

Вы также можете определить, на каком экране вы находитесь, запустив этот код ( это - это форма окна, в которой вы находитесь)

Screen screen = Screen.FromControl(this); //this is the Form class

Вкратце ознакомьтесь с классом Screen и статическими вспомогательными методами, они могут вам помочь.

MSDN Link , не так много ... Я предлагаю поиграть в коде самостоятельно.

8 голосов
/ 13 июля 2009

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

Например, если у вас есть 2 монитора, оба размером 1280x1024, и вы установили левое положение окна в 2000px, оно появится на втором мониторе (если второй монитор находится справа от первого.) 1003 *

Если вас беспокоит, что второй монитор не будет присутствовать при следующем запуске приложения, вы можете использовать этот метод, чтобы определить, пересекает ли ваше окно какой-либо из экранов:

private bool isWindowVisible(Rectangle rect)
{
    foreach (Screen screen in Screen.AllScreens)
    {
        if (screen.Bounds.IntersectsWith(rect))
            return true;
    }
    return false;
}

Просто перейдите в нужное место вашего окна, и оно скажет вам, будет ли оно видно на одном из экранов. Наслаждайтесь!

5 голосов
/ 13 июля 2009

Вы можете получить текущий экран с

var s = Screen.FromControl(this);

, где this - это Форма (или любой элемент управления в Форме). Что касается того, как запомнить это немного сложно, но я бы пошел на индекс в массиве Screen.AllScreens, или, возможно, s.DeviceName. В любом случае, проверьте перед использованием параметров при запуске, чтобы предотвратить использование монитора, который был отключен.

4 голосов
/ 13 июля 2009

Расположение формы скажет вам, на каком экране находится форма. Я не совсем понимаю, почему вам нужно знать, на каком экране он находится, потому что если вы восстанавливаете его, используя местоположение, которое вы сохранили, его просто нужно восстановить в том же месте (может быть, вы объясните почему).

В противном случае вы можете сделать что-то вроде этого:

Screen[] scr = Screen.AllScreens;
scr[i].Bounds.IntersectsWith(form.Bounds);

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

Кроме того, они в основном предоставляют функцию, которая делает это также в классе Screen

Screen screen = Screen.FromControl(form);
1 голос
/ 13 июля 2009

Вы можете использовать объект «Экран»: System.Windows.Forms.Screen

Начните играть с чем-то вроде этого:

        Screen[] screens = Screen.AllScreens;
        for (int i = 0; i < screens.Length ; i++)
        {
            Debug.Print(screens[i].Bounds.ToString());
            Debug.Print(screens[i].DeviceName);
            Debug.Print(screens[i].WorkingArea.ToString());
        }

Это может дать вам то, что вам нужно

...