windows - 在 Windows 8 上声明每个窗口的高 DPI 感知

标签 windows winapi windows-8.1 dpi dpi-aware

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

对于使用大量插件的应用程序,例如音频主机,这是一个非常现实的问题,因为它们不能直接声明自己具有高 DPI 感知能力:这会破坏所有现有的插件。因此,除非 Windows 提供解决方案,否则我们总是停留在 96 dpi 的状态。基本上我认为我们需要一个比设置每个进程更细粒度的解决方案,这样主机和插件就可以单独声明它们的感知级别。

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

最佳答案

Windows 10 周年更新以来,现在可以感知每个窗口的 DPI。 一个新的 API SetThreadDpiAwarenessContext() 可用于设置每个窗口和每个线程的 DPI 感知。这是按如下方式完成的。

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

阅读以下引用资料

关于windows - 在 Windows 8 上声明每个窗口的高 DPI 感知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26647908/

相关文章:

c++ - 将成熟的应用程序转换为 DLL

ruby - 为 pik 安装的 Rubies 安装 devkit

c++ - 在无限循环中调用 Sleep() 有多重要?

c# - 除非我引用该项目,否则无法加载 WinRT 组件

windows-8.1 - 我无法在 Windows 8.1 上找到 pgAdmin4 的配置

java - 如何为作为 Windows 服务运行的 Java 应用程序设置代理

java - 使用 Java 代码以管理员身份运行 cmd

c++ - Win32 程序在调用 GetSaveFileName() 或 SHBrowseForFolder() 时在 Windows 8 上崩溃

带有 Jazzy UI 的 C# 应用程序

java - 使用javac编译java文件