C# 获取系统DPI缩放比例以及分辨率大小

一般方法

System.Windows.Forms.Screen

// 获取当前主屏幕分辨率
int screenWidth = Screen.PrimaryScreen.Bounds.Width;
int screenHeight = Screen.PrimaryScreen.Bounds.Height;

// 获取指定屏幕分辨率
Screen secondaryScreen = Screen.AllScreens[1];
int secondaryScreenWidth = secondaryScreen.Bounds.Width;
int secondaryScreenHeight = secondaryScreen.Bounds.Height;

System.Windows.SystemParameters

// 获取当前主屏幕分辨率
double screenWidth = SystemParameters.PrimaryScreenWidth;
double screenHeight = SystemParameters.PrimaryScreenHeight;

// 获取所有屏幕的分辨率
double virtualScreenWidth = SystemParameters.VirtualScreenWidth;
double virtualScreenHeight = SystemParameters.VirtualScreenHeight;

虚拟屏幕是指所有物理屏幕组合成的逻辑屏幕,可以用于跨越多个物理屏幕显示应用程序。

这两个方法都可以在正常情况下获取到屏幕的分辨率 - 当桌面缩放比例不是 100% 的时候获取到的分辨率就是“真实”的分辨率了,而是按缩放比例调整以后屏幕显示的内容的宽度和高度。

Windows API

一开始写了个只获取 DPI 缩放比例的,然后自己手动乘一下,但是调用System.Windows.Interop的时候在同事电脑上找不到这个命名空间,不知道什么原因,后来找到了一篇类似功能的文章,微调了一下:

using System;
using System.Drawing;
using System.Runtime.InteropServices;

namespace ScreenDPIHelper
{
    public class ScreenDPIHelper
    {
        #region Win32 API

        [DllImport("user32.dll")]
        static extern IntPtr GetDC(IntPtr ptr);
        [DllImport("gdi32.dll")]
        static extern int GetDeviceCaps(
        IntPtr hdc, // handle to DC
        int nIndex // index of capability
        );
        [DllImport("user32.dll", EntryPoint = "ReleaseDC")]
        static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDc);

        #endregion

        #region DeviceCaps - 设备属性 常量

        const int HORZRES = 8;
        const int VERTRES = 10;
        const int LOGPIXELSX = 88;
        const int LOGPIXELSY = 90;
        const int DESKTOPVERTRES = 117;
        const int DESKTOPHORZRES = 118;

        #endregion

        #region 属性

        // 获取屏幕分辨率当前物理大小
        public static Size WorkingArea
        {
            get
            {
                IntPtr hdc = GetDC(IntPtr.Zero);
                Size size = new Size();
                size.Width = GetDeviceCaps(hdc, HORZRES);
                size.Height = GetDeviceCaps(hdc, VERTRES);
                ReleaseDC(IntPtr.Zero, hdc);
                return size;
            }
        }
        // 当前系统DPI_X 大小 一般为96
        public static int DpiX
        {
            get
            {
                IntPtr hdc = GetDC(IntPtr.Zero);
                int DpiX = GetDeviceCaps(hdc, LOGPIXELSX);
                ReleaseDC(IntPtr.Zero, hdc);
                return DpiX;
            }
        }
        // 当前系统DPI_Y 大小 一般为96
        public static int DpiY
        {
            get
            {
                IntPtr hdc = GetDC(IntPtr.Zero);
                int DpiX = GetDeviceCaps(hdc, LOGPIXELSY);
                ReleaseDC(IntPtr.Zero, hdc);
                return DpiX;
            }
        }
        // 获取真实设置的桌面分辨率大小
        public static Size DesktopResolution
        {
            get
            {
                IntPtr hdc = GetDC(IntPtr.Zero);
                Size size = new Size();
                size.Width = GetDeviceCaps(hdc, DESKTOPHORZRES);
                size.Height = GetDeviceCaps(hdc, DESKTOPVERTRES);
                ReleaseDC(IntPtr.Zero, hdc);
                return size;
            }
        }
        // 获取宽度缩放百分比
        public static float ScaleX
        {
            get
            {
                IntPtr hdc = GetDC(IntPtr.Zero);
                float ScaleX = (float)GetDeviceCaps(hdc, DESKTOPHORZRES) / (float)GetDeviceCaps(hdc, HORZRES);
                ReleaseDC(IntPtr.Zero, hdc);
                return ScaleX;
            }
        }
        // 获取高度缩放百分比
        public static float ScaleY
        {
            get
            {
                IntPtr hdc = GetDC(IntPtr.Zero);
                float ScaleY = (float)(float)GetDeviceCaps(hdc, DESKTOPVERTRES) / (float)GetDeviceCaps(hdc, VERTRES);
                ReleaseDC(IntPtr.Zero, hdc);
                return ScaleY;
            }
        }

        #endregion
    }
}

这个类用到了user32.dllgdi32.dll这两个Win32动态链接库,并调用了其中的函数。如:

  • GetDC: 该函数返回指定窗口客户区域或屏幕的设备上下文(DC)。
  • ReleaseDC: 该函数释放由GetDC函数获得的指定设备上下文(DC)。
  • GetDeviceCaps: 该函数检索指定设备的某些功能,如分辨率,颜色深度,打印机输出分辨率等。

