using Microsoft.Win32; using System.Collections.Generic; using System; using System.Management; using System.Runtime.InteropServices; using System.Drawing; namespace AIStudio.Wpf.DiagramDesigner { public static class ScreenHelper { public static double ScreenScale; public static double MmToPixelsWidth; static ScreenHelper() { ScreenScale = ResetScreenScale(); MmToPixelsWidth = MillimetersToPixelsWidth(1); } [DllImport("user32.dll", EntryPoint = "ReleaseDC")] public static extern IntPtr ReleaseDC( IntPtr hWnd, IntPtr hDc ); [DllImport("gdi32.dll")] public static extern int GetDeviceCaps( IntPtr hdc, // handle to DC int nIndex // index of capability ); public static System.Drawing.Size GetPhysicalDisplaySize() { Graphics g = Graphics.FromHwnd(IntPtr.Zero); IntPtr desktop = g.GetHdc(); int physicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.Desktopvertres); int physicalScreenWidth = GetDeviceCaps(desktop, (int)DeviceCap.Desktophorzres); ReleaseDC(IntPtr.Zero, desktop); g.Dispose(); return new System.Drawing.Size(physicalScreenWidth, physicalScreenHeight); } public enum DeviceCap { Desktopvertres = 117, Desktophorzres = 118 } public static double ResetScreenScale() { using (var g = Graphics.FromHwnd(IntPtr.Zero)) { IntPtr desktop = g.GetHdc(); int physicalScreenWidth = GetDeviceCaps(desktop, (int)DeviceCap.Desktophorzres); return physicalScreenWidth * 1.0000 / System.Windows.SystemParameters.PrimaryScreenWidth; } } //public static List GetMonitorPnpDeviceId() //{ // List rt = new List(); // using (ManagementClass mc = new ManagementClass("Win32_DesktopMonitor")) // { // using (ManagementObjectCollection moc = mc.GetInstances()) // { // foreach (var o in moc) // { // var each = (ManagementObject)o; // object obj = each.Properties["PNPDeviceID"].Value; // if (obj == null) // continue; // rt.Add(each.Properties["PNPDeviceID"].Value.ToString()); // } // } // } // return rt; //} //public static byte[] GetMonitorEdid(string monitorPnpDevId) //{ // return (byte[])Registry.GetValue(@"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\" + monitorPnpDevId + @"\Device Parameters", "EDID", new byte[] { }); //} ////获取显示器物理尺寸(cm) //public static SizeF GetMonitorPhysicalSize(string monitorPnpDevId) //{ // byte[] edid = GetMonitorEdid(monitorPnpDevId); // if (edid.Length < 23) // return SizeF.Empty; // return new SizeF(edid[21], edid[22]); //} //通过屏显示器理尺寸转换为显示器大小(inch) public static float MonitorScaler(SizeF moniPhySize) { double mDSize = Math.Sqrt(Math.Pow(moniPhySize.Width, 2) + Math.Pow(moniPhySize.Height, 2)) / 2.54d; return (float)Math.Round(mDSize, 1); } public static double MillimetersToPixelsWidth(double length) //length是毫米,1厘米=10毫米 { //System.Windows.Forms.Panel p = new System.Windows.Forms.Panel(); System.Drawing.Graphics g = System.Drawing.Graphics.FromHwnd(IntPtr.Zero); IntPtr hdc = g.GetHdc(); int width = GetDeviceCaps(hdc, 4); // HORZRES int pixels = GetDeviceCaps(hdc, 8); // BITSPIXEL g.ReleaseHdc(hdc); return (((double)pixels / (double)width) * (double)length); } public static double MmToWidth(double length) //length是毫米,1厘米=10毫米 { return MmToPixelsWidth * length / ScreenScale; } public static double WidthToMm(double length) { return ScreenScale * length / MmToPixelsWidth; } public static double CmToWidth(double length) //length是毫米,1厘米=10毫米 { return MmToPixelsWidth * length * 10d/ ScreenScale; } public static double WidthToCm(double length) { return ScreenScale * length / (MmToPixelsWidth * 10d); } public static double InchToWidth(double length) //length是英寸,1英寸=2.54cm { return MmToPixelsWidth * length * 10d * 2.54d / ScreenScale; } public static double WidthToInch(double length) //length是英寸,1英寸=2.54cm { return ScreenScale * length / (MmToPixelsWidth * 10d * 2.54d); } } }