我是 WPF(和 DPI 感知 API)的新手,正在编写一个在 Windows 7、8.1 和 10 中运行的应用程序。我使用具有不同每个显示器 DPI 设置的多个显示器,并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容。
我已经知道可以将清单添加到 WPF 应用程序,取消注释 DPI 感知部分,并将其设置为True/PM
。这成功地使程序在 Windows 8.1 和 10 中能够感知每个显示器的 DPI(因此在各种显示器上看起来干净清晰),但在 Windows 7 中作为系统感知运行。
但我们能做得更好吗?
微软提供了一个这里的教程展示了如何创建 Per-Monitor DPI-Aware https://msdn.microsoft.com/en-us/library/windows/desktop/ee308410(v=vs.85).aspxWPF 应用程序。
他们所做的实际上是在 C++ 中创建一个新对象来替换<Window>
它使用 Windows 8.1 API 不仅可以检测显示器之间的 DPI 变化,还可以re-size运行时的应用程序,有效地匹配 DPI 的变化。
最终结果是,该应用程序不仅具有 Per-DPI 感知能力且外观清晰,而且当在各种尺寸的大小显示器之间切换时,该应用程序会要求用户更改屏幕上相同的物理尺寸(以英寸或厘米为单位) 。
Microsoft Win32 代码的缺点是它不向后兼容 Windows 7。尝试在 7 中运行会导致应用程序崩溃。
我已经经历过这篇关于多布斯博士的文章 http://www.drdobbs.com/windows/coding-for-high-dpi-displays-in-windows/240168736 and 这是肯尼·卡尔的作品 https://msdn.microsoft.com/en-us/magazine/dn574798.aspx但对 API 的理解不够深入,无法让事情正常进行。
有谁知道有一种方法可以执行类似于 Microsoft 代码的操作,在 Windows 8.1 及更高版本中,每个监视器感知的应用程序实际上将改变尺寸在显示器之间移动时,但在 Windows 7 中作为系统感知运行?
我没有看过代码,但我的猜测是由于win 7中缺少本机方法而导致崩溃。
解决这个问题的方法是修改本机方法包装器,例如(伪代码):
public int GetDPIOfMonitor(IntPtr monitorHandle)
{
if (Enviroment.OSVersion >= "6.2") // win 8 and above
{
return NativeMethods.PInvoke.GetMonitorDPI(monitorHandle);
}
else return systemDPI;
}
这样你就不会在 7 以下崩溃,因为你没有调用缺少的本机方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)