首页 新闻 会员 周边

c#获取屏幕的物理尺寸

0
悬赏园豆:40 [待解决问题]

各位大佬好:有一个获取屏幕物理尺寸的问题需要大神们解答一下。

根据不同的分辨率或者屏幕的尺寸(高和宽,单位mm)

通过网上找的公式:

  //象素数 / DPI = 英寸数
//英寸数 * 25.4 = 毫米数
例如1366*768的分辨率,通过公式得到的结果是361*203;而我通过尺子实际量的结果是310*170;
通过api函数GetDeviceCaps(hdc, 4); 获取的物理屏幕的宽度(毫米)也与实际有差别,请问我要如何计算或者到准确的物理尺寸呢?
布尔2013的主页 布尔2013 | 初学一级 | 园豆:100
提问于:2018-05-02 17:28
< >
分享
所有回答(2)
0

那我要是在一个50寸的电视用用1024*768的分辨率呢?

吴瑞祥 | 园豆:29449 (高人七级) | 2018-05-03 11:41

50寸的显示屏用1024*768的分辨率会两侧出现黑框,实际物理尺寸肯定会变小

支持(0) 反对(0) 布尔2013 | 园豆:100 (初学一级) | 2018-05-04 08:56
0

我找了一个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

 

显示结果如:

龙行天涯 | 园豆:1794 (小虾三级) | 2018-05-03 17:27

您好,感谢你的回答,这个我已经试过了。这个尺寸就是显示器的物理尺寸,不会根据分辨率的改变而实际获取屏幕的可用尺寸。例如14寸的笔记本默认分辨率是1366*768 ,这个时候是可以获取尺寸信息, 当改成1024*768的分辨率后,屏幕两侧会出现黑框,用此方法得出的结果还是一样,所以不正确。

支持(0) 反对(0) 布尔2013 | 园豆:100 (初学一级) | 2018-05-04 08:51

@布尔2013: 物理尺寸就是显示器的实际尺寸,跟分辨率是没有任何关系的,不知你说的不正确,是希望不同分辨率下显示出来的尺寸不一样?那这就不对了,正常应该是不管你调成什么分辨率,显示的尺寸都是一致的。

支持(0) 反对(0) 龙行天涯 | 园豆:1794 (小虾三级) | 2018-05-04 08:57

@龙行天涯: 你好,物理尺寸不是指的显示器物理尺寸,是指的屏幕的物理尺寸(就是屏幕实际能使用的区域大小。)

支持(0) 反对(0) 布尔2013 | 园豆:100 (初学一级) | 2018-05-04 08:58

@布尔2013: 这就不理解了,分辨率再怎么调,能使用的区域我试过了,都是那么大,不会变小。再说,你做这样的需求,目的是什么?有什么实际意义

支持(0) 反对(0) 龙行天涯 | 园豆:1794 (小虾三级) | 2018-05-04 09:04

@龙行天涯: 那不可能的,分辨率调小的情况,屏幕尺寸明显会变小的;项目需求是跟硬件打交道,对尺寸和分辨率以及鼠标坐标要求比较精确。

支持(0) 反对(0) 布尔2013 | 园豆:100 (初学一级) | 2018-05-04 09:06

@布尔2013: 刚刚试过了,有些显示器会变小,有些不会。是不是只要能够获取可是区域的分辨率就可以?

支持(0) 反对(0) 龙行天涯 | 园豆:1794 (小虾三级) | 2018-05-04 09:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册