Esempio n. 1
0
        //获取系统缩放比例
        public static float GetSystemScale()
        {
            //1. 当用户使用默认方法设置缩放时(更改文本、应用等项目的大小),
            //   应该使用GetDeviceCaps(DESKTOPHORZRES)/GetDeviceCaps(HORZRES)获得缩放比例
            //2. 当用户使用高级模式中的自定义缩放时(高级缩放设置),
            //   应该使用GetDeviceCaps(LOGPIXELSX)再除以0.96(再除以100,因为算出来的数字是百分比)
            //3. 经验证,Win10中上述两种情况下,第一种计算方法总能获取到正确的系统缩放比例
            var systemScale = 1.0f;
            var screenDc    = Win32Funcs.GetDcWrapper(IntPtr.Zero);
            var dpiA        = Win32Funcs.GetDeviceCapsWrapper(screenDc, Win32Consts.DESKTOPHORZRES) * 1.0f
                              / Win32Funcs.GetDeviceCapsWrapper(screenDc, Win32Consts.HORZRES);
            var dpiB = Win32Funcs.GetDeviceCapsWrapper(screenDc, Win32Consts.LOGPIXELSX) / 0.96f / 100f;

            const float tolerance = 0.000001f;

            if (Math.Abs(dpiA - 1f) < tolerance)
            {
                systemScale = dpiB;
            }
            else if (Math.Abs(dpiB - 1f) < tolerance)
            {
                systemScale = dpiA;
            }
            else if (Math.Abs(dpiA - dpiB) < tolerance)
            {
                systemScale = dpiA;
            }
            else
            {
                //Error
            }

            Win32Funcs.ReleaseDcWrapper(IntPtr.Zero, screenDc);
            return(systemScale);
        }