Как предотвратить вызов WPF SetProcessDPIAware в неуправляемом приложении - PullRequest
2 голосов
/ 05 августа 2020

Я хочу интегрировать фрагмент кода C # / WPF в устаревшее (не net) приложение. Обычно можно использовать атрибут DisableDpiAwareness, но поскольку приложение не запущено. net Assembly.GetEntryAssembly() возвращает значение null, и поэтому атрибут DisableDpiAwareness не работает (я считаю).

Я попытался использовать атрибут dpiAware в манифесте, чтобы отключить распознавание dpi, но это тоже не сработало.

Есть ли способ предотвратить вызов SetProcessDPIAware WPF в этой ситуации? Я могу придумать следующие два варианта:

  • Каким-то образом перехватить вызов PInvoke для SetProcessDPIAware.
  • Заставить GetEntryAssembly () вернуть сборку.

Я читал о создании AppDomain, который имеет входную сборку, но, если это сработает, я боюсь, что мне тогда придется каким-то образом маршалировать все вызовы между двумя AppDomain.

1 Ответ

1 голос
/ 06 августа 2020

Кажется, я смог исправить свои проблемы, позвонив SetProcessDpiAwareness с параметром unaware до загрузки WPF. SetProcessDPIAware по-прежнему вызывается WPF и возвращает true, но IsProcessDPIAware всегда возвращает false, и мое приложение выглядит нормально в моих ранних тестах.

[DllImport("SHCore.dll", SetLastError = true)]
private static extern bool SetProcessDpiAwareness(PROCESS_DPI_AWARENESS awareness);

private enum PROCESS_DPI_AWARENESS {
    Process_DPI_Unaware = 0,
    Process_System_DPI_Aware = 1,
    Process_Per_Monitor_DPI_Aware = 2
}

Затем вызывайте это перед любым кодом пользовательского интерфейса:

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