【问题标题】:Very Odd Behavior Accessing Screen Dimensions in C# .NET [closed]在 C# .NET 中访问屏幕尺寸的非常奇怪的行为 [关闭]
【发布时间】:2018-04-14 08:48:06
【问题描述】:

我在尝试访问 C# .NET 控制台应用程序中的系统屏幕尺寸时遇到了一些非常奇怪的行为。奇怪的是,我可以访问“System.Windows.SystemParameters.PrimaryScreenHeight”并获得恰好是实际屏幕高度一半的双精度值,而我可以访问“System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height”并获得恰好是实际屏幕一半的双精度值高度。单独调用,两个返回都是错误的......但是,如果我只是调用 SystemParameters 屏幕高度并将其保存到我再也不会触摸的虚拟双变量中,Forms.Screen 调用的返回突然开始工作 正确并返回准确的屏幕高度。

double dummyH = System.Windows.SystemParameters.PrimaryScreenHeight;
double dummyW = System.Windows.SystemParameters.PrimaryScreenWidth;
double height = Screen.PrimaryScreen.Bounds.Height;
double width = Screen.PrimaryScreen.Bounds.Width;

Console.WriteLine("System Param Height: " + dummyH);
Console.WriteLine("System Param Width: " + dummyW);
Console.WriteLine("System Screen Height: " + height);
Console.WriteLine("System Screen Width: " + width);

这是我发布的一个 3 分钟 YouTube 视频:http://www.youtube.com/watch?v=y_HnF8f0GFQ&hd=1

谢谢!

【问题讨论】:

  • 您的设置中有 200% 作为缩放比例,我希望其中一个返回像素值,另一个返回未缩放像素的值
  • 但单独访问,两者都返回相同(不正确)的值。只有一起访问时,其中一个值才会更改并变为正确!

标签: c# wpf winforms


【解决方案1】:

您没有考虑显示器 DPI 缩放。你需要乘以它。

这是我的做法https://github.com/angelsix/fasetto-word/blob/develop/Source/Fasetto.Word/Window/WindowResizer.cs#L219,这是我这样做的长视频https://www.youtube.com/watch?v=TDOxHx-AMqQ

【讨论】:

  • 哇!非常感谢!任何线索为什么在访问另一个返回后会变得正确??
  • 无需深入挖掘,调用 WinForms 调用 UnsafeNativeMethods.GetSystemMetrics(SM.CXSCREEN) 然后使用 Dpi 转换它,强制未保存的本机获取屏幕 DPI。 referencesource.microsoft.com/#PresentationFramework/src/… 然后缓存转换后的大小。当从同一个应用程序域调用 WPF 调用时,我猜他们最终会共享不安全的内存,并且 WPF 错误地将缓存的缩放值预先应用到其结果中。不要在一个应用程序中混合使用 WinForms 和 WPF
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多