我如何获得DPI 2不同百分比监视器?

时间:2019-02-27 12:34:40

标签: c# wpf

我的问题是,当主监视器百分比为150%,第二个监视器为100%,并且启动项目并将窗口从1切换到2时,我不知道如何获取正确的DPI。窗口状态,我得到了DPI,但是我尝试了,但是de DPI是标准144不变。

这是我的代码:

public static void GetDpi(this System.Windows.Forms.Screen screen, DpiType dpiType, out uint dpiX, out uint dpiY)
{
  var pnt = new System.Drawing.Point(screen.Bounds.Left + 1, screen.Bounds.Top + 1);
  var mona = MonitorFromPoint(pnt, 2/*MONITOR_DEFAULTTONEAREST*/);
  GetDpiForMonitor(mona, dpiType, out dpiX, out dpiY);
}

[DllImport("User32.dll")]
private static extern IntPtr MonitorFromPoint([In]System.Drawing.Point pt, [In]uint dwFlags);

[DllImport("Shcore.dll")]
private static extern IntPtr GetDpiForMonitor([In]IntPtr hmonitor, [In]DpiType dpiType, [Out]out uint dpiX, [Out]out uint dpiY);

方法调用:

uint x = 0, y = 0;
foreach (var screen in System.Windows.Forms.Screen.AllScreens)
{
  if (screen.DeviceName == currentMonitor.Name)
  {
    screen.GetDpi(currentMonitor.MonitorHandle,DpiType.Angular, out x, out y);
    break;
  }
}

1 个答案:

答案 0 :(得分:0)

默认情况下,您的应用程序设置为“系统DPI感知”。您需要将其设置为PerMonitor DPI Aware。现在有多种方法可以执行此操作,其中某些方法取决于当前正在运行的Windows版本。一种解决方法是将以下内容添加到应用程序的清单中:

 <dpiAware>true/PM</dpiAware>

如果您在Windows 10上运行,则还可以尝试致电:

SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE);

应用启动时。

祝你好运。