如何检测当前屏幕分辨率?

时间:2011-01-07 23:40:08

标签: c++ c winapi api resolution

如何从Winapi(在C或C ++中)检测当前的屏幕分辨率?

一些背景知识:

我想开始一个新的OpenGL全屏窗口,但希望它以桌面已经设置的相同水平和垂直大小打开。 (现在当每个人都使用LCD屏幕时,我认为这是获得屏幕原始分辨率的最佳方式。)

我并不急需知道桌面颜色深度,虽然这将是一个不错的奖励。

7 个答案:

答案 0 :(得分:65)

  • 主监视器的大小:GetSystemMetrics SM_CXSCREEN / SM_CYSCREEN(也可以使用GetDeviceCaps)
  • 所有显示器的尺寸(合并):GetSystemMetrics SM_CX / YVIRTUALSCREEN
  • 主监视器上的工作区大小(不包括任务栏和其他停靠栏的屏幕):SystemParametersInfo SPI_GETWORKAREA
  • 特定显示器的尺寸(工作区和“屏幕”):GetMonitorInfo

编辑: 重要的是要记住监视器并不总是在0x0处“开始”,所以只知道大小不足以定位窗口。您可以使用MonitorFromWindow查找窗口所在的监视器,然后调用GetMonitorInfo

如果您想要使用低级别路线或更改分辨率,您需要使用EnumDisplayDevices,EnumDisplaySettings和ChangeDisplaySettings(这是获得刷新率AFAIK的唯一方法,但GetDeviceCaps会告诉您颜色深度)

答案 1 :(得分:6)

当系统使用DPI virtualization(Vista及以上版本)时,使用GetSystemMetrics或GetWindowRect将失败以获得真正的屏幕分辨率(您将获得虚拟分辨率),除非您创建了{{3} }。

因此,此处的最佳选择(简单和向后兼容)是将 EnumDisplaySettings 与ENUM_CURRENT_SETTINGS一起使用。

答案 2 :(得分:5)

这是GetSystemMetrics这些参数:
SM_CXSCREEN<宽度
SM_CYSCREEN<高度

正如它所说(SM_CXSCREEN):

  

主要屏幕的宽度   显示器,以像素为单位。这是   通过调用获得的相同值   GetDeviceCaps如下:   GetDeviceCaps(hdcPrimaryMonitor,   HORZRES)。

答案 3 :(得分:3)

我认为SystemParametersInfo可能有用。

编辑:同时查看GetMonitorInfo

答案 4 :(得分:3)

MFC示例使用GetSystemMetrics EnumDisplayMonitors和GetMonitorInfo支持多显示器

请点击此链接:Monitor enumeration with source code

答案 5 :(得分:2)

大约一周前删除,然后编辑3-4-13。

对于用户决定的情况,这是一个很好的选择 以较低的分辨率(坏主意)或角落运行他们的桌面 一个人决定让他们的监视器的情况 图形控制器无法充分利用:

// get actual size of desktop
RECT actualDesktop;
GetWindowRect(GetDesktopWindow(), &actualDesktop);

答案 6 :(得分:0)

我使用GetSystemMetrics函数

GetSystemMetrics(SM_CXSCREEN)返回屏幕宽度(以像素为单位)

GetSystemMetrics(SM_CYSCREEN) - 以像素为单位的高度

https://msdn.microsoft.com/en-us/library/windows/desktop/ms724385%28v=vs.85%29.aspx