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