Как я могу отслеживать последний DPI, отправленный WM_DPICHANGED в WPF?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу отслеживать последний DPI, отправленный WM_DPICHANGED в WPF?

Сообщение Anonymous »

Я хочу масштабировать свое приложение WPF в соответствии с доступным разрешением экрана. Я знаю, что существует поддержка Per Monitor DPI, но это совершенно другое, чего я хочу достичь. Я хочу отключить масштабирование для моего приложения WPF, даже если Windows имеет некоторый масштаб для каждого монитора или масштаб всей системы. Я понимаю, что если масштабирование системы отключено, то основной моей целью является то, какой коэффициент масштабирования решит использовать Windows.
Чтобы масштабировать мое приложение WPF в соответствии с начальным DPI во время запуска, которое мне нужно. чтобы получить текущий DPI. И текущий DPI для окна всегда равен последнему DPI, отправленному WM_DPICHANGED.
вот мой код:

Код: Выделить всё

 public partial class MainWindow : Window
{
private HwndSource hwndSource;
public MainWindow()
{
InitializeComponent();
}
protected override void OnSourceInitialized(EventArgs e)
{
hwndSource = PresentationSource.FromVisual((Visual) sender) as HwndSource;
hwndSource.AddHook(new HwndSourceHook(WndProc));
}
private const int WM_DPICHANGED = 0x02E0;
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WM_DPICHANGED)
{
handled = true;
}
return IntPtr.Zero;
}
}
Ознакомьтесь с этим Кодексом. Вот как я отключаю масштабирование системы. Но недостатком является то, что начальное разрешение не определяется при перезапуске приложения с другим разрешением экрана (DPI). Он не получает WM_DPICHANGED при запуске и не влияет на первоначальный рендеринг.
Мне просто нужно найти последний DPI, отправленный WM_DPICHANGED. Если я каким-то образом отслежу это, то смогу легко масштабировать свое приложение в соответствии с этим. Итак, изначальной проблемы с DPI нет.
Я это знаю, я много говорю, и весь вопрос довольно запутанный. Итак, здесь я кратко излагаю вопрос и то, что я хочу в качестве ответа. Я разделил это на две части:
  • Как отследить последний DPI, отправленный WM_DPICHANGED?

    После получения последнего WM_DPICHANGED я хочу применить его в масштабировании моего интерфейса WPF, чтобы определялся начальный DPI и мое приложение масштабировалось само по себе, а не системой/ОС.
В переполнении стека доступно множество решений на основе C#, но ни одно из них не работает, и довольно старые не работают в текущей Windows 11. среда. Пожалуйста, попробуйте добавить/изменить мой код на основе Win32. Другие решения на основе кода на чистом C# также приветствуются, если каждый шаг описан правильно.

Подробнее здесь: https://stackoverflow.com/questions/786 ... ged-in-wpf
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»