首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
C#怎么获取当前屏幕的所有分辨率选项_C#如何列出显示模式【技巧】

C#怎么获取当前屏幕的所有分辨率选项_C#如何列出显示模式【技巧】

热心网友
99
转载
2026-05-06

C#怎么获取当前屏幕的所有分辨率选项_C#如何列出显示模式【技巧】

C#怎么获取当前屏幕的所有分辨率选项_C#如何列出显示模式【技巧】

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

在开发需要适配多显示器或提供显示设置功能的C#应用程序时,获取屏幕支持的所有分辨率选项是一个常见且关键的需求。许多开发者容易混淆两个核心概念:“当前屏幕的实际分辨率”“显卡驱动支持的所有显示模式”。本文将详细讲解这两种信息的区别,并提供在C#中分别获取它们的正确方法与实用技巧。

核心区别:Screen.AllScreens 仅返回当前已激活的物理显示器及其实际分辨率,无法提供驱动支持的所有可选模式;要枚举显卡驱动中完整的可选分辨率列表,必须通过P/Invoke调用 EnumDisplaySettings 函数,并正确使用 Screen.DeviceName 获取设备名称。

使用 Screen.AllScreens 获取当前所有显示器及其实际分辨率

如果你的目标是获取系统中已连接并正在使用的物理屏幕的当前状态信息,那么 System.Windows.Forms.Screen 类提供的 AllScreens 属性是最直接、最稳定的选择。它不依赖于显卡驱动提供的“可选分辨率列表”,仅反映Windows桌面当前实际生效的显示设置,因此在跨不同Windows版本时具有极佳的兼容性。

需要明确的是,Screen.AllScreens 返回的是“当前设置”,而非“所有支持的模式”。它告诉你的是桌面正运行在1920×1080@60Hz,而不是显卡控制面板里那个包含数十种分辨率的下拉菜单。

  • 核心对象与属性Screen.AllScreens 返回一个 Screen[] 数组。每个 Screen 对象都包含以下关键字段:Bounds(屏幕边界,包含 WidthHeight)、WorkingArea(工作区,排除了任务栏等系统界面)、Primary(指示是否为主显示器)。
  • 多显示器坐标系统:在多显示器配置下,Bounds 属性表示该屏幕在虚拟桌面坐标系中的矩形位置。例如,若主屏在右侧,副屏在左侧,则副屏的 Bounds.X 值可能为负数。
  • DPI与缩放陷阱:在未启用DPI感知的应用程序中,如果系统设置了高缩放比例(如150%),Bounds.Size 返回的可能是经过缩放的“逻辑像素”值,而非屏幕的“物理分辨率”。要获取真实的物理分辨率,通常需要配合 Graphics.DpiX/Graphics.DpiY 计算,或直接调用Win32 API查询真实DPI。

使用 EnumDisplaySettings 枚举某显示器全部支持的显示模式

要获取显卡驱动设置界面中那个完整的、可供选择的分辨率、刷新率及色深列表,必须调用底层的Windows API。在C#中,这需要通过平台调用(P/Invoke)来访问 user32.dll 中的 EnumDisplaySettings 函数。

此过程中最常见的错误是传入了错误的设备名称参数(lpszDeviceName)。切勿硬编码如 "\\.\DISPLAY1" 这样的字符串。最可靠的做法是从 Screen.AllScreens[i].DeviceName 属性获取系统提供的真实设备名(例如 "\\.\DISPLAY1""\\.\DISPLAY2")。

  • 枚举方法与流程:调用 EnumDisplaySettings 时需要循环递增 iModeNum 参数(从0开始),直到函数返回 false,表示所有可用的显示模式已枚举完毕。
  • 关键数据结构:函数会填充一个 DEVMODE 结构体,其中包含核心的显示模式信息:dmPelsWidthdmPelsHeight(分辨率)、dmDisplayFrequency(刷新率,单位Hz)、dmBitsPerPel(每像素位数,即色深)。
  • 模式筛选与判断:返回的列表中,部分模式可能被 dmDisplayFlags 字段中的标志(如 DM_GRAYSCALE 灰度模式或 DM_INTERLACED 隔行扫描模式)标记。这些模式可能已被弃用或当前硬件环境不支持,在实际应用中可能需要过滤。

为什么 GraphicsAdapter 不适合用于获取显示模式

部分开发者,尤其是在使用Unity、SharpDX或MonoGame等图形框架时,可能会尝试通过 GraphicsAdapter.AdapterInformation 或类似属性来查询显示模式。需要注意的是,这些类型属于DirectX/DXGI等图形API的抽象层,它们主要反映GPU的“渲染能力”和“支持的输出格式”,而非Windows显示子系统管理并暴露给桌面环境的“可用显示模式”。

简而言之,通过图形API查询无法准确获知当前连接的显示器在Windows设置中能切换到哪些分辨率-刷新率组合,也无法反映显示器EDID(扩展显示标识数据)中定义的物理限制。

