主屏幕尺寸的问题

16

我一直使用Screen.PrimaryScreen.Bounds.Size,感觉还好,但是在我的Windows7电脑连接到大屏幕电视时,它会给出不正确的值。

我在其他地方看到建议尝试SystemInformation.PrimaryMonitorSize,但是它给出的值相同。

当我右键单击桌面以获取屏幕分辨率时,它显示为1920x1080。而上述方法给出的是1280x720

我也尝试了WPF版本:

var w = System.Windows.SystemParameters.PrimaryScreenWidth;
var h = System.Windows.SystemParameters.PrimaryScreenHeight;
MessageBox.Show(new Size((int)w, (int)h).ToString());

通过 (右键单击桌面) 个性化 > 桌面 选项调整了显示大小为150% (因为屏幕有60英寸,您离屏幕比较远)。

如何检测这个设置,以便可以调整上述的返回值?

注意:我已经发现了一个右键可执行文件的解决方法,可以调整兼容性以禁用DPI虚拟化,但我仍然需要一个编程解决方案,以便我不必让用户自己进行调整。请参见 - http://msdn.microsoft.com/en-us/library/dd464660(VS.85).aspx#dpi_virtualization


在150%的情况下,您必须明确告诉Windows您是DPI感知的,不需要被欺骗。 - Hans Passant
2
可能是Winforms高DPI模糊字体的重复问题。 - Hans Passant
@HansPassant 那么没有办法从应用程序内部检测到这个问题吗?我尝试设置清单来测试,但是在核心库中出现了空指针错误。 - Chuck Savage
@HansPassant 我将链接中的清单复制到我的清单上,但出现错误“值不能为 null。\r\n参数名: activationContext”。 - Chuck Savage
我在Windows 10中遇到了完全相同的问题。 - Professor of programming
显示剩余3条评论
2个回答

6

可能是你在Windows中设置的DPI高于100%。

尝试使用以下方法,这将根据当前系统DPI设置缩放分辨率。

Winforms:

private Size GetDpiSafeResolution()
{
    using (Graphics graphics = this.CreateGraphics())
    {
        return new Size((Screen.PrimaryScreen.Bounds.Width * (int)graphics.DpiX) / 96
          , (Screen.PrimaryScreen.Bounds.Height * (int)graphics.DpiY) / 96);
    }
}

WPF:

private Size GetDpiSafeResolution()
{
    PresentationSource _presentationSource = PresentationSource.FromVisual(Application.Current.MainWindow);
    Matrix matix = _presentationSource.CompositionTarget.TransformToDevice;
    return new System.Windows.Size(
        System.Windows.SystemParameters.PrimaryScreenWidth * matix.M22,
        System.Windows.SystemParameters.PrimaryScreenHeight * matix.M11);
}

注意:在运行此代码之前,请确保您的MainWindow已加载


抱歉,我以为是WPF :( - sa_ddam213
这并没有帮助,那只是把1280乘以96和720乘以96。它们需要乘以1.5。 - Chuck Savage
你能测试一下我的最新版本吗?我现在无法重启电脑更改DPI,(抱歉,我不太擅长数学,这让我有点困惑,哈哈)。 - sa_ddam213
1
很久没有使用winforms了,抱歉我无法提供帮助 :( - sa_ddam213
1
感谢您的努力,请不要删除此内容,因为我们在评论中讨论了有价值的信息,这可能会帮助其他人。 - Chuck Savage
显示剩余9条评论

4
我不认为这是一个重复的问题,但答案与另一个线程相同:https://dev59.com/A2Ys5IYBdhLWcg3wAfEi#13228495。由于问题不是关于模糊字体,而是关于为什么Screen.PrimaryScreen.Bounds.Size返回错误信息,这可能会对其他人有所帮助。
我遇到了一个错误消息,mscorlib抛出了一个空错误。从这个线程http://forums.asp.net/t/1653876.aspx/1中,我能够发现取消“启用ClickOnce安全设置”修复了它。这似乎是一种hack方法,但它确实有效。

第一个链接是最佳解决方案,只用两行代码就解决了我的问题。 - Profesor08

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接