我们知道在WinForm里面,我们可以通过类System.Windows.Forms.Screen.PrimaryScreen.Bounds
来获取主屏幕的分辨率。但是在WPF里面,根本没有这个类!
那么在WPF里面怎么获取屏幕分辨率呢?
其实很简单,.net里面提供了获取屏幕各种参数的静态辅助类:SystemParameters
。
获取主屏幕高度:SystemParameters.PrimaryScreenHeight
获取主屏幕宽度:SystemParameters.PrimaryScreenWidth
但是实际在获取的时候会发现,获取的值和实际分辨率不一致。
以 1920 * 1080 和 125% DPI为例:
分辨率高度:1080,实际获取的高度为:864。 分辨率宽度:1920,实际获取的宽度为:1536。
其实我们可以发现,SystemParameters
提供的接口,其实是获取渲染过程中的实际高宽,是受系统DPI设置的影响。所以我们在获取分辨率的时候,只需要根据DPI做下处理即可。
以下是完整的实现代码:
public class ScreenManager
{
/// <summary>
/// 获取DPI百分比
/// </summary>
/// <param name="window"></param>
/// <returns></returns>
public static double GetDpiRatio(Window window)
{
var currentGraphics = Graphics.FromHwnd(new WindowInteropHelper(window).Handle);
return currentGraphics.DpiX / 96;
}
public static double GetDpiRatio()
{
return GetDpiRatio(Application.Current.MainWindow);
}
public static double GetScreenHeight()
{
return SystemParameters.PrimaryScreenHeight * GetDpiRatio();
}
public static double GetScreenActualHeight()
{
return SystemParameters.PrimaryScreenHeight;
}
public static double GetScreenWidth()
{
return SystemParameters.PrimaryScreenWidth * GetDpiRatio();
}
public static double GetScreenActualWidth()
{
return SystemParameters.PrimaryScreenWidth;
}
}
如果要获取屏幕分辨率,直接调用 ScreenManager.GetScreenWidth
和ScreenManager.GetScreenHeight
方法,反之调用ScreenManager.GetScreenActualWidth
和ScreenManager.GetScreenActualHeight
方法。
本文会经常更新,请阅读原文: https://huchengv5.gitee.io//post/WPF-%E5%A6%82%E4%BD%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E5%B1%8F%E5%B9%95%E5%88%86%E8%BE%A8%E7%8E%87.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名胡承(包含链接: https://huchengv5.gitee.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。