翼度科技»论坛 编程开发 .net 查看内容

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

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
一般方法

System.Windows.Forms.Screen类
  1. // 获取当前主屏幕分辨率
  2. int screenWidth = Screen.PrimaryScreen.Bounds.Width;
  3. int screenHeight = Screen.PrimaryScreen.Bounds.Height;
  4. // 获取指定屏幕分辨率
  5. Screen secondaryScreen = Screen.AllScreens[1];
  6. int secondaryScreenWidth = secondaryScreen.Bounds.Width;
  7. int secondaryScreenHeight = secondaryScreen.Bounds.Height;
复制代码
System.Windows.SystemParameters类
  1. // 获取当前主屏幕分辨率
  2. double screenWidth = SystemParameters.PrimaryScreenWidth;
  3. double screenHeight = SystemParameters.PrimaryScreenHeight;
  4. // 获取所有屏幕的分辨率
  5. double virtualScreenWidth = SystemParameters.VirtualScreenWidth;
  6. double virtualScreenHeight = SystemParameters.VirtualScreenHeight;
复制代码
虚拟屏幕是指所有物理屏幕组合成的逻辑屏幕,可以用于跨越多个物理屏幕显示应用程序。
这两个方法都可以在正常情况下获取到屏幕的分辨率 - 当桌面缩放比例不是 100% 的时候获取到的分辨率就是“真实”的分辨率了,而是按缩放比例调整以后屏幕显示的内容的宽度和高度。
Windows API

一开始写了个只获取 DPI 缩放比例的,然后自己手动乘一下,但是调用System.Windows.Interop的时候在同事电脑上找不到这个命名空间,不知道什么原因,后来找到了一篇类似功能的文章,微调了一下:
  1. using System;
  2. using System.Drawing;
  3. using System.Runtime.InteropServices;
  4. namespace ScreenDPIHelper
  5. {
  6.     public class ScreenDPIHelper
  7.     {
  8.         #region Win32 API
  9.         [DllImport("user32.dll")]
  10.         static extern IntPtr GetDC(IntPtr ptr);
  11.         [DllImport("gdi32.dll")]
  12.         static extern int GetDeviceCaps(
  13.         IntPtr hdc, // handle to DC
  14.         int nIndex // index of capability
  15.         );
  16.         [DllImport("user32.dll", EntryPoint = "ReleaseDC")]
  17.         static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDc);
  18.         #endregion
  19.         #region DeviceCaps - 设备属性 常量
  20.         const int HORZRES = 8;
  21.         const int VERTRES = 10;
  22.         const int LOGPIXELSX = 88;
  23.         const int LOGPIXELSY = 90;
  24.         const int DESKTOPVERTRES = 117;
  25.         const int DESKTOPHORZRES = 118;
  26.         #endregion
  27.         #region 属性
  28.         // 获取屏幕分辨率当前物理大小
  29.         public static Size WorkingArea
  30.         {
  31.             get
  32.             {
  33.                 IntPtr hdc = GetDC(IntPtr.Zero);
  34.                 Size size = new Size();
  35.                 size.Width = GetDeviceCaps(hdc, HORZRES);
  36.                 size.Height = GetDeviceCaps(hdc, VERTRES);
  37.                 ReleaseDC(IntPtr.Zero, hdc);
  38.                 return size;
  39.             }
  40.         }
  41.         // 当前系统DPI_X 大小 一般为96
  42.         public static int DpiX
  43.         {
  44.             get
  45.             {
  46.                 IntPtr hdc = GetDC(IntPtr.Zero);
  47.                 int DpiX = GetDeviceCaps(hdc, LOGPIXELSX);
  48.                 ReleaseDC(IntPtr.Zero, hdc);
  49.                 return DpiX;
  50.             }
  51.         }
  52.         // 当前系统DPI_Y 大小 一般为96
  53.         public static int DpiY
  54.         {
  55.             get
  56.             {
  57.                 IntPtr hdc = GetDC(IntPtr.Zero);
  58.                 int DpiX = GetDeviceCaps(hdc, LOGPIXELSY);
  59.                 ReleaseDC(IntPtr.Zero, hdc);
  60.                 return DpiX;
  61.             }
  62.         }
  63.         // 获取真实设置的桌面分辨率大小
  64.         public static Size DesktopResolution
  65.         {
  66.             get
  67.             {
  68.                 IntPtr hdc = GetDC(IntPtr.Zero);
  69.                 Size size = new Size();
  70.                 size.Width = GetDeviceCaps(hdc, DESKTOPHORZRES);
  71.                 size.Height = GetDeviceCaps(hdc, DESKTOPVERTRES);
  72.                 ReleaseDC(IntPtr.Zero, hdc);
  73.                 return size;
  74.             }
  75.         }
  76.         // 获取宽度缩放百分比
  77.         public static float ScaleX
  78.         {
  79.             get
  80.             {
  81.                 IntPtr hdc = GetDC(IntPtr.Zero);
  82.                 float ScaleX = (float)GetDeviceCaps(hdc, DESKTOPHORZRES) / (float)GetDeviceCaps(hdc, HORZRES);
  83.                 ReleaseDC(IntPtr.Zero, hdc);
  84.                 return ScaleX;
  85.             }
  86.         }
  87.         // 获取高度缩放百分比
  88.         public static float ScaleY
  89.         {
  90.             get
  91.             {
  92.                 IntPtr hdc = GetDC(IntPtr.Zero);
  93.                 float ScaleY = (float)(float)GetDeviceCaps(hdc, DESKTOPVERTRES) / (float)GetDeviceCaps(hdc, VERTRES);
  94.                 ReleaseDC(IntPtr.Zero, hdc);
  95.                 return ScaleY;
  96.             }
  97.         }
  98.         #endregion
  99.     }
  100. }
复制代码
这个类用到了user32.dll和gdi32.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/archive/2023/04/26/17355056.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具