C# 获取DPI和真实分辨率的方式(可以解决一直是96的问题)

博客说明 :

做WINFORM小工具,需要获取屏幕分辨率时,如果显示器不设置缩放,就没啥问题,如果显示器设置了缩放,获取到的分辨率总是错的,这时候就需要使用下面的方法了


寻找了好久,才找到这个有效方法

文章转自该博客:https://blog.csdn.net/qq_24905875/article/details/82773488


C# 获取DPI和真实分辨率的方式(可以解决一直是96的问题)

[DllImport("user32.dll")]
static extern IntPtr GetDC(IntPtr ptr);
[DllImport("gdi32.dll")]
static extern int GetDeviceCaps(IntPtr hdc, int nIndex );
[DllImport("user32.dll", EntryPoint = "ReleaseDC")]
static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDc);
const int HORZRES = 8;
const int VERTRES = 10;
const int LOGPIXELSX = 88;
const int LOGPIXELSY = 90;
const int DESKTOPVERTRES = 117;
const int DESKTOPHORZRES = 118;

/// <summary>
/// 获取屏幕分辨率当前物理大小
/// </summary>
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;    
	}
}
/// <summary>
/// 当前系统DPI_X 大小 一般为96
/// </summary>
public static int DpiX
{
	get
	{
		IntPtr hdc = GetDC(IntPtr.Zero);
		int DpiX = GetDeviceCaps(hdc, LOGPIXELSX );
		ReleaseDC(IntPtr.Zero, hdc);
		return DpiX;
	}
}
/// <summary>
/// 当前系统DPI_Y 大小 一般为96
/// </summary>
public static int DpiY
{
	get
	{
		IntPtr hdc = GetDC(IntPtr.Zero);
		int DpiX = GetDeviceCaps(hdc,LOGPIXELSY);
		ReleaseDC(IntPtr.Zero, hdc);
		return DpiX;
	}
}
/// <summary>
/// 获取真实设置的桌面分辨率大小
///  博主注:在我自己的项目中,使用了本段,可有效应对屏幕的缩放导致的获取分辨率不对的问题
/// </summary>
public static Size DESKTOP
{
	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;    
	}
}

/// <summary>
/// 获取宽度缩放百分比 (**当获取的DPI的值一直是96的时候,可以通过用此方法获取的值转化为DPI,ScaleX * 96**)
/// </summary>
public static float ScaleX
{
	get
	{
		IntPtr hdc = GetDC(IntPtr.Zero);
		int t = GetDeviceCaps(hdc, DESKTOPHORZRES);
		int d = GetDeviceCaps(hdc, HORZRES);
		float ScaleX = (float)GetDeviceCaps(hdc, DESKTOPHORZRES) / (float)GetDeviceCaps(hdc, HORZRES); 
		ReleaseDC(IntPtr.Zero, hdc);
		return ScaleX;
	}
}
/// <summary>
/// 获取高度缩放百分比
/// </summary>
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;
	}
}



发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

桂ICP备19000498号-3