Возможности
Используя нижеприведенные классы можно получать информацию о количестве мониторов, их параметрах, а также задавать рабочие области.
Зачем нужно
В частности мне понадобилась подобная функциональность для создания своей панели в 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).