c++ - GetDeviceCaps获取的物理屏幕尺寸不是我屏幕的实际物理尺寸

标签 c++ winapi

在 Windows 7 下,我使用以下代码获取屏幕的物理宽度(以毫米为单位)。 'hSize' 为 482,比实际尺寸大约 310(用尺子测量)大得多。这是为什么?

HDC screen = GetDC(NULL);
int hSize=GetDeviceCaps(screen,HORZSIZE);

PS:我需要 DPI 值来渲染 map 。

最佳答案

正如注释所指出的,GetDeviceCaps(HORSIZE/VERTSIZE) 是出了名的不准确。一直都是这样,而且可能永远都是这样。您对此无能为力,因此您只能假装此 API 不存在并继续前进。它不会帮助您找到显示器的实际尺寸。您最好假设一个固定的默认值,并让用户在必要时手动调整尺寸。

幸运的是,已经有人在那里进行了研究,并找到了一种更好的方法来查找 Windows 上显示器的物理尺寸。在题为 Reading Monitor Physical Dimensions, or: Getting the EDID, the Right Way 的博客条目中Ofek 描述了如何从监视器的 EDID 中获得更准确的尺寸通过使用 Windows 的 SetupAPI。流程概要如下:

  1. Call SetupDiGetClassDevsEx to get an HDEVINFO handle.
  2. Use this HDEVINFO in a call to SetupDiEnumDeviceInfo to populate an SP_DEVINFO_DATA struct.
  3. Use both HDEVICE and HDEVINFO in a call to SetupDiOpenDevRegKey, to finally get an HKEY to the desired registry key – the one that holds the EDID block.

链接的博客条目包含示例代码,以及有关他尝试过的其他替代方法的信息。

请注意,即使是 EDID 也不总是准确的。虽然显示器本身所说的是它自己的尺寸,但仍然有很多出错的机会。供应商很容易在 EDID 中的尺寸上犯错误,而显示器仍然可以完美工作,因此没有动力让这些值正确。

关于c++ - GetDeviceCaps获取的物理屏幕尺寸不是我屏幕的实际物理尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30471954/

相关文章:

c++ - std::set 比较器函数如何工作?

c++ - Zenlib 错误 : undefined reference to Open function call which uses typedef

c++ - 从 fstream 读取整行,包括空格

c++ - 有没有办法查询消息过滤器是否已经生效?

c++ - 如何在使用 CreateProcess 创建的进程上安装 Hook ?

c# - 显示数字签名/证书对话框

c++ - 使用重载取消引用运算符的成员选择

c++ - 结交类(class)

c++ - LoadLibrary 找不到 ntoskrnl

c - select 未检测到本地主机连接已关闭