C# PrimaryScreen的问题。大小

C# PrimaryScreen的问题。大小,c#,winforms,C#,Winforms,一段时间以来,我对Screen.PrimaryScreen.Bounds.Size很满意,但在连接到大屏幕电视的Windows7电脑上,它给了我不正确的值 我在别处阅读了一些文章,想尝试一下SystemInformation.PrimaryMonitorSize,但它给出了相同的值 当我右键单击桌面以获得屏幕分辨率时,它会显示1920x1080。上面两个给了我1280x720 我还尝试了WPF版本: var w = System.Windows.SystemParameters.PrimaryS

一段时间以来,我对
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());
显示大小已通过(右键单击桌面)
Personalize>desktop
选项更改为150%(因为屏幕为60英寸,您坐得有点远)

如何检测这一点,以便可以调整从上面返回的值


注意:我发现了如何通过右键单击可执行文件来解决这一问题,并调整兼容性以禁用DPI虚拟化,但我仍然需要一个编程解决方案,这样我就不必让用户自己进行调整:请看-

这可能是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:


注意:在运行此代码之前,确保已加载主窗口

我不认为这是一个重复的问题,但答案与另一个线程上的相同:因为问题不是关于字体模糊,而是为什么Screen.PrimaryScreen.Bounds.Size返回错误信息。它可以帮助其他人


我确实遇到了一条错误消息,mscorlib抛出了一个空错误。从这个线程中,我发现取消选中“启用ClickOnce安全设置”“修好了。这看起来像是一个黑客,但它很有效。

@Grant你是什么意思?屏幕分辨率为
1920x1080
,没有辅助显示。这台计算机不是笔记本电脑。在150%时,您必须明确告诉Windows您知道DPI,不需要对其撒谎。可能是@HansPassant的副本,因此无法从应用程序中检测到这一点?我试图设置清单来测试这一点,但在核心库中出现空错误。@HansPassant我从清单上的链接复制了清单,并得到错误“值不能为空。\r\n参数名称:activationContext”这是一个winforms应用程序,因此在获取应用程序时遇到问题。很抱歉,我以为是wpf:(使用Winforms版本(未测试)更新了我的答案。但这是相同的想法,您需要找到Dpi设置并将大小乘以该值。我已经很久没有使用Winforms了,很抱歉,我帮不上忙:(感谢您的努力,请不要删除此链接,因为我们在评论中讨论的有价值的信息可能会帮助其他人。第一个链接是最佳解决方案,它用两行代码解决了我的问题。
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);
}