Как определить, находится ли приложение Windows вне экрана? - PullRequest
5 голосов
/ 17 октября 2008

Я пытаюсь отладить странную проблему с пользователями, у которых установлена ​​ LogMeIn . Через несколько дней некоторые из моих диалогов, открываемых моим приложением, могут оказаться за кадром. Если бы я мог надежно обнаружить это, я мог бы программно переместить диалоги туда, где они снова видны.

Примечание: это должно работать для нескольких мониторов и использовать Win32 API. Однако, если вы знаете, как сделать это из .NET, я, вероятно, могу экстраполировать оттуда ...

Обновление: Для любопытных упомянутая выше ошибка связана с wxWidgets. Если вы запустите приложение wxWidgets, затем уйдете и отпустите экранную заставку, затем войдите в систему удаленно, используя LogMeIn, а затем попытайтесь открыть диалог из вашего приложения, у вас будут проблемы, если вы используете wxDisplay :: GetFromPoint (pos) или wxWindowBase :: Центр () для позиционирования диалога.

Ответы [ 8 ]

8 голосов
/ 17 октября 2008

Просто используйте MonitorFromWindow с флагом MONITOR_DEFAULTTONULL. Если возвращаемое значение равно нулю, ваше окно не отображается. Впоследствии вы можете передать MONITOR_DEFAULTTONEAREST, чтобы иметь возможность переместить ваше окно на ближайший монитор.

2 голосов
/ 17 октября 2008

Все основы поддержки нескольких мониторов с июня 1997 г. Microsoft Systems Journal:

Расположение объектов на нескольких экранах:

1 голос
/ 28 марта 2011

См. Также Как узнать размеры активного экрана?

Это код, который я использовал в конструкторе форм. Это быстрый способ переместить форму на видимый экран после того, как вы отсоединили свой ноутбук или что-то еще, что вы сделали, чтобы убрать часть экрана. Уточните для собственного потребления.

if (!Screen.FromControl(this).Bounds.Contains(this.Location))
            {
                this.DesktopLocation = new Point(100,100);
            }
1 голос
/ 17 октября 2008

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

1 голос
/ 17 октября 2008

В .NET я бы итерировал на каждом экране в Screen.AllScreen, а затем либо вызывал screen.Bounds.Contains (), передавая прямоугольник формы, если вы хотите убедиться, что все ваше окно находится в пределах (*), или Вызовите screen.Bounds.IntersectsWith (), если вы хотите убедиться, что хотя бы часть вашей формы видна.

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

Это был более длинный ответ. Короче: я не знаю простого способа.

1 голос
/ 17 октября 2008

В .NET вы используете структуру Screen.PrimaryScreen.WorkingArea, чтобы получить границы основного экрана (я думаю, Screen.Screens [x] .WorkingArea для других мониторов), а затем используете свойства Left и Top окно, чтобы узнать, где оно находится (если оно находится за пределами экрана, то верхний и левый угол будет больше, чем [Экран]. Ширина и. Высота.

0 голосов
/ 17 октября 2008

Похоже, GetMonitorInfo () - это Win32-эквивалент предложения Дэнни. Я не уверен, как вы получите HMONITOR для всех мониторов в системе, но похоже, что пример, связанный с документацией, имеет некоторые способы сделать это.

0 голосов
/ 17 октября 2008

Хм. Это может не помочь, но когда я сделал VB, вы могли сделать screen.width и screen.height, а затем window.x и window.y ...

Конечно, я не знаю, как это работает с несколькими мониторами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...