如何检测当前屏幕分辨率?
我如何从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