如何在windows下获得实际的屏幕dpi / ppi?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (79)

我想获得实际的屏幕dpi / ppi,而不是在C ++中用于字体的dpi设置。

我试着用下面的代码:

版本1,报告72 dpi,这是错误的。

SetProcessDPIAware(); //true
HDC screen = GetDC(NULL);
double hSize = GetDeviceCaps(screen, HORZSIZE);
double vSize = GetDeviceCaps(screen, VERTSIZE);
double hRes = GetDeviceCaps(screen, HORZRES);
double vRes = GetDeviceCaps(screen, VERTRES);
double hPixelsPerInch = hRes / hSize * 25.4;
double vPixelsPerInch = vRes / vSize * 25.4;
ReleaseDC(NULL, screen);
return (hPixelsPerInch + vPixelsPerInch) * 0.5;

版本2报告96 dpi,这是字体的Windows dpi设置,但不是实际的屏幕dpi。

SetProcessDPIAware(); //true
HDC screen = GetDC(NULL);
double hPixelsPerInch = GetDeviceCaps(screen,LOGPIXELSX);
double vPixelsPerInch = GetDeviceCaps(screen,LOGPIXELSY);
ReleaseDC(NULL, screen);
return (hPixelsPerInch + vPixelsPerInch) * 0.5;
提问于
用户回答回答于

微软有一个GetDpiForMonitor方法:

https://msdn.microsoft.com/en-us/library/windows/desktop/dn280510(v=vs.85).aspx

监视器将它们的物理尺寸暴露给工具。你可以使用HWiNFO64工具以厘米为单位读取显示器的宽度和高度。因此,如果他们得到了它(DDI?),那么你可以自己访问这些信息。

用户回答回答于

不幸的是,在一般情况下你所要求的是不可能的。

Windows不知道物理屏幕的大小。Windows可能知道你的屏幕有1024x768像素,但它不知道屏幕有多大。你可以将电缆从旧的13英寸屏幕中拔出,并将其连接到19英寸显示器,而不必更改分辨率。DPI会有所不同,但Windows不会注意到您更换了显示器。

你可以获得打印机的真实物理尺寸和DPI(假设驱动程序不在说谎),但不能用于屏幕。至少不可靠。

扫码关注云+社区