Screen.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System.Drawing;
  2. using System.Runtime.InteropServices;
  3. using System.Collections.Generic;
  4. using System.Windows.Interop;
  5. namespace System.Windows.Forms
  6. {
  7. public class Screen
  8. {
  9. private IntPtr hMonitor;
  10. private Rectangle bounds;
  11. private Rectangle workingArea;
  12. public Rectangle Bounds => bounds;
  13. public Rectangle WorkingArea => workingArea;
  14. internal Screen(IntPtr hMonitor, Rectangle bounds, Rectangle workingArea)
  15. {
  16. this.hMonitor = hMonitor;
  17. this.bounds = bounds;
  18. this.workingArea = workingArea;
  19. }
  20. private static List<Screen> allScreens;
  21. public static Screen[] AllScreens
  22. {
  23. get
  24. {
  25. if (allScreens == null)
  26. {
  27. allScreens = new List<Screen>();
  28. NativeMethods.EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, MonitorEnum, IntPtr.Zero);
  29. }
  30. return allScreens.ToArray();
  31. }
  32. }
  33. private static bool MonitorEnum(IntPtr hMonitor, IntPtr hdcMonitor, ref NativeMethods.RECT lprcMonitor, IntPtr dwData)
  34. {
  35. var mi = new NativeMethods.MONITORINFOEX();
  36. bool success = NativeMethods.GetMonitorInfo(new HandleRef(null, hMonitor), mi);
  37. allScreens.Add(new Screen(hMonitor,
  38. new Rectangle(mi.rcMonitor.left, mi.rcMonitor.top, mi.rcMonitor.Width, mi.rcMonitor.Height),
  39. new Rectangle(mi.rcWork.left, mi.rcWork.top, mi.rcWork.Width, mi.rcWork.Height)));
  40. return true;
  41. }
  42. public static Screen FromControl(Form form) => FromControl(form.window);
  43. public static Screen FromControl(Window window) => FromHandle(new WindowInteropHelper(window).Handle);
  44. public static Screen FromHandle(IntPtr handle)
  45. {
  46. IntPtr hMonitor = NativeMethods.MonitorFromWindow(new HandleRef(null, handle), 2);
  47. foreach (var screen in AllScreens)
  48. {
  49. if (screen.hMonitor == hMonitor)
  50. return screen;
  51. }
  52. return AllScreens[0];
  53. }
  54. public static Rectangle GetWorkingArea(Form form)
  55. {
  56. return FromControl(form).WorkingArea;
  57. }
  58. }
  59. }