如何从Winapi(在C或C ++中)检测当前的屏幕分辨率?
一些背景知识:
我想开始一个新的OpenGL全屏窗口,但希望它以桌面已经设置的相同水平和垂直大小打开。 (现在当每个人都使用LCD屏幕时,我认为这是获得屏幕原始分辨率的最佳方式。)
我并不急需知道桌面颜色深度,虽然这将是一个不错的奖励。
答案 0 :(得分:65)
编辑: 重要的是要记住监视器并不总是在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支持多显示器
答案 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