using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Windows; using HandyControl.Tools.Interop; namespace HandyControl.Tools; internal class ScreenHelper { internal static void FindMaximumSingleMonitorRectangle(Rect windowRect, out Rect screenSubRect, out Rect monitorRect) { var windowRect2 = new InteropValues.RECT(windowRect); FindMaximumSingleMonitorRectangle(windowRect2, out var rect, out var rect2); screenSubRect = new Rect(rect.Position, rect.Size); monitorRect = new Rect(rect2.Position, rect2.Size); } private static void FindMaximumSingleMonitorRectangle(InteropValues.RECT windowRect, out InteropValues.RECT screenSubRect, out InteropValues.RECT monitorRect) { var rects = new List(); InteropMethods.EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, delegate (IntPtr hMonitor, IntPtr hdcMonitor, ref InteropValues.RECT rect, IntPtr lpData) { var monitorInfo = default(InteropValues.MONITORINFO); monitorInfo.cbSize = (uint) Marshal.SizeOf(typeof(InteropValues.MONITORINFO)); InteropMethods.GetMonitorInfo(hMonitor, ref monitorInfo); rects.Add(monitorInfo.rcWork); return true; }, IntPtr.Zero); var num = 0L; screenSubRect = new InteropValues.RECT { Left = 0, Right = 0, Top = 0, Bottom = 0 }; monitorRect = new InteropValues.RECT { Left = 0, Right = 0, Top = 0, Bottom = 0 }; foreach (var current in rects) { var rect = current; InteropMethods.IntersectRect(out var rECT2, ref rect, ref windowRect); var num2 = (long) (rECT2.Width * rECT2.Height); if (num2 > num) { screenSubRect = rECT2; monitorRect = current; num = num2; } } } internal static void FindMonitorRectsFromPoint(Point point, out Rect monitorRect, out Rect workAreaRect) { var intPtr = InteropMethods.MonitorFromPoint(new InteropValues.POINT { X = (int) point.X, Y = (int) point.Y }, 2); monitorRect = new Rect(0.0, 0.0, 0.0, 0.0); workAreaRect = new Rect(0.0, 0.0, 0.0, 0.0); if (intPtr != IntPtr.Zero) { InteropValues.MONITORINFO monitorInfo = default; monitorInfo.cbSize = (uint) Marshal.SizeOf(typeof(InteropValues.MONITORINFO)); InteropMethods.GetMonitorInfo(intPtr, ref monitorInfo); monitorRect = new Rect(monitorInfo.rcMonitor.Position, monitorInfo.rcMonitor.Size); workAreaRect = new Rect(monitorInfo.rcWork.Position, monitorInfo.rcWork.Size); } } }