我想得到实际的屏幕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;
发布于 2012-09-30 00:36:57
不幸的是,你所要求的在一般情况下是不可能的。
Windows不知道实际的屏幕大小。Windows可能知道您的屏幕有1024x768像素,但它不知道屏幕实际有多大。您可以将电缆从旧的13英寸屏幕中拔出,并将其连接到19英寸显示器,而不更改分辨率。DPI会有所不同,但Windows不会注意到您更换了监视器。
您可以获得打印机的真实物理尺寸和DPI (假设驱动程序没有说谎),但不能获得屏幕的真实尺寸和DPI。至少不是可靠的。
已更新
正如其他人所指出的,在新的监视器和操作系统(EDID)之间有双向通信的标准,这可能会使这些信息对某些设备可用。但我还没有找到提供此信息的监视器。
即使EDID普遍可用,但在一般情况下仍然无法解决,因为显示器可以是视频投影仪,其中DPI将取决于缩放、焦点、镜头类型和投掷距离。投影仪极不可能知道投掷距离,因此它无法报告实际的DPI。
发布于 2017-02-02 14:08:31
我真的被这里的答案搞糊涂了。
微软有一个GetDpiForMonitor方法:
https://msdn.microsoft.com/en-us/library/windows/desktop/dn280510(v=vs.85).aspx
而监视器确实会将它们的物理尺寸暴露给工具。您可以使用HWiNFO64工具以厘米为单位读取显示器的宽度和高度。因此,如果他们正在获取它(DDI?),那么理所当然地您可以自己访问该信息。
甚至一个不同的Stack Overflow帖子也提到使用WmiMonitorBasicDisplayParams来获取数据。
所以顶部的帖子是完全错误的,100%。
发布于 2012-12-19 19:33:03
使用下面的方法可以发现获取DPI信息会产生精确值。
ID2D1Factory* m_pDirect2dFactory;
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pDirect2dFactory);
FLOAT dpiX, dpiY;
m_pDirect2dFactory->GetDesktopDpi( &dpiX, &dpiY );
https://stackoverflow.com/questions/12652835
复制相似问题