各位大佬好:有一个获取屏幕物理尺寸的问题需要大神们解答一下。
根据不同的分辨率或者屏幕的尺寸(高和宽,单位mm)
通过网上找的公式:
那我要是在一个50寸的电视用用1024*768的分辨率呢?
50寸的显示屏用1024*768的分辨率会两侧出现黑框,实际物理尺寸肯定会变小
我找了一个winform的例子,试过了可以的,不需要根据分辨率来设置。
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_MACHINE\SYSTEM\ControlSet001\Enum\" + 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); } }
调用如下:
SystemInfo sysInfo = new SystemInfo(); string id = sysInfo.GetMonitorPnpDeviceId()[0]; SizeF size = sysInfo.GetMonitorPhysicalSize(id); MessageBox.Show(SystemInfo.MonitorScaler(size).ToString() + @"寸");
注意ManagementClass类要引用System.Management.dll
显示结果如:
您好,感谢你的回答,这个我已经试过了。这个尺寸就是显示器的物理尺寸,不会根据分辨率的改变而实际获取屏幕的可用尺寸。例如14寸的笔记本默认分辨率是1366*768 ,这个时候是可以获取尺寸信息, 当改成1024*768的分辨率后,屏幕两侧会出现黑框,用此方法得出的结果还是一样,所以不正确。
@布尔2013: 物理尺寸就是显示器的实际尺寸,跟分辨率是没有任何关系的,不知你说的不正确,是希望不同分辨率下显示出来的尺寸不一样?那这就不对了,正常应该是不管你调成什么分辨率,显示的尺寸都是一致的。
@龙行天涯: 你好,物理尺寸不是指的显示器物理尺寸,是指的屏幕的物理尺寸(就是屏幕实际能使用的区域大小。)
@布尔2013: 这就不理解了,分辨率再怎么调,能使用的区域我试过了,都是那么大,不会变小。再说,你做这样的需求,目的是什么?有什么实际意义
@龙行天涯: 那不可能的,分辨率调小的情况,屏幕尺寸明显会变小的;项目需求是跟硬件打交道,对尺寸和分辨率以及鼠标坐标要求比较精确。
@布尔2013: 刚刚试过了,有些显示器会变小,有些不会。是不是只要能够获取可是区域的分辨率就可以?