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

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



  1. using System;
  2. using System.Drawing;
  3. using System.Runtime.InteropServices;
  4. namespace XYDES
  5. {
  6. public class PrimaryScreen
  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. /// <summary>
  29. /// 获取屏幕分辨率当前物理大小
  30. /// </summary>
  31. public static Size WorkingArea
  32. {
  33. get {
  34. IntPtr hdc = GetDC(IntPtr.Zero);
  35. Size size = new Size();
  36. size.Width = GetDeviceCaps(hdc, HORZRES);
  37. size.Height = GetDeviceCaps(hdc, VERTRES);
  38. ReleaseDC(IntPtr.Zero, hdc);
  39. return size;
  40. }
  41. }
  42. /// <summary>
  43. /// 当前系统DPI_X 大小 一般为96
  44. /// </summary>
  45. public static int DpiX
  46. {
  47. get
  48. {
  49. IntPtr hdc = GetDC(IntPtr.Zero);
  50. int DpiX = GetDeviceCaps(hdc, LOGPIXELSX );
  51. ReleaseDC(IntPtr.Zero, hdc);
  52. return DpiX;
  53. }
  54. }
  55. /// <summary>
  56. /// 当前系统DPI_Y 大小 一般为96
  57. /// </summary>
  58. public static int DpiY
  59. {
  60. get
  61. {
  62. IntPtr hdc = GetDC(IntPtr.Zero);
  63. int DpiX = GetDeviceCaps(hdc,LOGPIXELSY);
  64. ReleaseDC(IntPtr.Zero, hdc);
  65. return DpiX;
  66. }
  67. }
  68. /// <summary>
  69. /// 获取真实设置的桌面分辨率大小
  70. /// </summary>
  71. public static Size DESKTOP
  72. {
  73. get
  74. {
  75. IntPtr hdc = GetDC(IntPtr.Zero);
  76. Size size = new Size();
  77. size.Width = GetDeviceCaps(hdc,DESKTOPHORZRES );
  78. size.Height = GetDeviceCaps(hdc, DESKTOPVERTRES);
  79. ReleaseDC(IntPtr.Zero, hdc);
  80. return size;
  81. }
  82. }
  83. /// <summary>
  84. /// 获取宽度缩放百分比
  85. /// </summary>
  86. public static float ScaleX
  87. {
  88. get
  89. {
  90. IntPtr hdc = GetDC(IntPtr.Zero);
  91. int t = GetDeviceCaps(hdc, DESKTOPHORZRES);
  92. int d = GetDeviceCaps(hdc, HORZRES);
  93. float ScaleX = (float)GetDeviceCaps(hdc, DESKTOPHORZRES) / (float)GetDeviceCaps(hdc, HORZRES);
  94. ReleaseDC(IntPtr.Zero, hdc);
  95. return ScaleX;
  96. }
  97. }
  98. /// <summary>
  99. /// 获取高度缩放百分比
  100. /// </summary>
  101. public static float ScaleY
  102. {
  103. get
  104. {
  105. IntPtr hdc = GetDC(IntPtr.Zero);
  106. float ScaleY = (float)(float)GetDeviceCaps(hdc, DESKTOPVERTRES) / (float)GetDeviceCaps(hdc, VERTRES);
  107. ReleaseDC(IntPtr.Zero, hdc);
  108. return ScaleY;
  109. }
  110. }
  111. #endregion
  112. }
  113. }


kkbinkbi

发布了1 篇原创文章 · 获赞 0 · 访问量 7540

私信
关注

原文地址:https://www.cnblogs.com/lonelyxmas/p/12051986.html

时间: 2024-10-27 14:46:04

C# API 获取系统DPI缩放倍数跟分辨率大小的相关文章

WPF 获取系统 DPI 的多种方法

