【发布时间】:2015-09-29 16:16:45
【问题描述】:
我正在通过互操作调用 Windows8.1 Surface3 平板电脑上的 GetScaleFactorForMonitor()。它以 140 的比例因子响应。我在这款平板电脑上只有一台显示器。我将此调用的标志设置为最接近窗口和主显示器,以查看是否有任何差异,并且两者都给出 140。
问题是,实际缩放比例是 150%。当我在 Windows 中查看显示设置时,它显示为 1440x2160,但本机分辨率为 960x1440(我通过调用 Screen.PrimaryScreen.Bounds 获得)。
调用 SystemInformation.PrimaryMonitorSize.Height 和 Width 时,我也得到 960x1440。
我探索了另一条尝试使用 GetDpiForMonitor() 的方法。我的想法是,如果我得到原始 DPI,然后是缩放后的 DPI,我可以进行百分比计算。
它有点工作,但我得到的原始 DPI 值似乎是有效(缩放)DPI,反之亦然。对于 x 和 y 的有效 DPI,我得到 96,对于 raw,我得到 144。我希望 raw 是一个较低的数字。
这是我的电话:
GetDpiForMonitor(MonitorFromWindow(myTextbox.TopLevelControl.Handle, MONITOR_DEFAULTTONEAREST),
MONITOR_DPI_TYPE.MDT_Effective_DPI,
out effectiveDPIx,
out effectiveDPIy);
GetDpiForMonitor(MonitorFromWindow(myTextbox.TopLevelControl.Handle, MONITOR_DEFAULTTONEAREST),
MONITOR_DPI_TYPE.MDT_Raw_DPI,
out rawDPIx,
out rawDPIy);
这是我正在使用的结构,它是 MSDN 上的一个镜像。
public enum MONITOR_DPI_TYPE : int
{
MDT_Effective_DPI = 0,
MDT_Angular_DPI = 1,
MDT_Raw_DPI = 2,
MDT_Default = MDT_Effective_DPI
};
【问题讨论】:
-
我不知道为什么
GetScaleFactorForMonitor没有返回正确的比例因子。我可以重现您描述的确切行为。当我应用 150% 的比例时(测试监视器上的 DPI 为 144,而系统 DPI 为 96),GetScaleFactorForMonitor返回 140。显然人们会期望它返回 150,因为 144/96=1.5。至于你的第二个问题,我怀疑这与你没有在你的应用程序中包含一个清单来指定你是每显示器高 DPI 兼容的事实有关。见:msdn.microsoft.com/en-us/library/windows/desktop/… -
我唯一能想到的是
GetScaleFactorForMonitor是基于Windows Store的缩放模式,其实和桌面应用的缩放模式不同。 (请参阅blogs.technet.microsoft.com/askcore/2015/12/08/…,特别是名为“统一和扩展扩展系统”的部分。)您最好的选择是使用GetDpiForMonitor。太糟糕了,即使在最新版本的 Windows 10 中,每个显示器的缩放支持也完全被破坏了。这些天,Windows 团队只提供了失望。
标签: c# .net windows windows-8.1