26

我将在 WPF 中使用以下代码检测分辨率:

double height = System.Windows.SystemParameters.PrimaryScreenHeight;
double width = System.Windows.SystemParameters.PrimaryScreenWidth;

我的屏幕当前分辨率是 1920*1200,但是height是 960.0 和width1536.0 !!!

它出什么问题了 ?
提前致谢。

4

8 回答 8

37

请记住,所有 WPF 位置和大小都是浮点数,单位为 1/96 英寸。不是像素。这使您的窗口设计分辨率独立。算一下:高度 = 960 / 96 = 10 英寸。将视频适配器设置为 120 DPI (120/96 = 125%):10 * 120 = 1200 像素。宽度相同:1536 / 96 * 120 = 1920 像素。

System.Windows.Forms 以像素为单位工作。你得到的高度小于 1050,因为它减去了任务栏的高度。但是对于 WPF,您总是希望使用 1/96",而不是像素。

于 2010-02-10T13:02:04.000 回答
26

对于更强大的实施,您应该计算系统上的 DPI 因子并使用这些因子。正常的 DPI 值为 96,但某些显示器可能具有不同的值。考虑您的代码可能在 DPI 值不同于 96 的监视器上运行。考虑以下代码:

    private static void CalculateDpiFactors()
    {
        Window MainWindow = Application.Current.MainWindow;
        PresentationSource MainWindowPresentationSource = PresentationSource.FromVisual(MainWindow);
        Matrix m = MainWindowPresentationSource.CompositionTarget.TransformToDevice;
        thisDpiWidthFactor = m.M11;
        thisDpiHeightFactor = m.M22;
    }

然后,您可以使用这些比率来获得最终值:

CalculateDpiFactors();
double ScreenHeight = SystemParameters.PrimaryScreenHeight * thisDpiHeightFactor;
double ScreenWidth = SystemParameters.PrimaryScreenWidth * thisDpiWidthFactor;

然后,ScreenHeight 和 ScreenWidth 的值应该与您在显示器的“属性”窗口中看到的值相匹配。

于 2010-06-15T03:25:39.280 回答
2

请在您的 Windows 加载后调用它。

 public static class Ext
{
    public static Size GetNativePrimaryScreenSize(this Window window)
    {
        PresentationSource mainWindowPresentationSource = PresentationSource.FromVisual(window);
        Matrix m = mainWindowPresentationSource.CompositionTarget.TransformToDevice;
        var dpiWidthFactor = m.M11;
        var dpiHeightFactor = m.M22;
        double screenHeight = SystemParameters.PrimaryScreenHeight * dpiHeightFactor;
        double screenWidth = SystemParameters.PrimaryScreenWidth * dpiWidthFactor;

        return new Size(screenWidth, screenHeight);
    }
}
于 2016-02-16T13:48:18.630 回答
1

尝试SystemParameters.FullPrimaryScreenWidth和 FullPrimaryScreenHeight,我相信 PrimaryScreenWidth 和 Height 在删除屏幕上的任务栏和其他桌带后返回可用客户端窗口的大小。

于 2010-02-10T12:30:09.310 回答
0

你可以改用这个:http: //msdn.microsoft.com/en-us/library/system.windows.forms.screen.primaryscreen.aspx

于 2010-02-10T11:02:02.657 回答
0

如果勾选“使用 Windows XP 风格的 DPI 缩放”,则“Screen.PrimaryScreen.Bounds”的返回值是正确的。如果不是,则返回值按 DPI 值(这是默认值)按比例缩小。

要找到“使用 Windows XP 风格的 DPI 缩放”复选框,请展开以下链接中的“使非高 DPI 设计的程序中的文本和屏幕项目更清晰”链接:http: //windows.microsoft。 com/en-us/windows-vista/Make-the-text-on-your-screen-large-or-smaller

于 2012-05-03T15:28:10.923 回答
0

你可以使用它:

float dpiX, dpiY;
using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero))
{
     dpiX = graphics.DpiX;
     dpiY = graphics.DpiY;
}

double screenX = SystemParameters.PrimaryScreenWidth / 96 * dpiX;
double screenY = SystemParameters.PrimaryScreenHeight / 96 * dpiY;
于 2019-07-24T19:50:12.703 回答
-1

试试这些……我相信这可以纠正错误……

System.Windows.Form1.Screen.PrimaryScreen.Bounds.Height;System.Windows.Form1.Screen.PrimaryScreen.Bounds.Widtht;

于 2010-03-15T10:53:27.067 回答