【发布时间】:2017-10-23 20:45:47
【问题描述】:
是否可以获取特定显示器的 DPI 值?
我已经尝试了所有在线的方法,但它们总是返回主监视器的值。
我用过的例子:
示例1
using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))
{
dpiX = g.DpiX;
dpiY = g.DpiY;
}
示例2
PresentationSource source = PresentationSource.FromVisual(this);
double dpiX, dpiY;
if (source != null) {
dpiX = 96.0 * source.CompositionTarget.TransformToDevice.M11;
dpiY = 96.0 * source.CompositionTarget.TransformToDevice.M22;
}
例子3
var dpiXProperty = typeof(SystemParameters).GetProperty("DpiX", BindingFlags.NonPublic | BindingFlags.Static);
var dpiYProperty = typeof(SystemParameters).GetProperty("Dpi", BindingFlags.NonPublic | BindingFlags.Static);
var dpiX = (int)dpiXProperty.GetValue(null, null);
var dpiY = (int)dpiYProperty.GetValue(null, null);
以上都不适用于特定显示器
【问题讨论】:
-
对此我不是很确定,这就是为什么我只将它放在评论中:我担心您可能从 Windows 获得的 DPI 值是指在 Windows 中配置的 DPI 设置,而不是硬件的实际 DPI 功能,因此这意味着它是全局的。它只是帮助应用程序知道要绘制多少像素才能使某些东西看起来像一英寸长。此外,获得硬件的实际 DPI 可能非常困难,如果不是不可能的话。但是让我们看看是否还有其他人知道得更好。
-
但您可以为不同的显示器指定不同的缩放比例,从而获得不同的 DPI。 jmp.sh/CJLjx2s
-
我无权访问 W10,因此无法验证这一点。要么它没有在不同的显示器上设置不同的比例,要么它设置的这个比例不是 DPI,或者,我不知道的地方有一些额外的设置。
-
它设置不同的比例,如果您在主屏幕上进行更改,则 dpi 会发生变化。但是以上方法都是获取主屏的dpi值
-
如果您不声明您的应用程序支持每个显示器的 DPI,那么操作系统会欺骗您。你可以fix that,但是你可能会遇到两个问题,正确处理通知并不是那么容易。 SetThreadDpiAwarenessContext() 是一种简单的方法,但仅适用于 Win10。考虑到您真的只想知道您的应用程序的行为方式,而不是操作系统的行为方式。用户可以简单地使用控制面板。