windows - 在Windows 8上声明每个窗口对DPI的高度了解

原文 标签 windows winapi windows-8.1 dpi dpi-aware

我正在开发可在诸如Cubase之类的主机中运行的音频插件,并且希望添加对High DPI的支持。这是有问题的,因为我所知道的所有主机应用程序都声明自己对DPI的了解不高,因此DWM会自动缩放所有窗口。我正在寻找一种方法来关闭插件窗口的DWM DPI缩放,即使主机本身不支持DPI(因此它对所有其他窗口都使用DWM DPI缩放)。有人知道这是否可能吗?

对于使用大量插件的应用程序,例如音频主机,这是一个非常现实的问题,因为它们不能继续宣称自己具有高DPI意识:这将破坏所有现有的插件。因此,除非Windows提供了解决方案,否则我们将始终停留在96 dpi范围内。基本上,我认为我们需要一个比按进程设置更细粒度的解决方案,以便主机和插件可以分别声明其知名度。

如果目前无法完成此操作,是否可以联系Microsoft工程师,以便可以将其添加到Windows的将来版本中?

最佳答案

自Windows 10周年更新以来,现在每个窗口都可以了解DPI。
可以使用新的API SetThreadDpiAwarenessContext()来设置每个窗口和每个线程的DPI感知。这是如下完成的。


线程现在可以动态更改其DPI感知。
由线程创建的窗口的DPI感知将取决于创建窗口时调用线程的DPI感知。
调用窗口的Windows过程时,线程将自动切换到创建窗口时使用的DPI感知上下文。


阅读以下参考。


https://msdn.microsoft.com/en-us/library/windows/desktop/mt744321(v=vs.85).aspx
https://github.com/Microsoft/Windows-classic-samples/.../DPIAwarenessPerWindow/
(阅读自述文件)https://github.com/Microsoft/Windows-classic-samples/tree/96f883e4c900948e39660ec14a200a5164a3c7b7/Samples/DPIAwarenessPerWindow

相关文章:

c - 如何使用MinGW在Windows上使用OpenSSL编译程序

java - Android Studio与Gradle不兼容

windows - 如何使用多个命令启动cmd.exe / k?

mongodb - 在Windows 8.1上安装Mongodb的问题

c++ - Mingw-w64 +代码块:没有此类文件或目录

c++ - 处理多个文件时,我必须在COleDropTarget::OnDrop()中返回哪个值?

c - 使用CreateThread()在C中进行线程化

delphi - 如何使用纯GDI对 Canvas 区域进行颜色混合(按指定的alpha值着色)?

winapi - 调用LoadLibrary()时静默捕获Windows错误弹出窗口

c# - 计算水平偏移量以将ListView滚动到SelectedItem的中心