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 感知。
  • 线程创建的窗口的 DPI 感知将取决于创建窗口时调用线程的 DPI 感知。
  • 当调用窗口的窗口过程时,线程会自动切换到创建窗口时正在使用的 DPI 感知上下文。

阅读以下引用资料

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

相关文章:

windows - 在 HtmlHelp 中禁用打印按钮

python - 如何在 python 中获得按创建日期排序的目录列表?

c# - 将列表(String)保存到应用程序/隔离存储(Win8.1)

windows - 使用powershell查找设置为唤醒电脑的计划任务

windows - 如何在 Windows 上与 NTP 服务器同步时间

c++ - 从(开放的)Solaris 交叉编译到 Windows?

delphi - 使用 Delphi 创建压缩(Zipped)文件夹

c++ - 更改通过钩子(Hook)的击键(c/c++)

c++ - MFC:动态 CEdit ctrl 没有应用与非动态 CEdit ctrl 相同的视觉样式

c# - 如何为在 Windows 10 上运行的 Windows 8.1 应用程序指定初始窗口大小