87 lines
3.1 KiB
C#
87 lines
3.1 KiB
C#
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|