我正在开发一个 VB 应用程序,我需要知道显示器的原始分辨率,而不是用户设置的分辨率(当前分辨率)。所以我需要直接从显示器读取 EDID(扩展显示识别数据)。
我确实尝试通过一些程序找到显示器的分辨率......但它返回的只是当前分辨率。任何直接从监视器的 EDID 读取信息的帮助都是可行的。
提前致谢
我正在开发一个 VB 应用程序,我需要知道显示器的原始分辨率,而不是用户设置的分辨率(当前分辨率)。所以我需要直接从显示器读取 EDID(扩展显示识别数据)。
我确实尝试通过一些程序找到显示器的分辨率......但它返回的只是当前分辨率。任何直接从监视器的 EDID 读取信息的帮助都是可行的。
提前致谢
经过大量研究,我能够解决我的问题.. 感谢 Yahia 提供的宝贵信息。
首先,我们需要找到 EDID 数据。物理显示信息实际上可通过扩展显示标识数据 (EDID) 提供给操作系统。EDID 块的副本保存在 Windows 注册表中。但问题是要获得正确的 EDID,因为注册表中存储了有关在任何时间点连接到系统的所有监视器的信息。因此,首先我们使用 WMI 类“Win32_DesktopMonitor”,并通过一个简单的 SQL 查询获取 PNP 设备 id 以找到可用(非离线)的监视器。然后我们可以深入注册表以查找数据。
`'for monitor in wmiquery('Select * from Win32_DesktopMonitor'):
regkey = ('HKLM\SYSTEM\CurrentControlSet\Enum\' + monitor.PNPDeviceID + '\Device Parameters\EDID') edid = get_regval(regkey)'`
其次,需要解析数据。显示器的基本 EDID 信息在包含相关制造商和操作相关数据的 128 字节数据结构中传送。这些信息中的大部分对我们来说都是无趣的。
要了解 NATIVE 分辨率,我们需要开始查看从 byte = 54 开始的 DTD(详细时序描述符)。
以下是从 EDID 中找到最大分辨率的逻辑
`dtd = 54 # 详细时序描述的起始字节。
水平分辨率 = ((edid[dtd+4] >> 4) << 8) | edid[dtd+2] 垂直分辨率 = ((edid[dtd+7] >> 4) << 8) | edid[dtd+5] res=(horizontalRes,verticalRes)`
获得的值是十六进制值,可以将其转换为十进制以找到以像素为单位的 NATIVE RESOLUTION。
谢谢希望它可以帮助萨钦
有关读取 EDID 块的一些源代码(尽管是 C/C++),请参见此链接的第 5 点。通过Windows Setup API检索此信息的唯一官方方法。
有关 EDID 格式说明,请参见此处的示例。
'这是一个完整的解决方案,除了实际设置分辨率。这将从活动监视器的 EDID 中读出原始分辨率设置。
设置 WshShell = WScript.CreateObject("WScript.Shell")
常量 HKEY_LOCAL_MACHINE = &H80000002 常量 DTD_INDEX = 54
strComputer =“。”
设置 objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2") 设置 oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\" & strComputer & "\root\default:StdRegProv")
Set colItems = objWMIService.ExecQuery("Select * from Win32_DesktopMonitor",,48) For Each objItem in colItems 'Gets active monitor EDID registry path strKeyPath = "SYSTEM\CurrentControlSet\Enum\" & objItem.PNPDeviceID & "\Device Parameters"
Next
oReg.GetBinaryValue HKEY_LOCAL_MACHINE,strKeyPath,"EDID",arrRawEDID
hor_resolution = arrRawEDID(DTD_INDEX + 2) + (arrRawEDID(DTD_INDEX + 4) 和 240) * 16 vert_resolution = arrRawEDID(DTD_INDEX + 5) + (arrRawEDID(DTD_INDEX + 7) 和 240) * 16
WshShell.Run "res.exe " & hor_resolution & " " & vert_resolution