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


基础教程推荐
- C++结构和函数声明。为什么它不能编译? 2022-11-07
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- 这个宏可以转换成函数吗? 2022-01-01
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
- 常量变量在标题中不起作用 2021-01-01
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- 如何检查GTK+3.0中的小部件类型? 2022-11-30
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01
- 我有静态或动态 boost 库吗? 2021-01-01
- 如何通过C程序打开命令提示符Cmd 2022-12-09