一个典型的混淆场景是:在使用Surface Book或通过USB-C扩展坞连接显示器时,GraphicsAdapter.SupportedDisplayModes 可能返回空列表或仅包含默认模式。这是因为底层显示模式的管理由Windows显示驱动模型(WDDM)负责,并未完全通过DXGI的适配器枚举接口暴露。

  • 替代查询途径:如果确实需要从系统管理层面查询显示信息,可以尝试使用WMI(Windows Management Instrumentation)查询 Win32_VideoControllerWin32_DesktopMonitor 类的属性,但这通常只能获取当前状态,难以得到完整的可选模式列表。
  • 框架演进与兼容性:值得注意的是,在.NET 6及更高版本中,System.Drawing.Common 库在跨平台场景下对 GraphicsAdapter 的支持已被移除或限制,这进一步印证了它并非获取Windows桌面显示模式的标准或推荐途径。

实际代码示例:枚举主显示器所有支持的分辨率模式

理论结合实践,以下提供一个简洁、可运行的C#代码片段,演示如何枚举主显示器的所有显示模式。此示例仅需引用 System.Runtime.InteropServicesSystem.Windows.Forms 命名空间。

[StructLayout(LayoutKind.Sequential)]
public struct DEVMODE
{
    private const int CCHDEVICENAME = 32;
    private const int CCHFORMNAME = 32;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME)]
public string dmDeviceName;
public short dmSpecVersion;
public short dmDriverVersion;
public short dmSize;
public short dmDriverExtra;
public int dmFields;
public short dmOrientation;
public short dmPaperSize;
public short dmPaperLength;
public short dmPaperWidth;
public short dmScale;
public short dmCopies;
public short dmDefaultSource;
public short dmPrintQuality;
public short dmColor;
public short dmDuplex;
public short dmYResolution;
public short dmTTOption;
public short dmCollate;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHFORMNAME)]
public string dmFormName;
public short dmLogPixels;
public int dmBitsPerPel;
public int dmPelsWidth;
public int dmPelsHeight;
public int dmDisplayFlags;
public int dmDisplayFrequency;

}

[DllImport("user32.dll")] static extern bool EnumDisplaySettings(string lpszDeviceName, int iModeNum, ref DEVMODE lpDevMode);

// 使用方法: var primaryScreen = Screen.PrimaryScreen; var devMode = new DEVMODE { dmSize = (short)Marshal.SizeOf(typeof(DEVMODE)) }; int modeIndex = 0; Console.WriteLine($"枚举显示器 [{primaryScreen.DeviceName}] 支持的模式:"); while (EnumDisplaySettings(primaryScreen.DeviceName, modeIndex++, ref devMode)) { Console.WriteLine($" 分辨率: {devMode.dmPelsWidth} x {devMode.dmPelsHeight}, 刷新率: {devMode.dmDisplayFrequency} Hz, 色深: {devMode.dmBitsPerPel} 位"); }

代码中有几个关键细节:首先,DEVMODE 结构体的 dmSize 字段必须在传递给API前显式赋值为结构体的大小,否则调用会失败。其次,modeIndex 从0开始递增枚举;传入-1可以获取当前活动的模式,但枚举所有模式时通常不需要。

然而,真正的挑战往往不在于成功调用API获取列表,而在于如何判断列表中的哪些模式对当前连接的显示器硬件是实际可用且稳定的。例如,显卡驱动可能报告支持4K@120Hz模式,但当前的HDMI线缆版本、显示器接口或驱动设置可能使其无法正常启用。处理这种复杂性可能需要结合更多API,如使用 MonitorInfoEx 获取显示器能力、解析EDID数据,或者更激进地尝试调用 ChangeDisplaySettingsEx 临时切换模式,并根据返回值判断是否成功。

来源:https://www.php.cn/faq/2322808.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

C#怎么使用ReadOnlySpan_C#只读内存切片性能优化教程【高级】
编程语言
C#怎么使用ReadOnlySpan_C#只读内存切片性能优化教程【高级】

C ReadOnlySpan 使用指南:高性能只读内存切片优化技巧【高级教程】 在 NET 高性能编程实践中,尤其是在字符串处理场景,一个公认的高效策略是:直接采用 ReadOnlySpan 来替代传统的 string 参数以及中间的 Substring 调用。这是目前实现零分配、低开销处理的最

热心网友
05.06
c#如何实现分页查询_c#分页查询最全用法总结
编程语言
c#如何实现分页查询_c#分页查询最全用法总结

SQL Server分页首选OFFSET-FETCH,需配合ORDER BY且参数化传值;EF Core用Skip Take自动翻译,避免内存分页;大数据量时应改用游标分页。 SQL Server 中用 OFFSET-FETCH 做分页最直接 说到在SQL Server里做分页,2012及以上版本提

