首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取windows下的实际屏幕dpi/ppi

获取windows下的实际屏幕dpi/ppi
EN

Stack Overflow用户
提问于 2012-09-29 20:50:32
回答 4查看 35.2K关注 0票数 23

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

我尝试使用以下代码:

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

代码语言:javascript
复制
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。

代码语言:javascript
复制
SetProcessDPIAware(); //true
HDC screen = GetDC(NULL);
double hPixelsPerInch = GetDeviceCaps(screen,LOGPIXELSX);
double vPixelsPerInch = GetDeviceCaps(screen,LOGPIXELSY);
ReleaseDC(NULL, screen);
return (hPixelsPerInch + vPixelsPerInch) * 0.5;
EN

回答 4

Stack Overflow用户

发布于 2012-09-30 00:36:57

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

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

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

已更新

正如其他人所指出的,在新的监视器和操作系统(EDID)之间有双向通信的标准,这可能会使这些信息对某些设备可用。但我还没有找到提供此信息的监视器。

即使EDID普遍可用,但在一般情况下仍然无法解决,因为显示器可以是视频投影仪,其中DPI将取决于缩放、焦点、镜头类型和投掷距离。投影仪极不可能知道投掷距离,因此它无法报告实际的DPI。

票数 15
EN

Stack Overflow用户

发布于 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来获取数据。

How to get monitor size

所以顶部的帖子是完全错误的,100%。

票数 13
EN

Stack Overflow用户

发布于 2012-12-19 19:33:03

使用下面的方法可以发现获取DPI信息会产生精确值。

代码语言:javascript
复制
ID2D1Factory* m_pDirect2dFactory;
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pDirect2dFactory);
FLOAT dpiX, dpiY;
m_pDirect2dFactory->GetDesktopDpi( &dpiX, &dpiY );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12652835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档