C++取屏幕分辨率
#include "windows.h" #include "assert.h" int main() { // 获取窗口当前显示的监视器 // 使用桌面的句柄. HWND hWnd = GetDesktopWindow(); HMONITOR hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST); // 获取监视器逻辑宽度与高度 MONITORINFOEX miex; miex.cbSize = sizeof(miex); GetMonitorInfo(hMonitor, &miex); int cxLogical = (miex.rcMonitor.right - miex.rcMonitor.left); int cyLogical = (miex.rcMonitor.bottom - miex.rcMonitor.top); // 获取监视器物理宽度与高度 DEVMODE dm; dm.dmSize = sizeof(dm); dm.dmDriverExtra = 0; EnumDisplaySettings(miex.szDevice, ENUM_CURRENT_SETTINGS, &dm); int cxPhysical = dm.dmPelsWidth; int cyPhysical = dm.dmPelsHeight; // 缩放比例计算 实际上使用任何一个即可 double horzScale = ((double)cxPhysical / (double)cxLogical); double vertScale = ((double)cyPhysical / (double)cyLogical); assert(horzScale == vertScale); return 0; }
C# API 获取系统DPI缩放倍数跟分辨率大小
using System; using System.Drawing; using System.Runtime.InteropServices; namespace XYDES { public class PrimaryScreen { #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 属性 /// <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> /// 获取宽度缩放百分比 /// </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; } } #endregion } }
已有 4264 位网友参与,快来吐槽:
发表评论