C# 每个监视器的WPF DPI值
是否可以获得特定监视器的DPI值 我尝试了所有联机的方法,但它们总是返回主监视器的值 我使用的例子如下: 示例1C# 每个监视器的WPF DPI值,c#,wpf,dpi,C#,Wpf,Dpi,是否可以获得特定监视器的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
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);
以上这些都不适用于特定的监视器您需要.Net 4.7
见:
章节:
- 高新闻部支助
- 每监视器DPI
GetDpiForMonitor
SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE).
(或者在你的app.manfest中设置)
接下来,您可以枚举监视器,并调用GetDpiForMonitor
,以获取用户为每个监视器设置的实际DPI
您可以使用此代码使用System.Windows.Forms.Screen
和MonitorFromPoint
来获取每个屏幕的句柄
那里有一个示例WPF应用程序,带有一些帮助程序调用(在托管c++中)……但您也可以自己进行WIN32 API的DLL移植等。对此我不是很确定,这就是为什么我只在评论中说:我担心您可能从Windows获得的DPI值是指Windows中配置的DPI设置,不是硬件的实际DPI能力,因此这意味着它是全局的。它只是帮助应用程序知道要绘制多少像素才能使某个东西显示为一英寸长。此外,要获得硬件的实际DPI可能非常困难(如果不是不可能的话)。但是,让我们看看是否有其他人知道得更好。但是,您可以为不同的监视器指定不同的缩放,以便使用不同的DPI。我没有访问W10的权限,因此无法对此进行验证。或者它没有在不同的监视器上设置不同的比例,或者它设置的这个比例不是DPI,或者,嗯,在我不知道的某个地方有一些额外的设置。它设置不同的比例,如果在主屏幕上进行更改,DPI将更改。但是如果你不声明你的应用程序是每监视器dpi感知的,上面所有的方法都会得到主屏幕的dpi值。操作系统就在你的掌握之中。你可以,但你可能会有两个问题,正确处理通知不是那么容易。SetThreadDpiAwarenessContext()是一种简单的方法,但仅适用于Win10。考虑一下,你真的只想知道你的应用程序是如何运行的,而不是操作系统的行为。用户只需使用控制面板即可。感谢您的建议,但这是DPI意识,您无法了解所有内容的缩放方式或需要缩放的方式尚未使其工作,因为项目NATEMETHOMED需要VS2013,我正在寻找一个工作负载,只需加载.cs文件……将它添加到您现有的项目……如果您不能是C++项目,而不是C,则不需要打开项目,如果您不能不使用托管C++代码,然后,您可以通过执行WIN32调用的dllimport…并处理DPI更改的广播消息(如果需要)来实现相同的功能。试试这个: