GetDeviceCaps获取的物理屏幕大小不是我的屏幕的实际物理大小

时间:2015-05-27 02:04:00

标签: c++ winapi

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

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

PS:我需要DPI值来渲染地图。

1 个答案:

答案 0 :(得分:10)

正如评论所示,GetDeviceCaps(HORSZIE / VERTSIZE)众所周知是不准确的。它总是那样,而且可能总是这样。你无能为力,所以你必须假装这个API不存在并继续前进。它无法帮助您找到显示器的实际尺寸。您最好只假设一个固定的默认值,并让用户在必要时手动调整尺寸。

幸运的是,有人已经做过研究并想出了一种更好的方法来查找Windows上显示器的物理尺寸。在一篇名为Reading Monitor Physical Dimensions, or: Getting the EDID, the Right Way的博客文章中,Ofek介绍了如何使用Windows的SetupAPI从montior的EDID获取更准确的维度。程序概要描述如下:

  
      
  1. 调用SetupDiGetClassDevsEx获取HDEVINFO句柄。
  2.   
  3. 在调用SetupDiEnumDeviceInfo时使用此HDEVINFO来填充SP_DEVINFO_DATA结构。
  4.   
  5. 在调用SetupDiOpenDevRegKey时同时使用HDEVICE和HDEVINFO,最终将HKEY转换为所需的注册表项 -   持有EDID块。
  6.   

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

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