如何在C#.NET中获取DPI?

Lea*_*ing 10 .net c# dpi winforms

我正在尝试使用C#构建Windows窗体应用程序.

如何在.NET中获得DPI?

我之前读过有DPIX和DPIY,它可以在.NET中用来获取当前的DPI.

那是对的吗?

谢谢大家.

Tho*_*mar 27

使用Graphics该类的实例.您可以在表单中使用以下内容(可以在表单的Load事件处理程序中):

float dx, dy;

Graphics g = this.CreateGraphics();
try
{
    dx = g.DpiX;
    dy = g.DpiY;
}
finally
{
    g.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

  • 我发现它甚至在Windows 10上返回96,缩放设置为150%.这是一个较旧的应用程序,它不会告诉Windows它是DPI意识到的.我认为这种方法必须进行额外的更改才能工作. (7认同)
  • @DanielEarwicker Dpi不依赖于windows的缩放.这取决于屏幕.dpi值表示以英寸为单位的像素数(或ppi - 每英寸像素数).它具有不同的X和Y值,因为像素不是完美的正方形,它们实际上是矩形的.当您想要以真实世界大小显示某些内容时使用DPI(例如,如果要在屏幕上显示3英寸宽和5英寸高的矩形),则其大小(以像素为单位)将为"宽度= 3*DpiX" ; 高度= 5*DpiY;` (3认同)

Pav*_*dov 7

在 WinForms 应用程序中获取 DPI 的现代方法

在 .NET Framework 4.7 或更高版本(例如 .NET 6.0)中,可以使用Control.DeviceDpi属性获取当前显示控件的屏幕的 DPI 值。

int dpi = this.DeviceDpi;
Run Code Online (Sandbox Code Playgroud)

Control.DeviceDpi属性返回的值取决于应用程序的 DPI 感知模式。

在 .NET 5.0 及更高版本中,您可以使用Application.SetHighDpiMode方法在 WinForms 应用程序的入口点设置 DPI 感知。此 MSDN 页面上列出了可能的模式。最佳模式是“PerMonitorV2”,它考虑了当前屏幕的 DPI 设置:

Application.SetHighDpiMode(HighDpiMode.PerMonitorV2);
Run Code Online (Sandbox Code Playgroud)

在 .NET 4.7 和 .NET 4.8 中,您应该在清单文件中声明应用程序的 DPI 感知。我推荐“PerMonitorV2”。请查看以下文档主题以获取更多信息和示例:

设置进程的默认 DPI 感知