如何在Winapi中(用C或C ++)检测当前屏幕分辨率?
一些背景:
我想要启动一个新的OpenGL全屏窗口,但希望它打开时与桌面已设置的水平和垂直尺寸相同。(现在每个人都使用LCD屏幕,我认为这是获取屏幕本地分辨率的最佳方法。)
虽然知道桌面色彩深度也是不错的奖励,但我并不迫切需要知道。
如何在Winapi中(用C或C ++)检测当前屏幕分辨率?
一些背景:
我想要启动一个新的OpenGL全屏窗口,但希望它打开时与桌面已设置的水平和垂直尺寸相同。(现在每个人都使用LCD屏幕,我认为这是获取屏幕本地分辨率的最佳方法。)
虽然知道桌面色彩深度也是不错的奖励,但我并不迫切需要知道。
编辑说明: 需要注意的是,显示器的左上角坐标不一定是0x0,因此仅知道显示器尺寸不能确定窗口位置。您可以使用MonitorFromWindow函数查找您的窗口所在的显示器,然后调用GetMonitorInfo函数。
如果您想采用低级方式或更改分辨率,可以使用EnumDisplayDevices、EnumDisplaySettings和ChangeDisplaySettings函数(这是获取刷新率的唯一方法,但GetDeviceCaps函数可以告诉您颜色深度)。
以下是使用GetSystemMetrics函数的参数:
简而言之,这些参数可以帮助您获得主显示器屏幕的宽度和高度。
SM_CXVIRTUALSCREEN
/SM_CYVIRTUALSCREEN
来获取用户的整个屏幕。 - Ian BoydGetSystemMetrics
只提供关于主(第一个)显示器的信息,参见 https://msdn.microsoft.com/en-us/library/windows/desktop/dd162729(v=vs.85).aspx。 - Sandburg我认为 SystemParametersInfo 可能会有用。
编辑:也可以看一下 GetMonitorInfo。
屏幕上未被系统任务栏或应用程序桌面工具栏遮挡的部分
时非常有用 :) - jave.webMFC示例-使用GetSystemMetrics、EnumDisplayMonitors和GetMonitorInfo实现多显示器支持
请点击链接查看示例源代码:使用源代码枚举显示器
void GetMonitorRealResolution(HMONITOR monitor, int* pixelsWidth, int* pixelsHeight)
{
MONITORINFOEX info = { sizeof(MONITORINFOEX) };
winrt::check_bool(GetMonitorInfo(monitor, &info));
DEVMODE devmode = {};
devmode.dmSize = sizeof(DEVMODE);
winrt::check_bool(EnumDisplaySettings(info.szDevice, ENUM_CURRENT_SETTINGS, &devmode));
*pixelsWidth = devmode.dmPelsWidth;
*pixelsHeight = devmode.dmPelsHeight;
}
无论操作系统因进程的DPI感知而试图欺骗您,它都会在任何情况下返回本机分辨率。
float GetMonitorScalingRatio(HMONITOR monitor)
{
MONITORINFOEX info = { sizeof(MONITORINFOEX) };
winrt::check_bool(GetMonitorInfo(monitor, &info));
DEVMODE devmode = {};
devmode.dmSize = sizeof(DEVMODE);
winrt::check_bool(EnumDisplaySettings(info.szDevice, ENUM_CURRENT_SETTINGS, &devmode));
return (info.rcMonitor.right - info.rcMonitor.left) / static_cast<float>(devmode.dmPelsWidth);
}
float GetRealDpiForMonitor(HMONITOR monitor)
{
return GetDpiForSystem() / 96.0 / GetMonitorScalingRatio(monitor);
}
GetMonitorScalingRatio
,需要复制)。大约一周前删除,然后于3-4-13进行了编辑。
以下是一个适用于用户决定以较低分辨率运行桌面(不好的主意)或某些情况下人们决定购买他们的图形控制器无法充分利用的显示器的情况的良好解决方案:
// get actual size of desktop
RECT actualDesktop;
GetWindowRect(GetDesktopWindow(), &actualDesktop);
GetWindowRect(GetDesktopWindow)
是完全错误的。它会故意返回主监视器的矩形。 "由 GetWindowRect 或 GetClientRect 返回的桌面窗口的矩形始终等于主监视器的矩形,以便与现有应用程序兼容。" - Ian Boyd