Może się przyda:
public static class MonitorHelpers
{
private enum MONITOR_DPI_TYPE
{
MDT_EFFECTIVE_DPI,
MDT_ANGULAR_DPI,
MDT_RAW_DPI,
MDT_DEFAULT
}
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
[StructLayout(LayoutKind.Sequential)]
private struct MONITORINFO
{
public uint Size;
public RECT Monitor;
public RECT Work;
public uint Flags;
}
[DllImport("shcore.dll")]
private static extern int GetDpiForMonitor(IntPtr hMonitor, MONITOR_DPI_TYPE dpiType, out uint dpiX, out uint dpiY);
[DllImport("user32.dll")]
private static extern bool EnumDisplayMonitors(IntPtr hdc, IntPtr lprcClip, MonitorEnumDelegate lpfnEnum, IntPtr dwData);
[DllImport("user32.dll")]
private static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFO mi);
private delegate bool MonitorEnumDelegate(IntPtr hMonitor, IntPtr hdcMonitor, ref RECT lprcMonitor, IntPtr dwData);
private static readonly Dictionary<IntPtr, MONITORINFO> MonitorInfos = new Dictionary<IntPtr, MONITORINFO>();
private static bool MonitorEnum(IntPtr hMonitor, IntPtr hdcMonitor, ref RECT lprcMonitor, IntPtr dwData)
{
var monitorInfo = new MONITORINFO();
monitorInfo.Size = (uint)Marshal.SizeOf(monitorInfo);
GetMonitorInfo(hMonitor, ref monitorInfo);
MonitorInfos.Add(hMonitor, monitorInfo);
return true;
}
public static double GetMonitorDiagonal(IntPtr hMonitor)
{
if (MonitorInfos.Count == 0)
EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, MonitorEnum, IntPtr.Zero);
var monitorInfo = MonitorInfos[hMonitor];
GetDpiForMonitor(hMonitor, MONITOR_DPI_TYPE.MDT_RAW_DPI, out var dpiX, out var dpiY);
var sizeX = (monitorInfo.Monitor.Right - monitorInfo.Monitor.Left) / dpiX;
var sizeY = (monitorInfo.Monitor.Bottom - monitorInfo.Monitor.Top) / dpiY;
var diagonal = Math.Sqrt(sizeX * sizeX + sizeY * sizeY);
return diagonal;
}
public static IntPtr[] GetMonitorHandles()
{
EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, MonitorEnum, IntPtr.Zero);
return MonitorInfos.Keys.ToArray();
}
}
class Program
{
static void Main(string[] args)
{
foreach (var hMonitor in MonitorHelpers.GetMonitorHandles())
Console.WriteLine($"{MonitorHelpers.GetMonitorDiagonal(hMonitor)}\"");
}
}