wxk:csharp:monitor
这是本文档旧的修订版!
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Drawing; using System.Runtime.InteropServices; using System.Windows; using Size = System.Drawing.Size; using System.Security; namespace WXK { public class DisplayHelper { #region Win32 API [DllImport("user32.dll")] private static extern bool EnumDisplayMonitors(IntPtr hdc, IntPtr lpRect, MonitorEnumProc callback, int dwData); private delegate bool MonitorEnumProc(IntPtr hMonitor, IntPtr hdc, ref Rect pRect, int dwData); [DllImport("user32.dll", EntryPoint = "GetMonitorInfoA", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)] private static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFOEX lpmi); [StructLayout(LayoutKind.Sequential)] public struct Rect { public int left; public int top; public int right; public int bottom; } private struct MONITORINFOEX { public int cbSize; public Rect rcMonitor; public Rect rcWork; public int dwFlags; } public enum MonitorDpiType { EFFECTIVE_DPI, ANGULAR_DPI, RAW_DPI, } [SuppressUnmanagedCodeSecurity] [DllImport("Shcore.dll")] private static extern IntPtr GetDpiForMonitor( IntPtr hmonitor, MonitorDpiType dpiType, out int dpiX, out int dpiY ); #endregion public class MonitorInfo { public int left; public int top; public int right; public int bottom; public int dpi; public float scale; public int dwFlags; public int width { get{ return Math.Abs((right - left)); } } public int height { get { return Math.Abs((bottom - top)); } } } public class Monitor { public List<MonitorInfo> monitorinfos = new List<MonitorInfo>(); //所有屏幕 public MonitorInfo primary; //主屏 } private static Monitor monitor = new Monitor(); public static Monitor GetMonitors() { MonitorEnumProc callback = CallBack; monitor.monitorinfos.Clear(); EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, callback, 0); monitor.monitorinfos = monitor.monitorinfos.OrderBy(a => a.left).ToList(); return monitor; } private static bool CallBack(IntPtr hMonitor, IntPtr hdc, ref Rect pRect, int dwData) { GetDpiForMonitor(hMonitor, MonitorDpiType.EFFECTIVE_DPI, out int dpiX, out int dpiY); MONITORINFOEX minfo = new MONITORINFOEX(); minfo.cbSize = Marshal.SizeOf(typeof(MONITORINFOEX)); GetMonitorInfo(hMonitor, ref minfo); float scale = (float)dpiX / 96.0f; MonitorInfo monitorinfo = new MonitorInfo { left = (int)(pRect.left / scale), right = (int)(pRect.right / scale), top = (int)(pRect.top / scale), bottom = (int)(pRect.bottom / scale), dpi = dpiX, scale = scale, dwFlags = minfo.dwFlags }; if (monitorinfo.dwFlags == 1) monitor.primary = monitorinfo; monitor.monitorinfos.Add(monitorinfo); return true; } } }
wxk/csharp/monitor.1693897175.txt.gz · 最后更改: 2024/11/22 08:46 (外部编辑)
