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

新手上路,请多包涵

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

一些背景:

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

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

原文由 Prof. Falken 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

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

原文由 Anders 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

原文由 fingeros 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