Во-первых, обратите внимание, что концепция «Maximized» привязана к одному монитору, поэтому вы не можете по-настоящему развернуть окно на нескольких мониторах. Конечно, в WPF вы можете создать свою собственную оконную раму и нарисовать в ней все, что вам нравится, поэтому, если вы хотите, вы, безусловно, можете заставить пользователя думать, что окно развернуто и охватывает несколько экранов.
Также обратите внимание, что два монитора можно объединить в одно прямоугольное окно только в двух случаях:
- Два монитора имеют одинаковую высоту и имеют конфигурацию, расположенную рядом, или
- Оба монитора имеют одинаковую ширину и могут быть расположены сверху и снизу.
В противном случае вам потребуется использовать два отдельных окна, чтобы покрыть все поверхности обоих мониторов, или использовать большое окно, включающее области, которые не покрыты каким-либо монитором.
Хорошо, вот как получить информацию, необходимую для позиционирования ваших окон:
Сам WPF не предоставляет способ узнать количество мониторов, разрешение или относительное положение. К счастью, мы можем вызвать Win32 напрямую, используя [DllImport]. Чтобы получить разрешение и раскладку монитора, просто:
- Объявите структуру MONITORINFO как структуру в C #
- Объявление DllImports для EnumDisplayMonitors и GetMonitorInfo, оба из которых находятся в User32.dll
- Напишите метод, который вызывает EnumDisplayMonitors и передает делегат, который получает информацию о мониторе и возвращает ее в списке.
Вот основная идея:
List<MONITORINFO> GetAllMonitorInfo()
{
var result = List<MONITORINFO>();
EnumDisplayMonitors(null, null,
(hMonitor, hdcMonitor, lprcMonitor, dwData) =>
{
var info = new MONITORINFO { cbSize = Marshall.Sizeof(typeof(MONITORINFO)) };
GetMonitorInfo(hMonitor, ref info);
result.Add(info);
}, null);
return result;
}
Когда у вас есть координаты монитора, используйте алгоритм по вашему выбору, чтобы выбрать, сколько окон вы хотите создать и какие координаты вы хотите для каждого. Затем создайте окна, используя явные размеры и расположение.
Обратите внимание, что вы, вероятно, захотите использовать rcWork, а не rcMonitor, чтобы не перезаписывать меню "Пуск" и т. Д.
Также обратите внимание, что во многих случаях некоторые из возвращаемых координат будут отрицательными, например, если дополнительный монитор находится слева от основного монитора. Это не проблема: просто используйте координаты, как указано, и ваши окна появятся в правильных местах.