如何防止 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
?这是我能想到的两个选项:
- 以某种方式拦截 PInvoke 对 SetProcessDPIAware 的调用。
- 使 GetEntryAssembly() return 成为程序集。
我读过有关创建具有入口程序集的 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)。
我想将一段 c#/WPF 代码集成到遗留(非 .net)应用程序中。通常人们会使用 DisableDpiAwareness
属性,但是因为应用程序不是 运行 on .net Assembly.GetEntryAssembly()
returns null 因此 DisableDpiAwareness attribute does not work (我相信) .
我曾尝试使用清单中的 dpiAware
属性来禁用 dpi 感知,但这也没有用。
有没有办法阻止 WPF 在这种情况下调用 SetProcessDPIAware
?这是我能想到的两个选项:
- 以某种方式拦截 PInvoke 对 SetProcessDPIAware 的调用。
- 使 GetEntryAssembly() return 成为程序集。
我读过有关创建具有入口程序集的 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)。