获取Windows下的实际屏幕dpi/ppi

Getting actual screen dpi/ppi under windows(获取Windows下的实际屏幕dpi/ppi)
本文介绍了获取Windows下的实际屏幕dpi/ppi的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望获得实际屏幕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;

推荐答案

遗憾的是,在一般情况下无法满足您的要求。

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

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

更新

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

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

这篇关于获取Windows下的实际屏幕dpi/ppi的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

socks4 with asynchronous boost::asio(带有异步Boost::ASIO的socks4)
Boost ASIO HTTP client POST(增强ASIO HTTP客户端开机自检)
asio::strandlt;asio::io_context::executor_typegt; vs io_context::strand(Asio::strandlt;asio::io_context::executor_typegt;VS io_CONTEXT::Strand)
What#39;s the difference between asio::io_context and asio::thread_pool?(ASIO::IO_CONTEXT和ASIO::THREAD_POOL有什么区别?)
How to use boost::asio with Linux GPIOs(如何在Linux GPIO中使用Boost::ASIO)
Boost asio io_service vs io_context(增强ASIO io_服务与io_Context)