WPF获取屏幕缩放比例

  • Post author:
  • Post category:其他


方式一通过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;
        }



版权声明:本文为mansai原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。