using System.Drawing; using System.Runtime.InteropServices; using System.Collections.Generic; using System.Windows.Interop; namespace System.Windows.Forms { public class Screen { private IntPtr hMonitor; private Rectangle bounds; private Rectangle workingArea; public Rectangle Bounds => bounds; public Rectangle WorkingArea => workingArea; internal Screen(IntPtr hMonitor, Rectangle bounds, Rectangle workingArea) { this.hMonitor = hMonitor; this.bounds = bounds; this.workingArea = workingArea; } private static List allScreens; public static Screen[] AllScreens { get { if (allScreens == null) { allScreens = new List(); NativeMethods.EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, MonitorEnum, IntPtr.Zero); } return allScreens.ToArray(); } } private static bool MonitorEnum(IntPtr hMonitor, IntPtr hdcMonitor, ref NativeMethods.RECT lprcMonitor, IntPtr dwData) { var mi = new NativeMethods.MONITORINFOEX(); bool success = NativeMethods.GetMonitorInfo(new HandleRef(null, hMonitor), mi); allScreens.Add(new Screen(hMonitor, new Rectangle(mi.rcMonitor.left, mi.rcMonitor.top, mi.rcMonitor.Width, mi.rcMonitor.Height), new Rectangle(mi.rcWork.left, mi.rcWork.top, mi.rcWork.Width, mi.rcWork.Height))); return true; } public static Screen FromControl(Form form) => FromControl(form.window); public static Screen FromControl(Window window) => FromHandle(new WindowInteropHelper(window).Handle); public static Screen FromHandle(IntPtr handle) { IntPtr hMonitor = NativeMethods.MonitorFromWindow(new HandleRef(null, handle), 2); foreach (var screen in AllScreens) { if (screen.hMonitor == hMonitor) return screen; } return AllScreens[0]; } public static Rectangle GetWorkingArea(Form form) { return FromControl(form).WorkingArea; } } }