调用:
SystemInfo sysInfo = new SystemInfo();
string id = sysInfo.GetMonitorPnpDeviceId()[0];
double _width = SystemInfo.MillimetersToPixelsWidth(250);
public class SystemInfo
{
public virtual 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 virtual byte[] GetMonitorEdid(string monitorPnpDevId)
{
return (byte[])Registry.GetValue(@"HKEY_LOCAL_MACHINESYSTEMControlSet001Enum" + monitorPnpDevId + @"Device Parameters", "EDID", new byte[] { });
}
//获取显示器物理尺寸(cm)
public virtual 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(p.Handle);
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);
}
[DllImport("gdi32.dll")]
private static extern int GetDeviceCaps(IntPtr hdc, int Index);
}