C# 获取屏幕的比例

C# 获取屏幕的比例,c#,screen-resolution,C#,Screen Resolution,我们可以得到分辨率和东西,我们的屏幕是屏幕类。所以,我们应该使用Screen.WorkingArea.Width和Screen.WorkingArea.Height,如果我们想在屏幕中央放置一些东西的话 但是,在Windows8.1中,如果屏幕上的项目看起来太小,则不确定其他操作系统是否存在缩放项目的可能性。您可以通过调用桌面上的上下文菜单,选择屏幕分辨率,然后选择使文本和其他项目变大或变小来进行检查 问题是,它似乎确实提高了屏幕分辨率!因此,Screen.WorkingArea.Width和S

我们可以得到分辨率和东西,我们的屏幕是屏幕类。所以,我们应该使用Screen.WorkingArea.Width和Screen.WorkingArea.Height,如果我们想在屏幕中央放置一些东西的话

但是,在Windows8.1中,如果屏幕上的项目看起来太小,则不确定其他操作系统是否存在缩放项目的可能性。您可以通过调用桌面上的上下文菜单,选择屏幕分辨率,然后选择使文本和其他项目变大或变小来进行检查

问题是,它似乎确实提高了屏幕分辨率!因此,Screen.WorkingArea.Width和Screen.WorkingArea.Height将为您提供缩放值,而point Screen.WorkingArea.Width/2 Screen.WorkingArea.Height/2将不再位于实际屏幕的中心,用于200%缩放。该点将位于屏幕的右下角。这可能会破坏很多UI项的放置


那么,有可能得到缩放的值吗?我找不到任何包含此信息的类。

大多数检索DPI的方法都依赖于现有控件,这有时可能不方便。但DPI始终可以从注册表中检索。在C中:

using Microsoft.Win32;
//...
var currentDPI = (int)Registry.GetValue("HKEY_CURRENT_USER\\Control Panel\\Desktop", "LogPixels", 96);
规模将是

var scale = 96/(float)currentDPI;

以下是在Windows 10上获取DPI信息的工作方法:

int DPI = Int32.Parse((string)Registry.GetValue(
   @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ThemeManager",
   "LastLoadedDPI", "96"));

这似乎是对的,但现在我需要弄清楚,如何在我的代码中使用它。我已经找到了使用API方法的方法,但我不知道这个属性的确切位置。它是什么类型的应用程序?这是怎么回事?看来,我总是可以从注册表中获取屏幕的DPI,路径是HKEY_CURRENT_USER\Control Panel\Desktop,键值是LogPixels。我的Windows 10计算机不存在此注册表设置。它确实存在于我的Windows 7计算机上。@RenniePet:您现在可能已经找到了它,但在这里它只是以防万一:int DPI=Int32.ParsestringRegistry.GetValue@HKEY\u CURRENT\u USER\Software\Microsoft\Windows\CurrentVersion\TheManager,LastLoadedDPI,96;当答案中包含解释时更有用,尤其是当用户使用不同的语言时。请编辑答案并为此代码提供一些上下文。
int DPI = Int32.Parse((string)Registry.GetValue(
   @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ThemeManager",
   "LastLoadedDPI", "96"));