用户工具

站点工具


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 (外部编辑)