【问题标题】:Get native resolution of screen获取屏幕的原始分辨率
【发布时间】:2013-08-12 13:54:41
【问题描述】:

有没有办法在 c# 中获得屏幕的原生分辨率?

我问的原因是我有一些曲线,无论分辨率如何,它们看起来都一样非常重要。当屏幕不是原始分辨率时,它们看起来与以前有些不同,我想显示一个警告,说明这种情况。

【问题讨论】:

  • 绘制曲线时需要考虑纵横比。
  • C# 不相关,您使用的是 .NET 和 WinForms 或 WPF。
  • 好吧,抱歉,我正在使用 .NET 和 WPF。
  • 我猜您实际上是在谈论 LCD 面板的固有分辨率。唯一真正明智的假设是用户选择了与 LCD 面板分辨率相匹配的视频适配器分辨率。如果他不这样做,那么它总是看起来很难看,明确编写代码来处理错误并没有那么有用。如果您真的想解决这个问题,那么您需要使用 WMI 做一些事情。
  • 您希望没有经验的用户对这样的消息有何反应?他绝对不知道你在说什么。

标签: c# .net wpf screen-resolution


【解决方案1】:

根据我的经验,最好的解决方案是从监视器的EDID 中提取该信息

如何获取原生分辨率答案在:How to fetch the NATIVE resolution of attached monitor from EDID file through VB6.0?

我制作了一个小 javascript,从 54 开始的 8 个字节中获取分辨率。

var dtd = 0;
var edid =  new Uint8Array(8);
var i = 0;

edid[i++] = 0x0E;
edid[i++] = 0x1F;
edid[i++] = 0x00;
edid[i++] = 0x80;
edid[i++] = 0x51;
edid[i++] = 0x00;
edid[i++] = 0x1B;
edid[i++] = 0x30;

var horizontalRes = ((edid[dtd+4] >> 4) << 8) | edid[dtd+2] ;
var verticalRes = ((edid[dtd+7] >> 4) << 8) | edid[dtd+5];
console.log(horizontalRes+", "+verticalRes);

这是一个 C# 版本:

    static Point ExtractResolution(byte [] edid)
    {
        const int dtd = 54;
        var horizontalRes = ((edid[dtd + 4] >> 4) << 8) | edid[dtd + 2];
        var verticalRes = ((edid[dtd + 7] >> 4) << 8) | edid[dtd + 5];
        return new Point(horizontalRes, verticalRes);
    }

【讨论】:

    【解决方案2】:

    通常,最大分辨率是 LCD 显示器的原始分辨率。然而,情况并非总是如此。如果我们可以利用那里,获得最大分辨率就足够了。

    可以使用以下方法获得最大分辨率:

        [DllImport("user32.dll")]
        private static extern int EnumDisplaySettings(string deviceName, int modeNum, ref DeviceMode devMode);
    
        /// <summary>
        /// Gets the max resolution + refresh rate supported by specific display
        /// </summary>
        /// <param name="deviceName">Device name(System.Windows.Forms.Screen.DeviceName)</param>
        /// <param name="dispWidth">Width of the display</param>
        /// <param name="dispHeight">Height of the display</param>
        /// <param name="refreshRate">Refresh rate of the display</param>
        /// <returns></returns>
        public static void GetMaxResolutionWithRefreshRate(string deviceName, out int dispWidth, out int dispHeight, out int refreshRate)
        {
            dispWidth = dispHeight = refreshRate = 0;
            DeviceMode deviceMode = new DeviceMode();
            for (int i = 0; Win32.EnumDisplaySettings(deviceName, i, ref deviceMode) != 0; i++)
            {
                if (deviceMode.dmPelsWidth > dispWidth || (deviceMode.dmPelsWidth == dispWidth && deviceMode.dmPelsHeight >= dispHeight && deviceMode.dmDisplayFrequency >= refreshRate))
                {
                    dispWidth = deviceMode.dmPelsWidth;
                    dispHeight = deviceMode.dmPelsHeight;
                    refreshRate = deviceMode.dmDisplayFrequency;
                }
            }
        }
    
    public static void GetMaxResolutionWithRefreshRate(out int dispWidth, out int dispHeight, out int refreshRate)
        {
            GetMaxResolutionWithRefreshRate(null, out dispWidth, out dispHeight, out refreshRate);
        }
    

    【讨论】:

      【解决方案3】:

      在 WinForms 中,您可以使用其中一种

      var someScreen = Screen.AllScreens[i];
      var mainScreen = Screen.PrimaryScreen;
      

      屏幕有一个边界(总)和一个工作区(净)矩形。

      再想一想,这只会告诉您当前的分辨率。不过,这应该足够了,正如已经评论的那样,您真的很想知道纵横比。

      【讨论】:

      • 这不只是当前的分辨率吗?我想知道该屏幕的推荐分辨率(LCD 屏幕的实际像素数)(如果存在)。
      • @Mathias - 见link。 “有些显示器有原生分辨率,有些则没有。如果是 LCD 显示器,原生分辨率是它支持的最高分辨率。如果是 CRT 显示器,它没有原生分辨率。”
      • 是的,您只能获得“当前”分辨率。您确定检测不同的设置是您的责任吗?听起来像功能蠕变。
      【解决方案4】:

      试试这样的:-

      GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width
      GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height
      

      要获取屏幕的当前分辨率,您可以使用:-

      Rectangle resolution = Screen.PrimaryScreen.Bounds;
      

      现在更改分辨率。

      看看这个link

      Screen screen = Screen.PrimaryScreen;
      int S_width=screen.Bounds.Width;
      int S_height=screen.Bounds.Height;
      

      【讨论】:

      • 我的 Apple Macbook Retina 的原始分辨率为 2880x1800。我在分辨率设置中选择了它。但是,由于 Windows 对其进行了缩放,因为它具有高 DPI Screen class 告诉我分辨率为 1440x900。问题是 DWM 还说 DPI 是 96,这在大多数情况下都很好,但是如果您需要知道原始分辨率 Screen 无法帮助您。
      猜你喜欢
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 2010-12-03
      • 1970-01-01
      相关资源
      最近更新 更多