【发布时间】:2015-11-12 18:27:40
【问题描述】:
我是 WPF(以及 DPI 感知 API)的新手,正在编写一个在 Windows 7、8.1 和 10 中运行的应用程序。我使用具有不同每个显示器 DPI 设置的多个显示器,并且有兴趣制作我的应用程序尽可能跨桌面配置兼容。
我已经知道可以将 Manifest 添加到 WPF 应用程序,取消注释 DPI 感知部分,并将其设置为 True/PM。这成功地允许程序在 Windows 8.1 和 10 中支持 Per-Monitor DPI(因此在各种显示器上看起来干净而清晰),但在 Windows 7 中作为系统感知运行。
但是我们可以做得更好吗?
Microsoft 提供了一个neat tutorial here that shows how to create a Per-Monitor DPI-Aware WPF 应用程序。
他们所做的实际上是在 C++ 中创建一个新对象来替换 <Window>,该对象使用 Windows 8.1 API 不仅可以检测监视器之间的 DPI 变化,还可以在运行时重新调整应用程序的大小,有效匹配 DPI 的变化。
最终结果是,不仅应用程序 Per-DPI 感知和清晰的外观,而且当在各种尺寸的大型和小型显示器之间切换时,应用程序会要求用户更改屏幕上相同的物理尺寸(以英寸或厘米为单位) .
微软的 Win32 代码的缺点是它不能向后兼容 Windows 7。尝试在 7 中运行会导致应用程序崩溃。
我已经使用了 this article on Dr.Dobbs 和 this one by Kenny Karr,但对 API 的理解不足以让事情顺利进行。
有没有人知道一种类似于 Microsoft 代码的方法,在 Windows 8.1 和更新版本中,每个监视器感知的应用程序实际上会在监视器之间移动时更改大小,但运行作为 Windows 7 中的系统感知功能?
【问题讨论】: