ScreenHelper.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Runtime.InteropServices;
  4. using System.Windows;
  5. using HandyControl.Tools.Interop;
  6. namespace HandyControl.Tools;
  7. internal class ScreenHelper
  8. {
  9. internal static void FindMaximumSingleMonitorRectangle(Rect windowRect, out Rect screenSubRect, out Rect monitorRect)
  10. {
  11. var windowRect2 = new InteropValues.RECT(windowRect);
  12. FindMaximumSingleMonitorRectangle(windowRect2, out var rect, out var rect2);
  13. screenSubRect = new Rect(rect.Position, rect.Size);
  14. monitorRect = new Rect(rect2.Position, rect2.Size);
  15. }
  16. private static void FindMaximumSingleMonitorRectangle(InteropValues.RECT windowRect, out InteropValues.RECT screenSubRect, out InteropValues.RECT monitorRect)
  17. {
  18. var rects = new List<InteropValues.RECT>();
  19. InteropMethods.EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero,
  20. delegate (IntPtr hMonitor, IntPtr hdcMonitor, ref InteropValues.RECT rect, IntPtr lpData)
  21. {
  22. var monitorInfo = default(InteropValues.MONITORINFO);
  23. monitorInfo.cbSize = (uint) Marshal.SizeOf(typeof(InteropValues.MONITORINFO));
  24. InteropMethods.GetMonitorInfo(hMonitor, ref monitorInfo);
  25. rects.Add(monitorInfo.rcWork);
  26. return true;
  27. }, IntPtr.Zero);
  28. var num = 0L;
  29. screenSubRect = new InteropValues.RECT
  30. {
  31. Left = 0,
  32. Right = 0,
  33. Top = 0,
  34. Bottom = 0
  35. };
  36. monitorRect = new InteropValues.RECT
  37. {
  38. Left = 0,
  39. Right = 0,
  40. Top = 0,
  41. Bottom = 0
  42. };
  43. foreach (var current in rects)
  44. {
  45. var rect = current;
  46. InteropMethods.IntersectRect(out var rECT2, ref rect, ref windowRect);
  47. var num2 = (long) (rECT2.Width * rECT2.Height);
  48. if (num2 > num)
  49. {
  50. screenSubRect = rECT2;
  51. monitorRect = current;
  52. num = num2;
  53. }
  54. }
  55. }
  56. internal static void FindMonitorRectsFromPoint(Point point, out Rect monitorRect, out Rect workAreaRect)
  57. {
  58. var intPtr = InteropMethods.MonitorFromPoint(new InteropValues.POINT
  59. {
  60. X = (int) point.X,
  61. Y = (int) point.Y
  62. }, 2);
  63. monitorRect = new Rect(0.0, 0.0, 0.0, 0.0);
  64. workAreaRect = new Rect(0.0, 0.0, 0.0, 0.0);
  65. if (intPtr != IntPtr.Zero)
  66. {
  67. InteropValues.MONITORINFO monitorInfo = default;
  68. monitorInfo.cbSize = (uint) Marshal.SizeOf(typeof(InteropValues.MONITORINFO));
  69. InteropMethods.GetMonitorInfo(intPtr, ref monitorInfo);
  70. monitorRect = new Rect(monitorInfo.rcMonitor.Position, monitorInfo.rcMonitor.Size);
  71. workAreaRect = new Rect(monitorInfo.rcWork.Position, monitorInfo.rcWork.Size);
  72. }
  73. }
  74. }