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

时间:2014-10-30 08:11:36

标签: windows winapi windows-8.1 dpi dpi-aware

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

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

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

2 个答案:

答案 0 :(得分:5)

每个窗口现在可以进行DPI感知,因为 Windows 10周年纪念日更新。 新的API SetThreadDpiAwarenessContext() 可用于设置每个窗口和每个线程的DPI感知。这完成如下。

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

阅读以下参考资料

答案 1 :(得分:2)

你在这里运气不好。 DPI意识是一个广泛的过程。在Windows 8.1中,您可以基于每个监视器声明该进程是DPI感知的。

正如Raymond在上面评论的那样,没有任何工程可以使像GetCursorPos这样的API函数具有每窗口DPI感知,因为这些函数不会传递窗口。