服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#获取Windows10屏幕缩放比例的操作方法

C#获取Windows10屏幕缩放比例的操作方法

2022-12-12 11:57楼上那个蜀黍 C#

这篇文章主要介绍了C#获取Windows10屏幕的缩放比例,接下来介绍如何获取Display resolution中显示的实际分辨率,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下

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

C#获取Windows10屏幕缩放比例的操作方法

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

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

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

?
1
2
3
4
5
6
7
8
9
enum DeviceCap
        {
            VERTRES = 10,
            PHYSICALWIDTH = 110,
            SCALINGFACTORX = 114,
            DESKTOPVERTRES = 117,
 
            // http://pinvoke.net/default.aspx/gdi32/GetDeviceCaps.html
        }

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

?
1
2
3
4
5
6
7
8
9
10
11
12
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屏幕缩放比例的操作方法

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

?
1
2
3
4
5
<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屏幕的缩放比例的文章就介绍到这了,更多相关C#获取屏幕缩放比例内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/manupstairs/p/15671171.html

延伸 · 阅读

精彩推荐
  • C#完美解决c# distinct不好用的问题

    完美解决c# distinct不好用的问题

    这篇文章主要介绍了完美解决c# distinct不好用的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    萌橙10202022-10-20
  • C#C#及WPF获取本机所有字体和颜色的方法

    C#及WPF获取本机所有字体和颜色的方法

    这篇文章主要介绍了C#及WPF获取本机所有字体和颜色的方法,实例分析了C#及WPF获取本机字体及颜色的相关技巧,非常简单实用,需要的朋友可以参考下...

    C#教程网5952021-10-27
  • C#Unity3D实现旋钮控制灯光效果

    Unity3D实现旋钮控制灯光效果

    这篇文章主要为大家详细介绍了Unity3D实现旋钮控制灯光效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    蓝染s3892022-07-19
  • C#C#实现Nginx平滑加权轮询算法

    C#实现Nginx平滑加权轮询算法

    这篇文章主要为大家详细介绍了C#实现Nginx平滑加权轮询算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Gangle3602022-02-27
  • C#C#实现自定义windows系统日志的方法

    C#实现自定义windows系统日志的方法

    这篇文章主要介绍了C#实现自定义windows系统日志的方法,涉及C#针对windows系统日志的创建、读写及删除技巧,非常具有实用价值,需要的朋友可以参考下...

    我心依旧7012021-10-21
  • C#C#获取本地IP的四种方式示例详解

    C#获取本地IP的四种方式示例详解

    这篇文章主要介绍了C#获取本地IP的四种方式示例详解, 文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    Koalin11422022-09-28
  • C#C#接口在派生类和外部类中的调用方法示例

    C#接口在派生类和外部类中的调用方法示例

    这篇文章主要介绍了C#接口在派生类和外部类中的调用方法,结合实例形式分析了C#接口的定义与具体使用方法,需要的朋友可以参考下...

    Mr-Robot10642021-12-24
  • C#C#委托与事件原理及实例解析

    C#委托与事件原理及实例解析

    这篇文章主要介绍了C#委托与事件原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考...

    手撕高达的村长10432022-10-19