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());

显示尺寸已通过(右键单击桌面)Personalize > Desktop选项更改为 150%(因为屏幕为 60 英寸并且您坐得有点远)。

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

注意:我已经发现如何通过右键单击可执行文件来解决此问题并调整兼容性以禁用 DPI 虚拟化,但我仍然需要一个编程解决方案,因此我不必让用户自己调整:参见 - http: //msdn.microsoft.com/en-us/library/dd464660(VS.85).aspx#dpi_virtualization

4

2 回答 2

6

可能是您Dpi在 Windows 中的设置高于 100%

尝试使用此方法,这会将分辨率缩放到当前系统 Dpi 设置

窗体:

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 在运行此代码之前已加载

于 2013-03-07T21:53:30.920 回答
4

我不觉得这是一个重复的问题,但答案与另一个线程相同:https : //stackoverflow.com/a/13228495/353147 因为问题不是字体模糊,而是为什么 Screen.PrimaryScreen。 Bounds.Size 返回错误信息。它可以帮助其他人。

我确实遇到了一条错误消息,即 mscorlib 抛出了一个空错误。从这个线程http://forums.asp.net/t/1653876.aspx/1我能够发现取消选中“启用 ClickOnce 安全设置”修复了它。这似乎是一个 hack,但它确实有效。

于 2013-03-08T00:41:54.473 回答