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获取屏幕缩放比例的主要内容,如果未能解决你的问题,请参考以下文章