1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- using System.Drawing;
- using System.Runtime.InteropServices;
- using System.Collections.Generic;
- using System.Windows.Interop;
- namespace System.Windows.Forms
- {
- public class Screen
- {
- private IntPtr hMonitor;
- private Rectangle bounds;
- private Rectangle workingArea;
- public Rectangle Bounds => bounds;
- public Rectangle WorkingArea => workingArea;
- internal Screen(IntPtr hMonitor, Rectangle bounds, Rectangle workingArea)
- {
- this.hMonitor = hMonitor;
- this.bounds = bounds;
- this.workingArea = workingArea;
- }
- private static List<Screen> allScreens;
- public static Screen[] AllScreens
- {
- get
- {
- if (allScreens == null)
- {
- allScreens = new List<Screen>();
- NativeMethods.EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, MonitorEnum, IntPtr.Zero);
- }
- return allScreens.ToArray();
- }
- }
- private static bool MonitorEnum(IntPtr hMonitor, IntPtr hdcMonitor, ref NativeMethods.RECT lprcMonitor, IntPtr dwData)
- {
- var mi = new NativeMethods.MONITORINFOEX();
- bool success = NativeMethods.GetMonitorInfo(new HandleRef(null, hMonitor), mi);
- allScreens.Add(new Screen(hMonitor,
- new Rectangle(mi.rcMonitor.left, mi.rcMonitor.top, mi.rcMonitor.Width, mi.rcMonitor.Height),
- new Rectangle(mi.rcWork.left, mi.rcWork.top, mi.rcWork.Width, mi.rcWork.Height)));
- return true;
- }
- public static Screen FromControl(Form form) => FromControl(form.window);
- public static Screen FromControl(Window window) => FromHandle(new WindowInteropHelper(window).Handle);
-
- public static Screen FromHandle(IntPtr handle)
- {
- IntPtr hMonitor = NativeMethods.MonitorFromWindow(new HandleRef(null, handle), 2);
- foreach (var screen in AllScreens)
- {
- if (screen.hMonitor == hMonitor)
- return screen;
- }
- return AllScreens[0];
- }
- public static Rectangle GetWorkingArea(Form form)
- {
- return FromControl(form).WorkingArea;
- }
- }
- }
|