创建后更改窗口的 dpi 感知

Posted

技术标签:

【中文标题】创建后更改窗口的 dpi 感知【英文标题】:change a window's dpi awareness after creation 【发布时间】:2018-02-09 13:57:54 【问题描述】:

我正在为游戏制作者开发 dll,但遇到了一些问题。 我似乎无法更改已创建窗口上的 dpi 设置。 这是真的还是有一些解决方法? 我一直在使用 SetProcessDpiAwareness 和 SetThreadDpiAwarenessContext。 我使用的是 c#,但如果需要,我不介意切换到 c++。

提前致谢。

【问题讨论】:

【参考方案1】:

在 Windows 10 之前,DPI 是进程范围和恒定的。从Windows 10 Anniversary Update 开始,您可以动态更改线程 DPI,这被称为 mixed mode DPI scaling,但它仍然不允许您动态更改 Windows DPI:

创建窗口时,其 DPI 感知定义为调用线程当时的 DPI 感知。 调用窗口的窗口过程时,线程会自动切换到创建窗口时使用的 DPI 感知上下文。

我能想到的唯一解决方法是更改​​线程 DPI 并用您的窗口的新实例替换旧窗口。

【讨论】:

以上是关于创建后更改窗口的 dpi 感知的主要内容,如果未能解决你的问题,请参考以下文章

从外部窗口的 GetWindowRect 获取 DPI 感知正确的 RECT

如何创建与 Windows 7 向后兼容的缩放和大小更改的 Per-Monitor DPI 感知应用程序?

SetWindowPos()跨进程DPI感知

创建 DPI 感知应用程序

AdjustWindowRectExForDpi 似乎没有调整客户区大小

C# 监听窗口分辨率/DPI变更