如何通过VB6.0从EDID文件中获取附加监视器的本机分辨率?

如何通过VB6.0从EDID文件中获取附加监视器的本机分辨率?,vb6,Vb6,我正在开发一个VB应用程序,其中我需要知道监视器的本机分辨率,而不是用户当前分辨率设置的分辨率。因此,我需要直接从监视器读取EDID扩展显示标识数据 我确实试图通过一些程序找到监视器的分辨率…但它返回的只是当前分辨率。任何直接从监视器的EDID读取信息的帮助都是可取的 提前感谢您提供了一些源代码,尽管C/C++要读取EDID块,请参见中的第5点。唯一的官方手段,检索此信息通过 有关EDID格式的说明,请参见示例。经过大量研究,我能够解决我的问题。。 谢谢你的宝贵信息Yahia 首先,我们需要找到

我正在开发一个VB应用程序,其中我需要知道监视器的本机分辨率,而不是用户当前分辨率设置的分辨率。因此,我需要直接从监视器读取EDID扩展显示标识数据

我确实试图通过一些程序找到监视器的分辨率…但它返回的只是当前分辨率。任何直接从监视器的EDID读取信息的帮助都是可取的


提前感谢您提供了一些源代码,尽管C/C++要读取EDID块,请参见中的第5点。唯一的官方手段,检索此信息通过


有关EDID格式的说明,请参见示例。

经过大量研究,我能够解决我的问题。。 谢谢你的宝贵信息Yahia

首先,我们需要找到EDID数据。实际上,操作系统可以通过扩展显示标识数据EDID获得物理显示信息。EDID块的副本保存在windows注册表中。但问题是要获得正确的EDID,因为注册表中存储了有关在任何时候连接到系统的所有监控器的信息。因此,首先我们使用WMI类“Win32_DesktopMonitor”,并通过一个简单的SQL查询获取PNP设备id以查找一个非脱机可用的监视器。然后,我们可以深入注册表查找数据

`'对于wmiquery中的监视器'从Win32_DesktopMonitor中选择*:

regkey='HKLM\SYSTEM\CurrentControlSet\Enum'+ monitor.PNPDeviceID+'\Device Parameters\EDID' edid=get_regvalregkey'`

第二,必须解析数据。显示器的基本EDID信息在包含相关制造商和操作相关数据的128字节数据结构中传输。这些信息中的大部分对我们来说是无趣的

要了解本机分辨率,我们需要开始查看DTD详细计时描述符,该描述符从字节=54开始

以下是从EDID中查找最大分辨率的逻辑

`dtd=详细定时描述的54个开始字节


horizontalRes=edid[dtd+4]>>4>4“除了实际设置分辨率之外,这里有一个完整的解决方案。这将从活动监视器的EDID中读取本机分辨率设置

设置WshShell=WScript.CreateObjectWScript.Shell

Const HKEY_本地_机器=&H8000002 常数DTD_指数=54

strComputer=

设置objWMIService=GetObjectwinmgmts:\&strComputer&\root\cimv2 设置oReg=GetObjectwinmgmts:{impersonationLevel=impersonate}!\&strComputer&\root\default:StdRegProv

Set colItems=objWMIService.ExecQuerySelect*自Win32_DesktopMonitor,,48 对于colItems中的每个objItem,获取活动监视器EDID注册表路径 strKeyPath=SYSTEM\CurrentControlSet\Enum\&objItem.PNPDeviceID&\Device参数 下一个

oReg.GetBinaryValue HKEY_LOCAL_机器,strKeyPath,EDID,arrRawEDID

hor_分辨率=arrRawEDIDDTD_索引+2+arrRawEDIDDTD_索引+4和240*16 垂直分辨率=arrRawEDIDDTD_索引+5+arrRawEDIDDTD_索引+7和240*16


WshShell.Run res.exe&hor_resolution&&vert_resolution

嘿,在寻找了几个星期甚至几个月的答案后,这对我很有帮助。我还想知道如何从EDID获得准确的刷新率,而维基百科页面并没有很好地解释这一点。你有没有可能做到这一点?@NmdMystery:我很高兴这有帮助。不,我没有查看EDID的刷新率。