【问题标题】:WPF DPI value Per Monitor每个监视器的 WPF DPI 值
【发布时间】: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。考虑到您真的只想知道您的应用程序的行为方式,而不是操作系统的行为方式。用户可以简单地使用控制面板。

标签: c# wpf dpi


【解决方案1】:

你可以使用:

GetDpiForMonitor

现在,这取决于您是否说过您的应用程序是否支持 DPI,取决于您如何获得每个显示器的 dpi 值 - 如果您不了解 DPI,那么您可能会在实际 DPI 上被骗.

如果你这样做:

SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE).

(或在您的 app.manfest 中设置)。

接下来你可以做的是枚举监视器,并调用GetDpiForMonitor 以获取用户为每个监视器设置的实际 DPI。

您可以使用这段代码使用System.Windows.Forms.ScreenMonitorFromPoint 来获取每个屏幕的句柄。

如果你看:

那里有一个示例 WPF 应用程序,带有一些帮助程序调用(在托管 c++ 中)...但您同样可以执行自己的 WIN32 API 的 DLLImports 等。

【讨论】:

  • 还没有让它工作,因为项目 NativeMethods 需要有 vs2013,我正在寻找解决方法
  • 只需加载.cs文件...将其添加到您现有的项目中...如果无法打开项目,则无需打开
  • 这是一个 c++ 项目而不是 c#
  • 如果您不想使用托管的 c++ 代码,那么您可以通过对 WIN32 调用执行 dllimport 来实现相同的目的...并根据需要处理 DPI 更改的广播消息.试试这个:stackoverflow.com/questions/41531438/…
【解决方案2】:

您需要 .Net 4.7

见:https://msdn.microsoft.com/en-us/library/ms171868(v=vs.110).aspx

部分:

  • 高 DPI 支持
  • 每个显示器的 DPI

【讨论】:

  • 感谢您的建议,但这是 DPI 意识,您无法了解所有内容如何缩放或需要缩放
猜你喜欢
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多