如何防止 WPF 在非托管应用程序中调用 SetProcessDPIAware

How to prevent WPF calling SetProcessDPIAware in unmanaged application

我想将一段 c#/WPF 代码集成到遗留(非 .net)应用程序中。通常人们会使用 DisableDpiAwareness 属性,但是因为应用程序不是 运行 on .net Assembly.GetEntryAssembly() returns null 因此 DisableDpiAwareness attribute does not work (我相信) .

我曾尝试使用清单中的 dpiAware 属性来禁用 dpi 感知,但这也没有用。

有没有办法阻止 WPF 在这种情况下调用 SetProcessDPIAware?这是我能想到的两个选项:

我读过有关创建具有入口程序集的 AppDomain 的信息,但如果这可行,恐怕我将需要以某种方式编组两个 AppDomain 之间的所有调用。

看来我已经能够通过在加载 WPF 之前使用未知设置调用 SetProcessDpiAwareness 来解决我的问题。 SetProcessDPIAware 仍由 WPF 调用,它 returns 是,但 IsProcessDPIAware 总是 returns 假,我的应用程序在我的早期测试中看起来很正常。

[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
}

然后在任何 UI 代码之前调用它:

SetProcessDpiAwareness(PROCESS_DPI_AWARENESS.Process_DPI_Unaware);

请注意,此功能在 Windows 8.1 之前不存在,因此您需要检查 OS 版本,类似于我问题中链接的 github 页面所示(尽管该代码检查 Vista)。