PowerToys/tools/FancyZonesEditor_DPI_netcore_test/MainWindow.xaml.cs
Seraphima Zykova b8e5ccfb7b
[FancyZones] Editor multi monitor support (#6562)
Co-authored-by: Enrico Giordani <enrico.giordani@gmail.com>
Co-authored-by: Enrico Giordani <enricogior@users.noreply.github.com>
2020-11-17 11:38:19 +03:00

121 lines
4.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Media;
using Microsoft.VisualStudio.Utilities;
namespace FancyZonesEditor_DPI_netcore_test
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
struct ScreenInfo
{
public int MonitorDPI { get; set; }
public double WindowDPI { get; set; }
public Rect Resolution { get; set; }
public Rect WorkArea { get; set; }
public override string ToString()
{
var resolution = String.Format("X:{0,5}, Y:{1,5}, W:{2,5}, H:{3,5}", Resolution.Left, Resolution.Top, Resolution.Width, Resolution.Height);
var workArea = String.Format("X:{0,5}, Y:{1,5}, W:{2,5}, H:{3,5}", WorkArea.Left, WorkArea.Top, WorkArea.Width, WorkArea.Height);
return "Monitor DPI: " + MonitorDPI + " - Resolution: " + resolution + " - WorkArea: " + workArea;
}
}
private List<OverlayWindow> workAreaWindows;
public MainWindow()
{
InitializeComponent();
double primaryMonitorDPI = 96f;
var colors = new Brush[] { Brushes.Green, Brushes.Blue, Brushes.Red };
var screens = System.Windows.Forms.Screen.AllScreens;
List<ScreenInfo> screenInfoList = new List<ScreenInfo>();
workAreaWindows = new List<OverlayWindow>();
var monitors = MonitorsInfo.GetMonitors();
for (int i = 0; i < screens.Length; i++)
{
if (screens[i].Primary)
{
double monitorDPI;
DpiAwareness.GetMonitorDpi(monitors[i].MonitorHandle, out monitorDPI, out monitorDPI);
primaryMonitorDPI = monitorDPI;
break;
}
}
for (int i = 0; i < screens.Length; i++)
{
var monitor = monitors[i];
ScreenInfo screenInfo = new ScreenInfo();
var window = new OverlayWindow
{
Opacity = 0.8,
Background = colors[i % colors.Length],
BorderBrush = Brushes.White,
BorderThickness = new Thickness(4, 4, 4, 4)
};
// get monitor dpi
double monitorDPI;
DpiAwareness.GetMonitorDpi(monitors[i].MonitorHandle, out monitorDPI, out monitorDPI);
screenInfo.MonitorDPI = (int)monitorDPI;
// resolution
screenInfo.Resolution = new Rect(monitor.MonitorInfo.monitor.left, monitor.MonitorInfo.monitor.top,
monitor.MonitorInfo.monitor.width, monitor.MonitorInfo.monitor.height);
// work area
Rect workedArea = new Rect(monitor.MonitorInfo.work.left, monitor.MonitorInfo.work.top,
monitor.MonitorInfo.work.width, monitor.MonitorInfo.work.height);
double scalePosition = 96f / primaryMonitorDPI;
workedArea.X *= scalePosition;
workedArea.Y *= scalePosition;
double scaleSize = 96f / monitorDPI;
workedArea.Width *= scaleSize;
workedArea.Height *= scaleSize;
screenInfo.WorkArea = workedArea;
screenInfo.WindowDPI = window.GetDpiX();
screenInfoList.Add(screenInfo);
// open window
window.Left = workedArea.X;
window.Top = workedArea.Y;
window.Width = workedArea.Width;
window.Height = workedArea.Height;
workAreaWindows.Add(window);
window.Show();
}
MonitorList.ItemsSource = screenInfoList;
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
foreach (OverlayWindow window in workAreaWindows)
{
window.Close();
}
}
}
}