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

physical screen size acquired by GetDeviceCaps is not the actual physical size of my screen

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

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

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

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

幸运的是,已经有人在那里进行了研究,并找到了一种更好的方法来查找 Windows 上显示器的物理尺寸。在标题为 Reading Monitor Physical Dimensions, or: Getting the EDID, the Right Way Ofek describes how you can get more accurate dimensions from the montior's EDID 的博客条目中,使用 Windows' 设置 API。程序概要如下:

  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 中的尺寸弄错,而显示器仍然可以正常工作,因此没有动力让这些值正确。