WPF获取屏幕缩放比例

Posted 神色自若

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF获取屏幕缩放比例相关的知识,希望对你有一定的参考价值。

方式一通过dpi计算:

 Graphics graphics = System.Drawing.Graphics.FromHwnd(IntPtr.Zero); 
 var ratio =(int)(graphics.DpiX* 1.041666667);

此方式只能用在.net4

.netcore方式获取dpi(先安装下图NuGet包)

            var dpi= Vanara.PInvoke.User32.GetDpiForSystem();
            var ratio = (int)(dpi * 1.041666667);

方式二:

1.安装Vanara.PInvoke.User32包

2.调用User32函数GetMonitorInfo与EnumDisplaySettings获取系统屏幕宽度,根据WPF内置SystemParameters.PrimaryScreenWidth显示尺寸计算比例

        /// <summary>
        /// 获取屏幕缩放比例
        /// </summary>
        /// <returns></returns>
        public static double GetScalingRatio()
        
            HWND hd = GetDesktopWindow();
            HMONITOR hMonitor = MonitorFromWindow(hd, MonitorFlags.MONITOR_DEFAULTTONEAREST);
            MONITORINFOEX miex = new MONITORINFOEX();
            miex.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(MONITORINFOEX));
            GetMonitorInfo(hMonitor, ref miex);

            DEVMODE dm = new DEVMODE();
            dm.dmSize = (ushort)System.Runtime.InteropServices.Marshal.SizeOf(typeof(DEVMODE));
            dm.dmDriverExtra = 0;

            //ENUM_CURRENT_SETTINGS 检索显示设备的当前设置
            //ENUM_REGISTRY_SETTINGS 检索当前存储在注册表中的显示设备的设置
            EnumDisplaySettings(miex.szDevice, ENUM_CURRENT_SETTINGS, ref dm);
            var cx = (double)dm.dmPelsWidth / SystemParameters.PrimaryScreenWidth;
            var cy = (double)dm.dmPelsHeight / SystemParameters.PrimaryScreenHeight;
            return cx*100;

        

如果是vs2022,net6+系列会自动添加命名空间引用,如果是.net4请先添加命名空间引用

using static Vanara.PInvoke.User32;
using Vanara.PInvoke;

方式三:

以下是通过GDI计算

using static Vanara.PInvoke.User32;
using static Vanara.PInvoke.Gdi32;

        /// <summary>
        /// 通过GDI计算屏缩放比例
        /// </summary>
        /// <returns></returns>
        public static double GetScalingRatioByGDI()
        
            var hdc = GetDC(IntPtr.Zero);
            int dw = GetDeviceCaps(hdc, DeviceCap.DESKTOPHORZRES);//水平宽度
            int dh = GetDeviceCaps(hdc, DeviceCap.DESKTOPVERTRES);//垂直宽度
            var w = SystemParameters.PrimaryScreenWidth;
            var h = SystemParameters.PrimaryScreenHeight;
            ReleaseDC(IntPtr.Zero, hdc);//释放hdc
            return (double)dw/ w * 100;
        

以上是关于WPF获取屏幕缩放比例的主要内容,如果未能解决你的问题,请参考以下文章

WPF获取屏幕缩放比例

如何根据屏幕的物理尺寸按比例缩放布局?

请教:wpf中嵌CefSharp, 怎么实现比例缩放功能?

头条AutoSize基本原理

各种屏幕的标准小部件尺寸

微信小程序学习点滴《十二》:图片等比例缩放 获取屏幕尺寸图片尺寸 自适应