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

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

一些背景:

我想要启动一个新的OpenGL全屏窗口,但希望它打开与桌面已经设置为相同的水平和垂直大小。 (现在每个人都使用液晶屏幕,我认为这是获得屏幕本地分辨率的最好方法。)

我并不需要知道桌面的颜色深度,尽pipe这将是一个不错的奖励。

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

编辑:重要的是要记住,监视器并不总是从0x0“开始”,所以只知道尺寸不足以放置窗口。 您可以使用MonitorFromWindow来查找窗口所在的监视器,然后调用GetMonitorInfo

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

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

正如它所说(SM_CXSCREEN):

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

我认为SystemParametersInfo可能是有用的。

编辑:也看看GetMonitorInfo 。

MFC示例使用GetSystemMetrics EnumDisplayMonitors和GetMonitorInfo多个监视器支持

跟随这个链接: 监视枚举与源代码

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

对于用户决定以较低分辨率(坏主意)运行桌面的情况或者某个人决定获得显示器的graphics控制器无法充分利用的情况,

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

当系统使用DPI虚拟化 (Vista和以上)使用GetSystemMetrics或GetWindowRect将无法获得真正的屏幕分辨率(您将获得虚拟分辨率),除非您创buildDPI感知应用程序 。

所以这里最好的select(简单和向后兼容)是使用EnumDisplaySettings和ENUM_CURRENT_SETTINGS。

我使用GetSystemMetrics函数

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

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

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