Проверьте, подключен ли второй монитор в .NET (настройка двух мониторов, ноутбук с док-станцией) - PullRequest
3 голосов
/ 22 июля 2011

Вот проблема:

У меня есть приложение ( C # .NET, Windows 7 ), которое запоминает расположение основной формы при выходе.При загрузке настройки извлекаются и применяются.У меня проблема с пользователями, которые запускают установку с двумя мониторами.

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

Мне нужен способпосмотрите, подключен ли второй монитор.


Вот что я уже попробовал:

System.Windows.Forms.Screen.AllScreens - этот массив имеет два монитора, даже если ноутбукотсоединен (я полагаю, это связано с тем, что второй монитор все еще отображается в панели управления -> дисплей)

System.Windows.Forms.SystemInformation.MonitorCount - то же самое относится и к этому свойству.

Спасибо.


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

Мы используем 2x клиентское программное обеспечение на наших ноутбуках для доступа к приложениям, которые работают на сервере,Сам 2x имеет параметр Отключить композицию рабочего стола на вкладке «Совместимость».Если этот флажок снят, второй монитор всегда доступен (даже если ноутбук не отсоединен).

Так что исправлением было включить эту настройку.

Еще раз спасибо

1 Ответ

2 голосов
/ 22 июля 2011

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

  /// <summary>
  /// Returns whether at least the titlebar of a form would be on a viewable portion of the screen
  /// </summary>
  /// <param name="FormLocation">The location of the form</param>
  /// <param name="FormSize">The size of the form</param>
  /// <returns></returns>
  protected bool FormWouldBeVisible(Point FormLocation, Size FormSize)
  {
     //The FromPoint method returns the screen OR CLOSEST SCREEN to the point you give...
     Screen theScreen = Screen.FromPoint(FormLocation);
     int titleBar = SystemInformation.CaptionHeight;
     //Test if enough of the title bar will be visible so that the user can move the form if desired...
     if ((theScreen.Bounds.Bottom >= (FormLocation.Y + titleBar)) && //If the bottom of the screen is below the title bar
           (theScreen.Bounds.Top <= FormLocation.Y) && //If the top of the screen is above the top of the title bar
           (theScreen.Bounds.Left <= (FormLocation.X + FormSize.Width - titleBar)) && //If the left of the screen is left of a little bit of the title bar
           (theScreen.Bounds.Right >= (FormLocation.X + titleBar))) //If the right of the screen is right of a little bit of the title bar
     {
        //The form is moveable
        return true;
     }
     //The point at which the form is to be loaded is not on a visible part of any screen
     else return false;
  }

Затем, когда вы загружаете местоположение вашей формы, передайте точку, в которую вы намереваетесь загрузить ее, и размер вашей формы.Метод вернет true, если форма будет достаточно видимой, чтобы пользователь мог ее переместить, и false в противном случае.Если это неверно, просто поместите его на главном экране.Я использую это для своей программы, используя ноутбук на док-станции с безупречными результатами - но, опять же, если ваши ПК как-то сообщают о дополнительных мониторах, когда их нет, я не знаю, какие будут результаты.Если это действительно так, я подозреваю, что это проблема с док-станцией (или Windows ...), и вы можете не справиться с этим с помощью кода.

...