Как стать автором
Обновить

Работа с мониторами через WinAPI

Время на прочтение 2 мин
Количество просмотров 7K
Возможности

Используя нижеприведенные классы можно получать информацию о количестве мониторов, их параметрах, а также задавать рабочие области.

Зачем нужно

В частности мне понадобилась подобная функциональность для создания своей панели в WPF, наподобие панели задач. Собрал информацию по интернету и оформил в удобном для себя виде.

Использование

В своей программе пишем:

DisplayDispatcher dispatcher = new DisplayDispatcher();


При этом автоматически произойдет поиск мониторов и определение их параметров. Выведем данные в ListBox:

for (int i = 0; i < dispatcher.Count; i++)
                lbMonitors.Items.Add(String.Format("Экран #{0} ({1}x{2}) {3}", 
                    i, dispatcher[i].ScreenWidth, dispatcher[i].ScreenHeight, 
                    ((dispatcher[i].Availability) ? " Основной" : "")));


Кроме ширины и выоты также доступны данные о занимаемой области на виртуальном рабочем столе (MonitorArea) и рабочей области на нем же (WorkArea).

Теперь для примера изменим рабочую область основного монитора:

Rect wa = new Rect { left = 0, right = 0, top = 500, bottom = 500 };
dispatcher.GetMainDisplay().ApplyNewWorkArea(wa);


Если попробовать после этого максимизировать любое окно на основном мониторе, оно впишется в прямоугольник (0; 0)-(500; 500).

Немного по теории

Монитор, чья рабочая область будет изменена, определяется автоматически. Для того чтобы изменить область конкретного монитора новые размеры должны вписываться в занимаемое положение на виртуальном рабочем столе. Т.е. WorkArea должен быть вписан в MonitorArea.
Конкретно же в предлагаемом коде, рабочая область задается обращением к нужному монитору, и проверка проводится до вызова WinAPI функций.

Для расширения WinAPI функциональности рекомендую сайт www.pinvoke.net.

Скачать исходники (VS2010)

Кроме описанного в программе можно обрисовать текущую рабочую область выбранного монитора.

P.S. Не нашел ответ, можно ли вызвать автоматическую перерисовку активных окон, с учетом новых размеров рабочей области, буду благодарен если кто напишет как сделать(не используя перебор окон через EnumWindows).
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
+14
Комментарии 16
Комментарии Комментарии 16

Публикации

Истории

Работа

.NET разработчик
65 вакансий

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн