繁体   English   中英

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

[英]How to detect the current screen resolution?

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

一些背景:

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

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

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

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

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

当系统使用DPI 虚拟化(Vista 及以上)时,使用 GetSystemMetrics 或 GetWindowRect 将无法获得真实的屏幕分辨率(您将获得虚拟分辨率),除非您创建了DPI Aware Application

所以这里最好的选择(简单且向后兼容)是将EnumDisplaySettings与 ENUM_CURRENT_SETTINGS 一起使用。

它是带有这些参数的GetSystemMetrics
SM_CXSCREEN < 宽度
SM_CYSCREEN < 高度

正如它所说的(SM_CXSCREEN):

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

我认为SystemParametersInfo可能有用。

编辑:也看看GetMonitorInfo

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

按照此链接: 使用源代码监视枚举

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

对于用户决定以较低分辨率(坏主意)运行桌面的情况或人们决定获得其图形控制器无法充分利用的显示器的极端情况,这是一个很好的方法:

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

我使用 GetSystemMetrics 函数

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM