以编程方式覆盖高 DPI 感知

Programmatically override the High DPI awareness

Windows10 Creator's Update Edition 中为最终用户提供了一个新选项。最终用户可以在兼容性选项卡上将 EXE 的属性更改为 "Override High DPI Scaling Behavior" 并将其设置为系统(增强)。我对其进行了测试,它适用于一些经典的 win32 应用程序。

我想通过 API 调用或清单通过代码来完成此操作。没有这方面的信息。那可能吗? 从我收到的评论中,它想澄清这是一个新的 CREATORS 更新功能,我特别想知道如何通过清单或代码设置覆盖功能的 "SYSTEM (ENHANCED)" 选择。

详情见this blog post:

<dpiAware>True/PM</dpiAware>
<dpiAwareness>PerMonitorV2, PerMonitor</dpiAwareness>

For more details on various manifest issues, see Manifest Madness

我在另一个 SO post 中找到了答案:

正确的线索是调查在 Creator's Update 中得到极大改进的新 GDI 缩放清单。在系统(增强)设置中使用。

None 的答案或评论接近。他们不断地参考旧文章。而且,还有人给这个问题打了负分:(悲哀。

DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED 现在是最新 Windows 10 SDK headers 中的有效 DPI_AWARENESS_CONTEXT(截至撰写本文时为 17134),在 windef.h 中:

定义 DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED ((DPI_AWARENESS_CONTEXT)-5)

因此,如果您希望避免在清单中执行此操作,则应在运行时调用 IsValidDpiAwarenessContext 和 SetProcessDpiAwarenessContext 以利用 GDI 缩放。

这证实 gdiScaling 与 Per monitor V2 互斥。