以编程方式覆盖高DPI感知

3
在Windows 10 Creator's Update版本中,终端用户有一个新的选项。终端用户可以在兼容性选项卡上更改EXE文件的属性,将“覆盖高DPI缩放行为”设置为“系统(增强)”。我进行了测试,对于一些经典的Win32应用程序,它运作良好。
我想通过API调用或清单来实现此操作。但是目前没有相关信息,是否可能实现呢?从我得到的评论中,需要澄清这是一个新的创作者更新功能,我特别想知道如何通过清单或代码设置“SYSTEM(ENHANCED)”选项以覆盖功能。

那里有太多信息,可以在谷歌上搜索“dpiaware manifest”。这是一个链接 - Hans Passant
不是真的,不是关于如何设置最终用户获得的特定系统(增强)设置。 - user173399
你的链接指向一篇旧文章。这个“System (Enhanced)”功能是最新的创作者更新,似乎没有相关的清单或API。 - user173399
https://blogs.windows.com/buildingapps/2017/04/04/high-dpi-scaling-improvements-desktop-applications-windows-10-creators-update/ - Hans Passant
那是我最初阅读的文章,了解这个功能。但它只描述了终端用户使用系统(增强版)的解决方案。它没有提供在清单中等效的内容。 - user173399
提问者询问是否有一种使用API调用的方法,但至今在互联网上还没有任何人回答过(证据:搜索我在下面回答中提到的符号)。 - Ted.
3个回答

4
我在另一个SO帖子中找到了答案: VS2017增强系统DPI缩放 正确的线索是调查新的GDI缩放清单,它在创作者更新中得到了大幅改进。这是在系统(增强)设置中使用的。
没有任何答案或评论接近。他们继续参考旧文章。此外,有人标记了这个问题为负面:( 悲伤。

3

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

#define DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED ((DPI_AWARENESS_CONTEXT)-5)

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

这证实了gdiScaling与Per monitor V2是互斥的。


谢谢。正是我想要的。 - user173399
在C#中使用SetProcessDpiAwarenessContext API调用时,对应于DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED的值是什么? - cat_in_hat
@FoundWaldoException 它是-5。 - Ted.

0

具体细节请参考这篇博客文章

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

有关各种清单问题的更多细节,请参见Manifest Madness

这是针对 DPI 感知应用程序的。新的“系统(增强)”功能是为了让 DPI 无感知应用程序在高 DPI 上正常工作。无论如何,我已经接近解决方案并将发布答案。 - user173399

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接