原文:WPF 获取系统 DPI 的多种方法 由于 WPF 的尺寸单位和系统的 DPI 相关,我们有时需要获取 DPI 值来进行一些界面布局的调整,本文汇总了一些 WPF 程序中获取系统 DPI 的方法. 首先,定义如下结构体来分别保存 X 方向 和 Y 方向的分量值,通常情况下两个值是一致的. public struct Dpi { public double X { get; set; } public double Y { get; set; } public Dpi(double x, d

C/C++ Windows API——获取系统指定目录(转)

原文地址:C/C++ Windows API——获取系统指定目录 经测试,在win10 VS2017中用wprintf()输出正常,SHGetSpecialFolderPath函数也正常运行 但是用MinGW(gcc)编译器时,wprintf()函数输出乱码,必须用printf()输出,并且SHGetSpecialFolderPath()运行全部失败 原文地址:https://www.cnblogs.com/jixiaohua/p/12169120.html

Android开发之获取系统所有进程信息。

最近在做一个app,有一个进程管理模块用于管理系统中正在运行的进程,并且可以关闭进程进行加速手机的功能,基本把它实现了出来.界面的效果都是自己写的,虽然有BUG,但是基本上能满足需求,后期我会改进BUG.好了,来看看效果: 1.获取系统的可用内存和总内存. 获取系统内存中应用的信息,需要用到ActivityManager这个类,然而当你用这个类拿数据的时候你会发现,拿到的数据不正确.用这个类的API获取系统的总内存和可用内存会出现数据不正确的情况.除了这个类,Android手机中有文件描述了这些

AHK 获取系统已安装字体列表

AHK 调用API获取系统已安装字体列表代码: DllCall("gdi32\EnumFontFamilies","uint",DllCall("GetDC","uint",0),"uint",0,"uint",RegisterCallback("EnumFontFamilies"),"uint",a_FontList:="")

掉坑日志:Windows Native API与DPI缩放

高DPI显示器越来越普及,软件自然也要适应这个变化,最近实习的时候也遇到了一个关于DPI缩放的问题.因为内部框架的一个控件有BUG,会导致内容的显示出问题,后来实在没办法改成了用Windows Native API来自己定义字体,但是这一写就出问题了,本来在内部开发机100%放缩下好好的,一跑到我自己的WIN10,在2K屏放上缩放125%就字体就显示不正常了(字体变得过大). Window Vista以后的系统可以直接来个SetProcessDpiAwareness来控制程序的DPI问题,但是这

C/C++通过WMI和系统API函数获取获取系统硬件配置信息

转载:http://www.cnblogs.com/renyuan/archive/2012/12/29/2838716.html 转载:http://blog.csdn.net/jhqin/article/details/5548656 转载:http://blog.csdn.net/dongdan_002/article/details/42460343 头文件WMIInfo.h 1 /*****************************************************

iOS开发之获取系统相册ALAssetLibrary

ALAssetsLibrary包含,ALAssetsLibrary,ALAssetsGroup,ALAsset,ALAssetsFilter,ALAssetRepresentation几个类 1.框架解析 (1) ALAssetsLibrary ALAssetsLibrary类可以实现查看相册列表,增加相册,保存图片到相册等功能 具体实现见框架使用 (2) ALAssetsGroup ALAssetsGroup就是相册的类,可以通过ALAssetsLibrary遍历得到相册ALAssetsGro

关于windows系统DPI增大导致字体变大的原因分析

最近再学习WPF开发,其中提到一个特性“分辨率无关性”,主要功能就是实现开发的桌面程序在不同分辨率的电脑上显示时,会根据系统的DPI自动进行UI的缩放,从而不会导致应用程序的失真. 这个里面就提到了个系统DPI,这个其实在我们windows系统中(不论XP,还是vista之后的win7.win8.win10等),我们都可以设置.DPI就是指每英寸像素点数,及一英寸的长度上存在的像素数,它其实反映的是一个密度问题.windows系统默认情况下,系统DPI都是96DPI,这里还是得注意和显示器实际的

java中获取系统属性以及环境变量

java中获取系统属性以及环境变量 System.getEnv()和System.getProperties()的差别 从概念上讲,系统属性 和环境变量 都是名称与值之间的映射.两种机制都能用来将用户定义的信息传递给 Java 进程.环境变量产生很多其它的全局效应,由于它们不仅对Java 子进程可见,并且对于定义它们的进程的全部子进程都是可见的.在不同的操作系统上,它们的语义有细微的区别,比方,不区分大写和小写.由于这些原因,环境变量更可能有意料不到的副作用.最好在可能的地方使用系统属性.环境变