【发布时间】:2015-03-15 05:49:01
【问题描述】:
我发现通过控制面板设置的分辨率与我的宽屏笔记本电脑的 Screen.Bounds 输出之间存在有趣的差异。屏幕为 15.5",通过控制面板设置的分辨率为 1920x1080。但是当我运行一些这样的代码时。
Screen[] screens = Screen.AllScreens;
foreach (Screen scr in screens)
{
Console.WriteLine("Width: " + scr.Bounds.Width + ", Height: " + scr.Bounds.Width);
}
输出显示我的分辨率为 1536x864。我环顾四周,我认为这可能与 DPI 问题有关,当我查看我的显示设置时,滑块(我在 Windows 8.1 上)位于中间,并且复选框显示“让我为我的所有显示器选择一个缩放级别”未选中。我运行这个小代码来获取当前的 DPI 设置。
float dpiX, dpiY;
Graphics graphics = new System.Windows.Forms.Form().CreateGraphics();
Console.WriteLine("DPI: " + graphics.DpiX);
返回的 DPI 是 96.0,据我了解,它是 100% DPI 设置(因此没有放大或任何名称)。对我来说奇怪的是,Screen 返回的边界正好是我实际分辨率的 80%,这让我认为我的 DPI 设置为 100(或 125%),但事实并非如此。我的笔记本电脑屏幕只有这个问题,因为我的辅助显示器的界限等于通过控制面板的分辨率。这是因为我的 DPI 设置未设置为使显示相互独立(选中该复选框)?对于一点背景知识,我正在编写一个工具,它获取当前屏幕并从 reddit 获取图片并将它们彼此独立地适合屏幕,所以无论我有什么解决方案,它都必须正确获得每个显示器的分辨率。
【问题讨论】:
-
我认为您的第一个代码示例中的
scr.Bounds..Primary应该是scr.Bounds.Height? -
如果“让我为所有显示器选择一个缩放级别”未选中,那么您肯定为每个屏幕设置了不同的 DPI 吗?
-
@StevenRands 修复了该示例,我认为是这种情况,但是如果未选中该框,则两个屏幕的 DPI 仍为 96.0。我在获取 DPI 的方式上做错了吗?
-
本身没有错,只是
Graphics实例的 DPI 可能默认为主屏幕的 DPI。你在 Windows 8.1 上吗?有一个 GetDpiForMonitor API 可能有用。 -
有趣,我可以从 .Net 中的 C# 调用它,还是必须在 C++ 中调用它?
标签: c# windows-8.1 resolution dpi