热心网友
05.06
c#如何批量插入数据_c#批量插入数据完整教程与实战案例
编程语言
c#如何批量插入数据_c#批量插入数据完整教程与实战案例

C 万级数据批量插入:SqlBulkCopy 实战精要 在C 中进行大规模数据插入,性能是首要考量。当数据量达到万级甚至更高时,常规的逐条插入方法会迅速成为性能瓶颈。那么,有没有一种既高效又稳定的解决方案呢?答案是肯定的。 用 SqlBulkCopy 实现高速批量插入 开门见山地说,在C 生态中,

热心网友
05.06
c#如何使用TestContainers集成测试_c#TestContainers集成测试的最佳实践与常见坑点
编程语言
c#如何使用TestContainers集成测试_c#TestContainers集成测试的最佳实践与常见坑点

C 中使用TestContainers进行集成测试:最佳实践与常见坑点 想在 NET 里玩转 TestContainers?这事儿说简单也简单,说麻烦也麻烦。简单在于,它确实能让你用几行代码就拉起一个数据库或中间件进行测试;麻烦在于,从环境配置到代码编写,每一步都有几个“经典”的坑在等着你。今天,

热心网友
05.06
C#怎么操作WPF Canvas画布绘图 C#如何在WPF Canvas上用代码动态绘制图形和连线【控件】
编程语言
C#怎么操作WPF Canvas画布绘图 C#如何在WPF Canvas上用代码动态绘制图形和连线【控件】

C WPF Canvas画布绘图完全指南:代码动态绘制图形与连线详解 Canvas直接添加子元素导致错位或不显示的解决方案 许多C 开发者在初次使用WPF Canvas控件进行动态绘图时,常会遇到一个典型问题:为何通过代码添加的Rectangle矩形或Line线条无法正常显示,或者出现位置偏移?

热心网友
05.06

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

史上最长寿标准版!iP17生产周期延长:苹果刀法变了
科技数码
史上最长寿标准版!iP17生产周期延长:苹果刀法变了

iPhone 17:为何成为苹果史上最长寿的爆款? 最近科技圈有个消息传得挺热:iPhone 17标准版的生产周期被大幅拉长了。这可不是简单的产能调整,背后是苹果近期完成的大规模产能扩展。看来,这款热门机型已经瞄准了今年下半年的双11战场,准备再掀一波销售热潮。 消息一出,不少网友都在猜测原因。矛头

热心网友
05.06
小米有品新款mini智能电动平衡车深度体验:便携智能,解锁城市出行新方式
科技数码
小米有品新款mini智能电动平衡车深度体验:便携智能,解锁城市出行新方式

在快节奏的都市生活中,一款兼具便携性与环保特性的出行工具正成为越来越多人的选择 城市通勤的“最后一公里”难题,催生了对灵活出行方案的持续探索。近期,小米有品推出的mini智能电动平衡车,以其独特的设计理念和深度智能化功能,迅速吸引了市场的目光。它不仅仅是一款酷玩装备,更切实地为青少年和上班族提供了高

热心网友
05.06
护眼与智能兼备:科大讯飞AI学习机深度评测,为孩子选对学习好帮手
科技数码
护眼与智能兼备:科大讯飞AI学习机深度评测,为孩子选对学习好帮手

在数字化教育蓬勃发展的当下,家长们为孩子挑选学习设备时,既希望设备具备护眼功能,又期望能满足多样化的学习需求。传统平板电脑功能虽丰富,但长时间使用易引发视力疲劳;普通学习机功能又相对单一,难以契合现代教育的发展趋势。在此背景下,科大讯飞AI学习机系列凭借先进的护眼技术与智能学习系统,成为众多家长和学

热心网友
05.06
以太坊(ETH)财库黑马ETHZilla解析:蒂尔和EF深度加持 mNAV高达6
web3.0
以太坊(ETH)财库黑马ETHZilla解析:蒂尔和EF深度加持 mNAV高达6

目录 ethzilla是谁? ETHZilla独特其他ETH DAT之处 1、Peter Thiel持股ETHZilla近30% 2、Vitalik和以太坊基金会入局 3、聚焦DeFi和链上策略 结语 以太坊财库概念的热度,最近真是肉眼可见。伴随着这股热潮,ETH价格也强势突破了4700美元,距离历

热心网友
05.06
国内彩电一年仅卖2763万台 创10年新低
科技数码
国内彩电一年仅卖2763万台 创10年新低

全球彩电市场:存量博弈下的冰与火之歌 最近,行业调研机构奥维睿沃(A VC Revo)发布了一份引人关注的报告,揭示了2025年全球彩电市场的真实图景。数据显示,全球彩电整体出货量达到2 64亿台,同比仅微跌0 1%,市场基本盘看似稳固。 然而,拆开来看,内部结构正在发生深刻变化。LCD液晶电视依然

热心网友
05.06