一般方法 System.Windows.Forms.Screen類 // 獲取當前主屏幕解析度 int screenWidth = Screen.PrimaryScreen.Bounds.Width; int screenHeight = Screen.PrimaryScreen.Bounds.He ...
一般方法
System.Windows.Forms.Screen
類
// 獲取當前主屏幕解析度
int screenWidth = Screen.PrimaryScreen.Bounds.Width;
int screenHeight = Screen.PrimaryScreen.Bounds.Height;
// 獲取指定屏幕解析度
Screen secondaryScreen = Screen.AllScreens[1];
int secondaryScreenWidth = secondaryScreen.Bounds.Width;
int secondaryScreenHeight = secondaryScreen.Bounds.Height;
System.Windows.SystemParameters
類
// 獲取當前主屏幕解析度
double screenWidth = SystemParameters.PrimaryScreenWidth;
double screenHeight = SystemParameters.PrimaryScreenHeight;
// 獲取所有屏幕的解析度
double virtualScreenWidth = SystemParameters.VirtualScreenWidth;
double virtualScreenHeight = SystemParameters.VirtualScreenHeight;
虛擬屏幕是指所有物理屏幕組合成的邏輯屏幕,可以用於跨越多個物理屏幕顯示應用程式。
這兩個方法都可以在正常情況下獲取到屏幕的解析度 - 當桌面縮放比例不是 100% 的時候獲取到的解析度就是“真實”的解析度了,而是按縮放比例調整以後屏幕顯示的內容的寬度和高度。
Windows API
一開始寫了個只獲取 DPI 縮放比例的,然後自己手動乘一下,但是調用System.Windows.Interop
的時候在同事電腦上找不到這個命名空間,不知道什麼原因,後來找到了一篇類似功能的文章,微調了一下:
using System;
using System.Drawing;
using System.Runtime.InteropServices;
namespace ScreenDPIHelper
{
public class ScreenDPIHelper
{
#region Win32 API
[DllImport("user32.dll")]
static extern IntPtr GetDC(IntPtr ptr);
[DllImport("gdi32.dll")]
static extern int GetDeviceCaps(
IntPtr hdc, // handle to DC
int nIndex // index of capability
);
[DllImport("user32.dll", EntryPoint = "ReleaseDC")]
static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDc);
#endregion
#region DeviceCaps - 設備屬性 常量
const int HORZRES = 8;
const int VERTRES = 10;
const int LOGPIXELSX = 88;
const int LOGPIXELSY = 90;
const int DESKTOPVERTRES = 117;
const int DESKTOPHORZRES = 118;
#endregion
#region 屬性
// 獲取屏幕解析度當前物理大小
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;
}
}
// 當前系統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 DesktopResolution
{
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;
}
}
// 獲取寬度縮放百分比
public static float ScaleX
{
get
{
IntPtr hdc = GetDC(IntPtr.Zero);
float ScaleX = (float)GetDeviceCaps(hdc, DESKTOPHORZRES) / (float)GetDeviceCaps(hdc, HORZRES);
ReleaseDC(IntPtr.Zero, hdc);
return ScaleX;
}
}
// 獲取高度縮放百分比
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;
}
}
#endregion
}
}
這個類用到了user32.dll
和gdi32.dll
這兩個Win32動態鏈接庫,並調用了其中的函數。如:
GetDC
: 該函數返回指定視窗客戶區域或屏幕的設備上下文(DC)。ReleaseDC
: 該函數釋放由GetDC
函數獲得的指定設備上下文(DC)。GetDeviceCaps
: 該函數檢索指定設備的某些功能,如解析度,顏色深度,印表機輸出解析度等。
定義的常量參數分別為:
HORZRES
:水平方向解析度。VERTRES
:垂直方向解析度。LOGPIXELSX
:水平方向 DPI。LOGPIXELSY
:垂直方向 DPI。DESKTOPVERTRES
:真實的桌面解析度的垂直大小。DESKTOPHORZRES
:真實的桌面解析度的水平大小。
參數的值是對應參數在 Win32 API 中的索引。
可獲取的參數分別是:
WorkingArea
:獲取屏幕解析度的物理大小,也就是去掉任務欄等占據屏幕空間後的大小。DpiX
:獲取當前系統水平方向的 DPI ,DPI 是一個表示每英寸點數的度量單位,通常為 96。DpiY
:獲取當前系統垂直方向的 DPI 。DESKTOP
:獲取真實的桌面解析度大小,包括任務欄等占據空間的部分。ScaleX
:獲取寬度的縮放比例,即當前屏幕的實際寬度與標準寬度(DESKTOPHORZRES)的比值。ScaleY
:獲取高度的縮放比例,即當前屏幕的實際高度與標準高度(DESKTOPVERTRES)的比值。
參考文檔: