首页 > 编程语言 >C# 获取系统DPI缩放比例以及分辨率大小

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

时间:2023-06-12 10:56:57浏览次数:42  
标签:IntPtr 缩放 C# 获取 分辨率 int Zero hdc 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

标签:IntPtr,缩放,C#,获取,分辨率,int,Zero,hdc,DPI
From: https://www.cnblogs.com/mq0036/p/17474333.html

相关文章

  • This is probably because cuDNN failed to initialize, so try looking to see if a
    tensors=pywrap_tfe.TFE_Py_Execute(ctx._handle,device_name,op_name,tensorflow.python.framework.errors_impl.UnknownError:Failedtogetconvolutionalgorithm.ThisisprobablybecausecuDNNfailedtoinitialize,sotrylookingtoseeifawarninglogm......
  • /1WDA/C0STANDARD
    WDA怎么绘制输入框在类 /1WDA/C0STANDARD中,有一些局部类,如下: 这些类里面,就是生成网页元素的关键。比如在方法CL_INPUT_FIELD->IF_NW7_VIEW_ELEMENT_ADAPTER~SET_CONTENT 中,就有input输入框各个属性的设置(如visibility属性等)  此外还有INPUT输入框的值的一......
  • TYPESCRIPT进阶--命名空间
    以下都是我的ChartGpt老师教学的内容哦,(若想知道怎么用ChartGpt学习,或者想知道我的问答方式,可以点这个查看我的学习记录)一:理解命名空间的概念和作用命名空间是一种组织代码结构的方式,它将相关的代码放在一个命名空间内,避免命名冲突和代码重复。在TypeScript中,命名空间是通过关键......
  • C#.NET Framework RSA 私钥签名 公钥验签(验证签名) ver:20230612
    C#.NETFrameworkRSA私钥签名公钥验签(验证签名)ver:20230612 环境说明:.NETFramework4.6的控制台程序 。 .NETFramework 对于RSA的支持:NETFramework内置只支持XML格式的私钥/公钥。如果要用PKCS1,PKCS8格式的,要用到三方库BouncyCastle。 核心重点是拿到.NET......
  • How to Clear Logs of Running Docker Containers
    HowtoClearLogsofRunningDockerContainers https://www.howtogeek.com/devops/how-to-clear-logs-of-running-docker-containers/UnderstandingtheProblemDockercollectslogsfromthestandardoutputanderrorstreamsofcontainerforegroundprocesses.......
  • stm32 74HC4051 编程实现
    4个引脚,具有8通道模拟/数字多路复用器(MUX)功能 通过对S0、S1、S2置对应值,选择对应通道 再配置对应的PA6UI1-8对应的1个引脚为ADC方式   参考链接:https://controllerstech.com/multiplexer-74hc4051-and-stm32/......
  • 二维码qrcode插件
    一.安装npminstall--saveqrcode二.canvas绘制importQRCodefrom"qrcode";//选择二维码添加的元素constchild=this.$el.querySelector(".child");QRCode.toCanvas(value,options,(error,canvas)=>{if(error){throwerror;}child.app......
  • ICC2的get_cells的输出
    背景:在ICC2中使用get_cells>cell_list的时候,无法将get到的cell全部输出并出现省略号......解决方式:修改默认的app_optioncommon:set_app_options-nameshell.common.collection_result_display_limit-value1000000(原命令默认是100个)更改后可全部输出-----------------......
  • 龙芯下如何进行.net core程序开发部署
    龙芯LoongArch64已经发布了对.NETCore的支持,相关工具链也已完成,目前支持.NETCore3.1、.NET6、.NET7版本。本文以.NETCore3.1在loongnix-server8.4下部署为例说明开发部署过程。.NETCore3.1是基于上游社区.NETCore3.1-LTS-SDK制作的,同样是LTS版本。1、在龙芯开源社区下载安装.net......
  • 二叉搜索二叉搜索树-leetcode-700
    给定二叉搜索树(BST)的根节点root和一个整数值val。你需要在BST中找到节点值等于val的节点。返回以该节点为根的子树。如果节点不存在,则返回null。示例1:输入:root=[4,2,7,1,3],val=2输出:[2,1,3]示例2:输入:root=[4,2,7,1,3],val=5输出:[]提示:数中节点......