C#获取Windows10屏幕的缩放比例

摘要:
我们将在Windows显示设置中看到缩放设置。在开发Windows桌面客户端时,有时需要精确计算窗口的面积或位置。但是,默认情况下,无论屏幕如何。边界。WPF中WinForms或SystemParameters的Width属性PrimaryScreenWidth属性,如下图所示,将返回1280除以150%的值。enumDeviceCap{VERTRES=10,物理宽度=110,缩放系数=114,桌面顶点=117,//http://pinvoke.net/default.aspx/gdi32/GetDeviceCaps.html}获得物理像素高度后,不难计算屏幕缩放比例。这是因为Windows默认的WinForms程序不支持DPI感知,并在高分割屏幕中直接粗略放大表单。自UWP以来,Windows客户端技术完全支持高分割屏幕,即高DPI缩放。

现在1920x1080以上分辨率的高分屏电脑渐渐普及了。我们会在Windows的显示设置里看到缩放比例的设置。在Windows桌面客户端的开发中,有时会想要精确计算窗口的面积或位置。然而在默认情况下,无论WinForms的Screen.Bounds.Width属性还是WPF中SystemParameters.PrimaryScreenWidth属性,以下图举例,将会返回除以150%的数值1280。而不是真实的物理分辨率1920。

C#获取Windows10屏幕的缩放比例第1张

接下来介绍如何获取Display resolution中显示的实际分辨率。通过如下Win32 API的调用:

        [DllImport("gdi32.dll", EntryPoint = "GetDeviceCaps", SetLastError = true)]
        public static extern int GetDeviceCaps(IntPtr hdc, int nIndex);

该方法可以获取设备的硬件信息,可以通过第二个参数nIndex来指定要查询的具体信息。例如我们要用到的以像素为单位的桌面高度DESKTOPVERTRES。

        enum DeviceCap
        {
            VERTRES = 10,
            PHYSICALWIDTH = 110,
            SCALINGFACTORX = 114,
            DESKTOPVERTRES = 117,

            // http://pinvoke.net/default.aspx/gdi32/GetDeviceCaps.html
        }

在获得物理像素高度后,通过计算不难得出屏幕的缩放比列。

        private static double GetScreenScalingFactor()
        {
            var g = Graphics.FromHwnd(IntPtr.Zero);
            IntPtr desktop = g.GetHdc();
            var physicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES);

            var screenScalingFactor = 
                (double)physicalScreenHeight / Screen.PrimaryScreen.Bounds.Height;
            //SystemParameters.PrimaryScreenHeight;

            return screenScalingFactor;
        }

C#获取Windows10屏幕的缩放比例第2张

在获取屏幕缩放比例后,诸如通过Graphics类的CopyFromScreen方法来截屏,或者精确控制窗口大小和位置才得以正确实现。
其实在WinForms程序中,我们还有更简单的方式来实现类似效果。即在工程中添加app.manifest文件,将<dipAware>节点的值设为true。这样修改后,Screen.PrimaryScreen.Bounds将获得实际的物理分辨率尺寸,同时你还会发现WinForms程序不糊了。这是因为Windows默认WinForms程序不支持DPI感知,在高分屏下就直接粗暴的把窗体放大。

  <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
    </windowsSettings>
  </application>

该设置对WPF无效,WPF默认支持DPI感知功能。而从UWP开始Windows客户端技术全面支持高分屏即高DPI缩放。老旧应用程序不肯升级,以至无法支持高分屏,这锅某软背着挺冤的……
所以同学们,现在开始全面转向WinUI 3吧,这货是这么些年某软兜兜转转,客户端技术集大成者。用Windows APP SDK创建Unpackged App时,恍惚间仿佛回到了在XP上装.NET Runtime的时光。
因为Github访问时常抽风,我将示例代码在Gitee上也同步了一份:

How to get Windows display scale using C#. (github.com)
How to get Windows display scale using C#. (gitee.com)

免责声明:文章转载自《C#获取Windows10屏幕的缩放比例》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ElementUI中el-upload传递额外参数为date类型时后台SpringBoot接收不到mongodb 权限设置--用户名、密码、端口下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Jmeter5.3字体大小修改(高分辨率设置)

操作系统:win10 jmeter5.3 显示器分辨率:4k   jmeter的高版本已经支持高分屏(4k分辨率)了,但是默认情况下参数是没有启动高分屏支持的。需要自己设置,设置方法如下: 1. 打开: D:apache-jmeter-5.3injmeter.properties (即jmeter压缩包中的bin目录中) 2. 编辑以下几个字段(建议逐...

C# Winform程序设计运行在高分屏下模糊解决办法

前段时间在开发一个坐标转换程序,开发环境是Windows10 64位专业版(V1803)和Visual Stuido 2015社区版,电脑屏幕是15.6英寸分辨率1920*1080,采用的是WinForm程序设计方法开发。在程序运行时遇到了这样一个问题,在Visual Studio设计的很清晰的菜单和界面,运行的时候菜单和控件上字体变得很模糊,界面大小也发...

解决pc端屏幕缩放比例对页面布局的影响

现在很多笔记本电脑都推荐将缩放设置为125%,等比例放大显示。 这对我们前端的页面的布局会产生一些影响 首先,单独的响应式布局hold不住这个问题,因为出问题的是device-pixel-ratio。 问题现象是高分屏下整好的东西,在普分屏下会放大;而普分屏下整好的东西,在高分屏上会缩小。 重现这个问题不需要高分屏,直接用Ctrl++或者Ctrl+-出...

vs 在高分屏下开发 winform 配置

一、窗体控件大小 第一种方法:使用网格避免整除误差在选项中将Windows窗体设计器的LayoutMode(布局模式)改成SnapToGrid(对齐到网格),并将Default Grid Cell Size(默认网格大小)设为最小可缩放单元(或它的倍数),以避免移植时产生整除误差。同时由于这些单元是可见的,也使得将控件拖到合适的尺寸非常简单。同时,应该将窗...

高分屏显示模糊修复工具

高分屏显示模糊修复工具下载 此现象是由于系统自带的放大功能导致,由于笔记本屏幕较小,高分屏会出现图标、应用等整体显示比较小的情况,所以系统会默认设置为150%的放大显示,如果部分应用的显示界面分辨率不高,放大后就会模糊,这是正常的现象,笔记本高分屏使用windows系统都会有类似情况。 可使用以下工具调整缩放比例为100%或125%或者禁用软件的DPI缩放...