我将在 WPF 中使用以下代码检测分辨率:
double height = System.Windows.SystemParameters.PrimaryScreenHeight;
double width = System.Windows.SystemParameters.PrimaryScreenWidth;
我的屏幕当前分辨率是 1920*1200,但是height
是 960.0 和width
1536.0 !!!
它出什么问题了 ?
提前致谢。
我将在 WPF 中使用以下代码检测分辨率:
double height = System.Windows.SystemParameters.PrimaryScreenHeight;
double width = System.Windows.SystemParameters.PrimaryScreenWidth;
我的屏幕当前分辨率是 1920*1200,但是height
是 960.0 和width
1536.0 !!!
它出什么问题了 ?
提前致谢。
请记住,所有 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",而不是像素。
对于更强大的实施,您应该计算系统上的 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 的值应该与您在显示器的“属性”窗口中看到的值相匹配。
请在您的 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);
}
}
尝试SystemParameters.FullPrimaryScreenWidth和 FullPrimaryScreenHeight,我相信 PrimaryScreenWidth 和 Height 在删除屏幕上的任务栏和其他桌带后返回可用客户端窗口的大小。
如果勾选“使用 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
你可以使用它:
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;
试试这些……我相信这可以纠正错误……
System.Windows.Form1.Screen.PrimaryScreen.Bounds.Height;System.Windows.Form1.Screen.PrimaryScreen.Bounds.Widtht;