123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- 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<InteropValues.RECT>();
- 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);
- }
- }
- }
|