GetScaleFactorForMonitor值与应用的实际比例不匹配 [英] GetScaleFactorForMonitor value doesn't match actual scale applied

查看:22
本文介绍了GetScaleFactorForMonitor值与应用的实际比例不匹配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我通过互操作调用Windows8.1 Surface3平板电脑上的GetScaleFactorForMonitor()。它的响应比例系数为140。我在这台平板电脑上只有一台显示器。我将此调用的标志同时设置为最接近窗口和主显示,以查看是否有任何差异只是因为它的地狱,两者都给了140。

问题是,实际的伸缩性是150%。当我在Windows中查看显示设置时,显示为1440x2160,但本机分辨率为960x1440(这是我通过调用Screen.PrimaryScreen.Bound获得的)。

调用SystemInformation.PrimaryMonitor orSize.Height and 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
};

推荐答案

我现在意识到这是旧的,但值得指出的是为什么会发生这种情况。

科迪·格雷的评论是一个很好的起点。链接位于 https://blogs.technet.microsoft.com/askcore/2015/12/08/display-scaling-in-windows-10/标题"统一和扩展的伸缩系统"下确实显示Windows 10已经统一了所有API的比例。

然而,链接https://docs.microsoft.com/en-us/windows/win32/hidpi/high-dpi-desktop-application-development-on-windows(也来自Cody Gray)表明,Windows 10实际上并没有统一它,至少如果您使用的是较旧的Windows版本,则不是这样。

标题"每监视器DPI缩放支持UI框架"显示,例如Win32将仅返回1703版(创建者更新)的正确值,而如果使用Windows 1607+版,则UWP将使用统一缩放。

如果调用了GetScaleFactorForDevice(即100、140或180),Windows的早期版本将返回相同的值。

这篇关于GetScaleFactorForMonitor值与应用的实际比例不匹配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