using System;
using System.Drawing;
using System.Runtime.InteropServices;
namespace Common.system
{
///
/// 获取系统DPI缩放倍数和真实大小
///
public class PrimaryScreen
{
#region Win32 API
[DllImport("user32.dll")]
private static extern IntPtr GetDC(IntPtr ptr);
[DllImport("gdi32.dll")]
private static extern int GetDeviceCaps(
IntPtr hdc, // handle to DC
int nIndex // index of capability
);
[DllImport("user32.dll", EntryPoint = "ReleaseDC")]
private static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDc);
#endregion
#region DeviceCaps常量
///
/// 屏幕的宽度(像素);
///
private const int HORZRES = 8;
///
/// 屏幕的高度
///
private const int VERTRES = 10;
///
/// 沿屏幕宽度每逻辑英寸的像素数,在多显示器系统中,该值对所显示器相同
///
private const int LOGPIXELSX = 88;
///
/// 沿屏幕高度每逻辑英寸的像素数,在多显示器系统中,该值对所显示器相同;
///
private const int LOGPIXELSY = 90;
///
/// Windows NT:可视桌面的以像素为单位的高度。
///
private const int DESKTOPVERTRES = 117;
///
/// DESKTOPHORZRES:Windows NT:可视桌面的以像素为单位的宽度。如果设备支持一个可视桌面或双重显示则此值可能大于VERTRES;
///
private const int DESKTOPHORZRES = 118;
#endregion
#region 属性
///
/// 获取屏幕分辨率当前物理大小 设置缩放后
///
public static Size WorkingArea
{
get
{
IntPtr hdc = GetDC(IntPtr.Zero);
Size size = new Size
{
Width = GetDeviceCaps(hdc, HORZRES),
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 DESKTOP
{
get
{
IntPtr hdc = GetDC(IntPtr.Zero);
Size size = new Size
{
Width = GetDeviceCaps(hdc, DESKTOPHORZRES),
Height = GetDeviceCaps(hdc, DESKTOPVERTRES)
};
ReleaseDC(IntPtr.Zero, hdc);
return size;
}
}
///
/// 获取宽度缩放百分比
///
public static float ScaleX
{
get
{
IntPtr hdc = GetDC(IntPtr.Zero);
/*int t = */
GetDeviceCaps(hdc, DESKTOPHORZRES);
/* int d = */
GetDeviceCaps(hdc, HORZRES);
float mScaleX = GetDeviceCaps(hdc, DESKTOPHORZRES) / (float)GetDeviceCaps(hdc, HORZRES);
ReleaseDC(IntPtr.Zero, hdc);
return mScaleX;
}
}
///
/// 获取高度缩放百分比
///
public static float ScaleY
{
get
{
IntPtr hdc = GetDC(IntPtr.Zero);
float scaleY = (float)GetDeviceCaps(hdc, DESKTOPVERTRES) / GetDeviceCaps(hdc, VERTRES);
ReleaseDC(IntPtr.Zero, hdc);
return scaleY;
}
}
///
/// 缩放后的大小
///
///
public static SizeF ScaleScreenSize => new SizeF(DESKTOP.Width / (DpiX / 96f), DESKTOP.Height / (DpiY / 96f));
///
/// 获取缩放后的工作区域大小
///
public static RectangleF ScaleWorkingAreaSize
{
get
{
RectangleF rect = System.Windows.Forms.Screen.GetWorkingArea(new System.Drawing.Point((int)ScaleScreenSize.Width, (int)ScaleScreenSize.Height));
return new RectangleF(
rect.X / (DpiX / 96f),
rect.Y / (DpiX / 96f),
rect.Width / (DpiX / 96f),
rect.Height / (DpiY / 96f)
);
}
}
#endregion
}
}