我们知道在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.GetScreenWidthScreenManager.GetScreenHeight方法,反之调用ScreenManager.GetScreenActualWidthScreenManager.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/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系