博客说明 :
做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; } }