Как запустить событие WinForms DpiChanged?

#winforms #.net-4.7.2 #hidpi

Вопрос:

(Нет, я пока не могу обновить эту кодовую базу до .NET Core или более новой версии.)

У меня есть приложение, которое в основном представляет собой Windows Forms и частично WPF. Когда размер шрифта изменяется во время выполнения, WPF реагирует правильно. Вместо этого Windows Forms, похоже, даже не осознает, что что-то изменилось, пока я не перезапущусь. Например, Control.DeviceDpi свойство (которое даже не было введено до версии 4.7) показывает значение, которое было точным при запуске, а не текущее.

У моего app.manifest есть:

   <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>True/PM</dpiAware>
    </asmv3:windowsSettings>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
      <dpiAwareness>PerMonitorV2, PerMonitor</dpiAwareness>
    </asmv3:windowsSettings>
  </asmv3:application>
 

У моего app.config есть:

     <appSettings>
        <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
    </appSettings>
 

Но 4,7 ввел Control.DpiChanged событие, только оно, кажется, никогда не срабатывает.

Тем не менее, если я перекрываю WndProc и слушаю WM_DPICHANGED , это срабатывает. Этот код, по-видимому, предполагает, что событие должно сработать.

По-видимому, это не так, потому что этот код условно отключает его. Но я не уверен, на какую часть я не претендую. (Я использую Windows 10 21H1, поэтому она более свежая, чем RS2.)

Комментарии:

1. Используйте .Net Framework 4.8 и переместите настройки PerMonitorV2 в app.config . Он работает только в Windows 10 (так как это вызывает GetThreadDpiAwarenessContext ). — Автоматическое изменение размера в стиле WPF-это… незавершенная работа 🙂

2. DpiChanged формально не имеет документов. Он даже был удален из индекса ссылочного источника, они действительно имели это в виду. В любом случае нет реального смысла пытаться использовать его, вместо этого отдавайте предпочтение документированным событиям (DpiChangedBefore/AfterParent). Требуется версия Win10 1703 (апрель 2017).