如何在 Windows 中提取完整的显示器制造商/供应商 ID? (与Linux hwinfo --monitor命令相同)

问题描述 投票:0回答:1

我一直坚持以这种格式提取显示器制造商 ID 的硬件信息:xxxxx_xxxxxxx

基本上,提供 Linux 命令 hwinfo --monitor 作为“供应商”参数的格式似乎在标准 .NET/PowerShell 类或 Win API 中无法达到。

似乎大多数 .NET 工具仅提供有关监视器 ID 的有限数据。

我尝试了为监视器数据提供的大多数 .NET/Powershell 类/WinAPI:

  • WmiMonitorID
  • Win32_桌面监视器
  • WmiMonitorBasicDisplayParams
  • WmiMonitorDescriptor方法
  • 枚举显示设备
  • 枚举显示监视器
  • 获取监控信息

始终仅输出有限的制造商/名称 ID:

制造商:BOE06CB

显示器名称:京东方

但是我需要完整版的制造商ID:

制造商:RMJCY_NV15N42

显示器名称:BOEhydis NV15N42(戴尔RMJCY)

*此问题不是由于权限不足或显示器驱动程序过时引起的。如果我在同一台机器上运行例如 AIDA64 软件,它会正确抛出上述格式的数据。

有人知道哪个.NET类/WinAPI可以提取完整格式的显示器制造商ID吗?

非常感谢!

c# .net powershell winapi hardware
1个回答
0
投票

从 EDID 中提取非常基本的信息:

此代码通过注册表项提取每个 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       :
© www.soinside.com 2019 - 2024. All rights reserved.