Getting actual screen dpi/ppi under windows(获取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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:获取Windows下的实际屏幕dpi/ppi
基础教程推荐
- 设计字符串本地化的最佳方法 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++,'if' 表达式中的变量声明 2021-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01