定义的常量参数分别为:

  • HORZRES:水平方向分辨率。
  • VERTRES:垂直方向分辨率。
  • LOGPIXELSX:水平方向 DPI。
  • LOGPIXELSY:垂直方向 DPI。
  • DESKTOPVERTRES:真实的桌面分辨率的垂直大小。
  • DESKTOPHORZRES:真实的桌面分辨率的水平大小。

参数的值是对应参数在 Win32 API 中的索引。

可获取的参数分别是:

  • WorkingArea:获取屏幕分辨率的物理大小,也就是去掉任务栏等占据屏幕空间后的大小。
  • DpiX:获取当前系统水平方向的 DPI ,DPI 是一个表示每英寸点数的度量单位,通常为 96。
  • DpiY:获取当前系统垂直方向的 DPI 。
  • DESKTOP:获取真实的桌面分辨率大小,包括任务栏等占据空间的部分。
  • ScaleX:获取宽度的缩放比例,即当前屏幕的实际宽度与标准宽度(DESKTOPHORZRES)的比值。
  • ScaleY:获取高度的缩放比例,即当前屏幕的实际高度与标准高度(DESKTOPVERTRES)的比值。

参考文档:

平台调用示例

用平台调用封送数据

标识 DLL 中的函数

C# API 获取系统DPI缩放倍数跟分辨率大小

原文链接:https://www.cnblogs.com/BoiledYakult/p/17355056.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 获取系统DPI缩放比例以及分辨率大小 - Python技术站

(0)
上一篇 2023年5月1日
下一篇 2023年5月2日

相关文章

  • Python调用C# Com dll组件实战教程

    下面我会详细讲解“Python调用C#Comdll组件实战教程”的完整攻略。 什么是C#Comdll组件 C#Comdll组件是一个被编译成COM组件的C#库,通过COM技术可以将这个库的方法暴露出来并提供给其他编程语言使用。 Python调用C#Comdll组件的基本流程 导入Python的win32com模块和C#Comdll组件。 使用win32com…

    C# 2023年5月15日
    00
  • LINQ教程之LINQ操作语法

    欢迎来到本站的LINQ教程,今天我们将学习LINQ操作语法,帮助您更好地理解和使用LINQ。 什么是LINQ操作语法 LINQ操作语法(LINQ Query Syntax)是一种使用类似于SQL语句的查询语法快速查询数据的方法。 它是LINQ的一部分,使C#和VB.NET开发人员能够轻松地使用LINQ。 LINQ操作语法允许开发人员快速、易读地创建查询,包含…

    C# 2023年6月1日
    00
  • C#实现文件分割和合并的示例详解

    C#实现文件分割和合并的示例详解 本文将详细讲解C#实现文件分割和合并的过程,主要包括文件分割和文件合并两个部分。 文件分割 文件分割指将一个较大的文件分割成多个小文件,可以方便数据的传输和存储。接下来我们将介绍两种文件分割的实现方法。 实现方法一 我们可以使用FileStream类来完成文件的读取和写入操作。具体实现步骤如下: 判断待分割的文件是否存在,如…

    C# 2023年6月6日
    00
  • C#实现关机重启及注销实例代码

    首先我们需要了解一下C#中如何实现关机、重启和注销操作。 关机 C#中可以调用Windows API函数ExitWindowsEx()实现关机操作。这个函数可以接收一个整型参数,指定关机类型。比如0表示注销,1表示关机,2表示重启等等。 using System.Runtime.InteropServices; public class ShutdownHe…

    C# 2023年6月6日
    00
  • Silverlight融合ajax实现前后台数据交互

    Silverlight融合ajax实现前后台数据交互 Silverlight是一种基于.NET Framework的浏览器插件,可以用于创建丰富的互联网应用程序。在Silverlight应用程序中,可以使用ajax技术来实现前后台数据交互。本文将提供详细的“Silverlight融合ajax实现前后台数据交互”的完整攻略,包括如何使用ajax技术来实现前后台…

    C# 2023年5月15日
    00
  • C#9.0 新特性简介

    C#9.0 新特性简介 简介 C#9.0是.NET 5.0的一部分,推出于2020年11月10日。这个版本包含了许多改进和新增功能,其中一些功能是简化代码,提高应用程序开发效率的。 新特性列表 1.记录(class / struct) C#9.0提供了一个新的记录(type),类似于元组(tuple)。它使用户能够将多个相关数据组合在一起并使用一种更简洁的方…

    C# 2023年6月7日
    00
  • C#键值对容器的介绍

    C#中的键值对容器主要指的是通过特定的键来访问元素的数据结构。它通常用于需要在某个特定条件下快速查找元素的情况,比如说搜索算法、缓存机制等。C#中的键值对容器有很多种,本文将从使用频率较高的Dictionary<TKey, TValue>和ConcurrentDictionary<TKey, TValue>两个类别来进行介绍。 Dic…

    C# 2023年6月1日
    00
  • c#转换全角半角方法示例

    当我们需要对用户输入的字符或文本进行处理时,经常需要将全角字符转换为半角字符或者将半角字符转换为全角字符。c#中提供了相应的方法来实现这些功能。下面是一个完整的示例说明“c#转换全角半角方法”的攻略。 1. 转换全角到半角 使用 System.Text.RegularExpressions.Regex 类的 Replace 方法可以实现将全角字符转换为半角字…

    C# 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部