我一直坚持以这种格式提取显示器制造商 ID 的硬件信息:xxxxx_xxxxxxx
基本上,提供 Linux 命令 hwinfo --monitor 作为“供应商”参数的格式似乎在标准 .NET/PowerShell 类或 Win API 中无法达到。
似乎大多数 .NET 工具仅提供有关监视器 ID 的有限数据。
我尝试了为监视器数据提供的大多数 .NET/Powershell 类/WinAPI:
始终仅输出有限的制造商/名称 ID:
制造商:BOE06CB
显示器名称:京东方
但是我需要完整版的制造商ID:
制造商:RMJCY_NV15N42
显示器名称:BOEhydis NV15N42(戴尔RMJCY)
*此问题不是由于权限不足或显示器驱动程序过时引起的。如果我在同一台机器上运行例如 AIDA64 软件,它会正确抛出上述格式的数据。
有人知道哪个.NET类/WinAPI可以提取完整格式的显示器制造商ID吗?
非常感谢!
此代码通过注册表项提取每个 EDID,并为找到的每个显示器返回一个 PSCustomObject:
foreach ($Display in Get-ChildItem 'HKLM:\SYSTEM\CurrentControlSet\Enum\DISPLAY') {
foreach ($Monitor in Get-ChildItem $Display.PSPath) {
foreach ($edid in Get-ItemProperty "$($Monitor.PSPath)\Device Parameters" -Name 'EDID') {
$bytes = $edid.EDID
if ($bytes) {
# DDDs: Display Descriptor Definitions
$dddDisplayProductName = ''
$dddAlphanumeric = ''
$dddSerialNumber = ''
# Loop through each DDD
for ($i = 54; $i -lt 109; $i += 18) {
# Get this DDD's type
$dddType = $bytes[$i + 3]
# Only interested in DDDs of type 252, 254, and 255
if ($dddType -in 252, 254, 255) {
# Get the old DDD value(s) if any
$oldDDD = if ($dddType -eq 252) { $dddDisplayProductName } elseif ($dddType -eq 254) { $dddAlphanumeric } else { $dddSerialNumber }
# Get this DDD value
$newDDD = [Text.AsciiEncoding]::new().GetString($bytes[($i + 5)..($i + 17)]).Trim()
# Create an array of this type of DDD if necessary
$DDD = if ('' -eq $oldDDD) { $newDDD } elseif ($oldDDD -is [array]) { $oldDDD + $newDDD } else { $oldDDD, $newDDD }
# Save the DDD back to appropriate location
if ($dddType -eq 252) { $dddDisplayProductName = $DDD } elseif ($dddType -eq 254) { $dddAlphanumeric = $DDD } else { $dddSerialNumber = $DDD }
}
}
$return = [PSCustomObject]@{
ManufacturerID = '{0:X4}' -f [BitConverter]::ToUInt16($bytes, 8)
ProductIDCode = '{0:X4}' -f [BitConverter]::ToUInt16($bytes, 10)
SerialNumber = '{0:X8}' -f [BitConverter]::ToUInt32($bytes, 12)
ManufacturerDate = $(switch ($bytes[16]) {
0 { '{0} (Year of Manufacture)' }
255 { '{0} (Model Year)' }
Default { "Week $($bytes[16]) of {0} (Year of Manufacture)" }
}) -f ($bytes[17] + 1990)
EDID_Version = 'v{0}.{1}' -f $bytes[18], $bytes[19]
dddDisplayProductName = $dddDisplayProductName
dddAlphanumeric = $dddAlphanumeric
dddSerialNumber = $dddSerialNumber
}
$return
}
}
}
}
注意 #1: 我主要使用 this 文档,并且 EDID 版本 1.3 和 1.4 彼此足够接近,因此此代码适用于这两个版本(并且这两个版本似乎都是最常见的目前正在使用)。
注#2: 该结构为每个监视器提供了 4 个显示描述符定义,但任何 DDD 都可以是任何类型。 这意味着一台监视器可以有多个完全相同类型的 DDD。 如果您查看下面的示例输出,请注意第一个监视器的“dddAlphanumeric”是一个数组,这是因为该监视器有 2 个字母数字类型的 DDD。
以下是在我的电脑上运行的结果:
ManufacturerID : AE0D
ProductIDCode : 176E
SerialNumber : 00000000
ManufacturerDate : Week 23 of 2019 (Year of Manufacture)
EDID_Version : v1.4
dddDisplayProductName :
dddAlphanumeric : {CMN, N173HCE-G33}
dddSerialNumber :
ManufacturerID : AC10
ProductIDCode : 407F
SerialNumber : 37363753
ManufacturerDate : Week 27 of 2013 (Year of Manufacture)
EDID_Version : v1.3
dddDisplayProductName : DELL U2713HM
dddAlphanumeric :
dddSerialNumber : 7JNY5375767S
ManufacturerID : 2D4C
ProductIDCode : 7103
SerialNumber : 01000E00
ManufacturerDate : Week 1 of 2020 (Year of Manufacture)
EDID_Version : v1.3
dddDisplayProductName : SAMSUNG
dddAlphanumeric :
dddSerialNumber :
这是我的笔记本电脑屏幕,这就是为什么序列号为00000000。序列号只是一个数字,而不是显示器背面的序列号。 由于我的笔记本电脑无法配备这种类型的第二个屏幕,因此制造商将其留空。 从 EDID 中更复杂地提取信息将从
ManufacturerID
查找制造商的实际名称,从 ProductIDCode
查找产品信息。 星期和年份似乎与我的笔记本电脑相符,其他信息可能是正确的,但对我来说意义不大。
ManufacturerID : AE0D
ProductIDCode : 176E
SerialNumber : 00000000
ManufacturerDate : Week 23 of 2019 (Year of Manufacture)
EDID_Version : v1.4
dddDisplayProductName :
dddAlphanumeric : {CMN, N173HCE-G33}
dddSerialNumber :
这是我曾经拥有的一台旧显示器,这就是您可能遇到问题的地方:您如何知道您正在查看当前信息还是过去信息。 检索到的信息显示正确。
ManufacturerID : AC10
ProductIDCode : 407F
SerialNumber : 37363753
ManufacturerDate : Week 27 of 2013 (Year of Manufacture)
EDID_Version : v1.3
dddDisplayProductName : DELL U2713HM
dddAlphanumeric :
dddSerialNumber : 7JNY5375767S
这是我当前的显示器,该信息似乎也与我所拥有的相符。 但是,正如您所看到的,每个制造商提供的信息截然不同,有些制造商提供的信息较多,而另一些制造商提供的信息较少。 在这种情况下,您可能需要查找 ProductIDCode
7103
以获得更详细的信息。
ManufacturerID : 2D4C
ProductIDCode : 7103
SerialNumber : 01000E00
ManufacturerDate : Week 1 of 2020 (Year of Manufacture)
EDID_Version : v1.3
dddDisplayProductName : SAMSUNG
dddAlphanumeric :
dddSerialNumber :