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

 更新时间:2021年12月10日 15:40:49   作者:楼上那个蜀黍  
这篇文章主要介绍了C#获取Windows10屏幕的缩放比例,接下来介绍如何获取Display resolution中显示的实际分辨率,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下

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

接下来介绍如何获取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;
        }

在获取屏幕缩放比例后,诸如通过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屏幕的缩放比例的文章就介绍到这了,更多相关C#获取屏幕缩放比例内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • C#实现绘制浮雕图片效果实例

    C#实现绘制浮雕图片效果实例

    这篇文章主要介绍了C#实现绘制浮雕图片效果实例,是C#程序设计中非常实用的一个功能,需要的朋友可以参考下
    2014-08-08
  • 详解 c# 克隆

    详解 c# 克隆

    这篇文章主要介绍了详解 c# 克隆的相关资料,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-11-11
  • WinForm中comboBox控件数据绑定实现方法

    WinForm中comboBox控件数据绑定实现方法

    这篇文章主要介绍了WinForm中comboBox控件数据绑定实现方法,结合实例形式分析了WinForm实现comboBox控件数据绑定的常用方法与相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • C#中IEnumerator<T>和IEnumerable的区别

    C#中IEnumerator<T>和IEnumerable的区别

    在C#中,IEnumerator<T>和IEnumerable是用于实现迭代的接口,本文主要介绍了C#中IEnumerator<T>和IEnumerable的区别,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • C#字符串的常用操作工具类代码分享

    C#字符串的常用操作工具类代码分享

    这篇文章主要介绍了C#字符串的常用操作工具类代码分享,需要的朋友可以参考下
    2014-04-04
  • WinForm调用百度地图接口用法示例

    WinForm调用百度地图接口用法示例

    这篇文章主要介绍了WinForm调用百度地图接口用法,结合具体实例形式简单分析了WinForm WebBrower控件与前端百度接口交互的相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • C#中使用Override和New关键字进行版本控制

    C#中使用Override和New关键字进行版本控制

    在 C# 中,override 和 new 关键字用于控制类之间的成员方法的隐藏和重写,理解它们之间的差异和使用场景对于设计灵活且易于维护的代码至关重要,在这篇博客中,我们将详细探讨这两个关键字的用法,并通过示例来说明它们的实际应用,需要的朋友可以参考下
    2024-10-10
  • C#锁住文件的操作步骤

    C#锁住文件的操作步骤

    在本篇文章里小编给大家整理的是关于C#锁住文件的操作步骤以及相关知识点,需要的朋友们参考下。
    2019-08-08
  • C#多线程之线程池(ThreadPool)

    C#多线程之线程池(ThreadPool)

    这篇文章介绍了C#多线程之线程池(ThreadPool)的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C# 程序通用结构

    C# 程序通用结构

    这篇文章主要介绍了C# 程序通用结构,C# 程序由一个或多个文件组成。 每个文件均包含零个或多个命名空间。 一个命名空间包含类、结构、接口、枚举、委托等类型或其他命名空间,具体相关内容请需要的小伙伴参考下面文章的详细内容<BR>
    2021-12-12

最新评论