Как я могу получить монитор DPI 2 с другим процентом? - PullRequest
0 голосов
/ 27 февраля 2019

Моя проблема в том, что я не знаю, как получить правильное значение DPI, когда процентное содержание основного монитора составляет 150%, а второго монитора - 100%, и когда я запускаю свой проект и переключаю окно с 1 на 2. При переключениисостояние окна Я получаю 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 голосов
/ 27 февраля 2019

По умолчанию ваше приложение установлено на System DPI Aware.Вам нужно установить его в PerMonitor DPI Aware.В настоящее время существует несколько способов сделать это, некоторые из которых зависят от того, какая версия Windows работает в данный момент.Один из способов решения этой проблемы - добавить в манифест вашего приложения следующее:

 <dpiAware>true/PM</dpiAware>

Если вы работаете в Windows 10, вы также можете попробовать позвонить:

SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE);

, когда приложениезапускается.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...