【问题标题】:Declaring high DPI awareness per window on Windows 8在 Windows 8 上声明每个窗口的高 DPI 感知
【发布时间】:2014-12-26 04:38:59
【问题描述】:

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

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

如果目前无法做到这一点,是否可以联系 Microsoft 工程师,以便将其添加到未来版本的 Windows 中?

【问题讨论】:

  • 很好的链接,但不幸的是,似乎只有少数微软产品参与其中。据我所知,一般来说,Windows 没有任何东西。
  • DPI 感知是进程范围的,而不是每个窗口的,因为当您调用GetCursorPos() 时,系统如何知道要咨询哪个窗口的 DPI?没有窗口句柄参数。这个问题无法解决。
  • 谢谢雷蒙德。我认为来自你,这一定是明确的答案。 :-) 如果您将此作为答案发布,我会接受。
  • 我预计,由于 Windows 8.1 的实现如此混乱,甚至 Windows 8.1 的控制面板都不支持每个显示器的 DPI 感知,没有大量故障,这一切都将得到重建在 Windows 10 中。哦,有趣。为了好玩,请尝试将屏幕分辨率窗口从 96 dpi 的显示器拖到 150+ dpi 的显示器上,然后再拖回来。

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


【解决方案1】:

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

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

阅读以下参考资料

【讨论】:

【解决方案2】:

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

正如上面的 Raymond cmets 一样,再多的工程也无法使像 GetCursorPos 这样的 API 函数能够感知每个窗口的 DPI,因为这些函数不会通过窗口传递。

【讨论】:

  • 你可能想要合并 Raymond 的笔记,这就是我要说的关键。
  • 嗯,带有插件的应用程序不一定是“遗留”应用程序。但我知道这里没有简单的解决方法。
  • 我没这么说。我指的是那些不会在 dpi 感知下重建的应用程序。
猜你喜欢
  • 2018-02-09
  • 2017-08-31
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 2011-12-25
  • 2017-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多