最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

今日热议: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缩放倍数跟分辨率大小

关键词: