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

转载 2018年04月16日 11:00:57
  1. using System;  
  2. using System.Drawing;  
  3. using System.Runtime.InteropServices;  
  4.   
  5. namespace XYDES  
  6. {  
  7.     public class PrimaryScreen  
  8.     {  
  9.         #region Win32 API  
  10.                 [DllImport("user32.dll")]  
  11.                  static extern IntPtr GetDC(IntPtr ptr);  
  12.                 [DllImport("gdi32.dll")]  
  13.                  static extern int GetDeviceCaps(  
  14.                 IntPtr hdc, // handle to DC  
  15.                 int nIndex // index of capability  
  16.                 );  
  17.                 [DllImport("user32.dll", EntryPoint = "ReleaseDC")]  
  18.                  static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDc);  
  19.         #endregion  
  20.         #region DeviceCaps常量  
  21.                 const int HORZRES = 8;  
  22.                 const int VERTRES = 10;  
  23.                 const int LOGPIXELSX = 88;  
  24.                 const int LOGPIXELSY = 90;  
  25.                 const int DESKTOPVERTRES = 117;  
  26.                 const int DESKTOPHORZRES = 118;  
  27.         #endregion  
  28.  
  29.         #region 属性  
  30.         /// <summary>  
  31.         /// 获取屏幕分辨率当前物理大小  
  32.         /// </summary>  
  33.            public static Size WorkingArea  
  34.             {  
  35.                 get {  
  36.                     IntPtr hdc = GetDC(IntPtr.Zero);  
  37.                     Size size = new Size();  
  38.                     size.Width = GetDeviceCaps(hdc, HORZRES);  
  39.                     size.Height = GetDeviceCaps(hdc, VERTRES);  
  40.                     ReleaseDC(IntPtr.Zero, hdc);  
  41.                     return size;      
  42.                 }  
  43.             }  
  44.         /// <summary>  
  45.            /// 当前系统DPI_X 大小 一般为96  
  46.         /// </summary>  
  47.             public static int DpiX  
  48.             {  
  49.                 get  
  50.                 {  
  51.                     IntPtr hdc = GetDC(IntPtr.Zero);  
  52.                     int DpiX = GetDeviceCaps(hdc, LOGPIXELSX );  
  53.                     ReleaseDC(IntPtr.Zero, hdc);  
  54.                     return DpiX;  
  55.                 }  
  56.             }  
  57.         /// <summary>  
  58.         /// 当前系统DPI_Y 大小 一般为96  
  59.         /// </summary>  
  60.             public static int DpiY  
  61.             {  
  62.                 get  
  63.                 {  
  64.                     IntPtr hdc = GetDC(IntPtr.Zero);  
  65.                     int DpiX = GetDeviceCaps(hdc,LOGPIXELSY);  
  66.                     ReleaseDC(IntPtr.Zero, hdc);  
  67.                     return DpiX;  
  68.                 }  
  69.             }  
  70.         /// <summary>  
  71.             /// 获取真实设置的桌面分辨率大小  
  72.         /// </summary>  
  73.             public static Size DESKTOP  
  74.             {  
  75.                 get  
  76.                 {  
  77.                     IntPtr hdc = GetDC(IntPtr.Zero);  
  78.                     Size size = new Size();  
  79.                     size.Width = GetDeviceCaps(hdc,DESKTOPHORZRES );  
  80.                     size.Height = GetDeviceCaps(hdc, DESKTOPVERTRES);  
  81.                     ReleaseDC(IntPtr.Zero, hdc);  
  82.                     return size;      
  83.                 }  
  84.             }  
  85.   
  86.             /// <summary>  
  87.             /// 获取宽度缩放百分比  
  88.             /// </summary>  
  89.             public static float ScaleX  
  90.             {  
  91.                 get  
  92.                 {  
  93.                     IntPtr hdc = GetDC(IntPtr.Zero);  
  94.                     int t = GetDeviceCaps(hdc, DESKTOPHORZRES);  
  95.                     int d = GetDeviceCaps(hdc, HORZRES);  
  96.                     float ScaleX = (float)GetDeviceCaps(hdc, DESKTOPHORZRES) / (float)GetDeviceCaps(hdc, HORZRES);   
  97.                     ReleaseDC(IntPtr.Zero, hdc);  
  98.                     return ScaleX;  
  99.                 }  
  100.             }  
  101.             /// <summary>  
  102.             /// 获取高度缩放百分比  
  103.             /// </summary>  
  104.             public static float ScaleY  
  105.             {  
  106.                 get  
  107.                 {  
  108.                     IntPtr hdc = GetDC(IntPtr.Zero);  
  109.                     float ScaleY = (float)(float)GetDeviceCaps(hdc, DESKTOPVERTRES) / (float)GetDeviceCaps(hdc, VERTRES);  
  110.                     ReleaseDC(IntPtr.Zero, hdc);  
  111.                     return ScaleY;  
  112.                 }  
  113.             }  
  114.        #endregion  
  115.     }  

  1. }  
  2. 转载:https://blog.csdn.net/kkbinkbi/article/details/67636930

Winforms: 为什么Graphics.DpiX/DpiY总是返回96

 一、问题描述Windows中缺省的DPI值为96。在Vista中,我们把DPI设为150%,也就是144。可如果此时我们去获取属性System.Drawing.Graphics.DpiX或者Syst...
  • cadcisdhht
  • cadcisdhht
  • 2009年06月14日 20:09
  • 7296

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

using System; using System.Drawing; using System.Runtime.InteropServices; namespace XYDES { pu...
  • kkbinkbi
  • kkbinkbi
  • 2017年03月28日 14:54
  • 3172

解决Winform程序在不同分辨率系统下界面混乱

问题分析: 产生界面混乱的主要原因是,winform程序的坐标是基于点(Point)的,而Point又与DPI相关,具体就是 一英寸=72Points 一英寸=96pixels 96DPI是windo...
  • dongxinxi
  • dongxinxi
  • 2013年10月23日 14:22
  • 25457

与 DPI 相关的 API 和注册表设置

VisualStudio中有修改DPI功能的设置部分, 更新时间: 2013年10月 应用到: Windows 8.1 如果你需要执行部署自定义,以下部分说明了安装后脚本可能需要访问的注册表项和...
  • xiaojun111111
  • xiaojun111111
  • 2015年10月14日 10:32
  • 970

分辨率,dpi,dp,与最终显示大小的四角关系

可能大家都知道,一款app要想适配尽可能多的手机,在写布局文件的时候都会使用dp来代替px. 如果遇到需要特别处理的则写在指定文件夹(如:values-sw600dp, values-sw720dp-...
  • lxxlxx888
  • lxxlxx888
  • 2016年12月31日 15:00
  • 391

禁用Chrome跟随系统的DPI缩放

1、在桌面上右键Chrome图标,选择属性。 2、在目标一栏中增加自定义参数 --force-device-scale-factor=1 注意,参数和原本的内容之间要有个空格,示例如下:"C:\Pro...
  • qq_20473985
  • qq_20473985
  • 2017年08月21日 15:05
  • 4582

C#/winform设置窗体自动缩放适应不同尺寸的电脑屏幕大小

由于要用winform开发一个桌面安装版考试软件,用户量也比较多, 所以很多用户反映软件的界面经常超出屏幕,部分功能或内容无法显示完整。 软件界面有几个设置大小固定为宽1066, 高718...
  • qq718090840
  • qq718090840
  • 2016年05月09日 11:12
  • 14974

VB.NET获取dpi的方法

先介绍一下DPI的概念,百度百科的定义如下: PI是Dots Per Inch(每英寸所打印的点数或线数)的缩写,用来表示打印机打印分辨率。这是衡量打印机打印精度的主要参数之一。一般来说,该值越大,表...
  • woqin1990
  • woqin1990
  • 2013年08月22日 10:55
  • 1890

解决Winform程序在不同分辨率系统下界面混乱问题

问题分析:          产生界面混乱的主要原因是,winform程序的坐标是基于点(Point)的,而Point又与DPI相关,具体就是          一英寸 =72Points 一英...
  • u011555996
  • u011555996
  • 2016年11月30日 12:45
  • 1129

虚幻4DPI自适应缩放规则解析

UMG 支持与分辨率无关的 UI进行自动缩放,可以设置UI随窗口大小变化的股规则。在 ProjectSetting-Engine 部分下的 设置 菜单中,提供了应用于每个项目的默认 DPI 缩放规则。...
  • u012999985
  • u012999985
  • 2016年12月03日 21:01
  • 6350
收藏助手
不良信息举报
您举报文章:C# API 获取系统DPI缩放倍数跟分辨率大小
举报原因:
原因补充:

(最多只允许输入30个字)