2023-02-11 22:20:24 +08:00
|
|
|
|
using Microsoft.Win32;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Management;
|
2022-12-04 23:07:20 +08:00
|
|
|
|
using System.Runtime.InteropServices;
|
2023-02-11 22:20:24 +08:00
|
|
|
|
using System.Drawing;
|
2022-12-04 23:07:20 +08:00
|
|
|
|
|
|
|
|
|
|
namespace AIStudio.Wpf.DiagramDesigner
|
|
|
|
|
|
{
|
|
|
|
|
|
public static class ScreenHelper
|
|
|
|
|
|
{
|
2023-02-11 22:20:24 +08:00
|
|
|
|
public static double ScreenScale;
|
|
|
|
|
|
public static double MmToPixelsWidth;
|
|
|
|
|
|
static ScreenHelper()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScreenScale = ResetScreenScale();
|
|
|
|
|
|
MmToPixelsWidth = MillimetersToPixelsWidth(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-12-04 23:07:20 +08:00
|
|
|
|
[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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-02-11 22:20:24 +08:00
|
|
|
|
|
|
|
|
|
|
//public static List<string> GetMonitorPnpDeviceId()
|
|
|
|
|
|
//{
|
|
|
|
|
|
// List<string> rt = new List<string>();
|
|
|
|
|
|
|
|
|
|
|
|
// 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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-12-04 23:07:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|