- Offizieller Beitrag
Ich habe gerade eine GetMonitor-Funktion für mein Computer-Info geschrieben, die auch mehrere Monitore erkennen kann.
Bei mir funktioniert sie auch, aber da ich dabei jede Menge Einträge aus der Registry auslese, weiß ich nicht, ob sie überall funktioniert.
Vielleicht könnt ihr mir mal helfen und die Funktion bei euch testen (keine Sorge, ich schreibe nichts in die Reg, es finden nur Lesezugriffe statt).
Mich interessiert vor allem, ob mehrere Monitore einwandfrei erkannt werden. Aber auch sonst bin ich für Hinweise auf fehlerhafte Ausgaben dankbar.
Das Testscript erstellt eine Textdatei mit den Ergebnissen. Vielleicht könntet ihr diese mitposten.
Spoiler anzeigen
#include <Array.au3>
$aMonitor = _CI_GetMonitor()
$hFile = FileOpen(@ScriptDir & '\!Monitor-Info.txt', 2)
If $hFile <> -1 Then
For $i = 0 To UBound($aMonitor) - 1
$save = ''
For $j = 0 To UBound($aMonitor, 2) - 1
$save &= $aMonitor[$i][$j] & ' *** '
Next
FileWriteLine($hFile, $save)
Next
FileClose($hFile)
EndIf
_ArrayDisplay($aMonitor)
Func _CI_GetMonitor($strComputer = '.')
Switch @OSVersion
Case 'WIN_VISTA', 'WIN_7'
Local $sX64 = '', $iCount, $sHKLM, $sTmp, $sMfg, $sDeviceDesc, $sDPMS, $sClassGUID, $sHardwareID
If @OSArch <> 'X86' Then $sX64 = '64'
$sHKLM = 'HKEY_LOCAL_MACHINE' & $sX64
$iCount = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\services\monitor\Enum', 'Count')
Local $aMonitor[$iCount + 1][6] = [['Hersteller:', 'Modell:', 'DPMS-Untersützung:', 'Position (x, y):', 'akt. Auflösung:', 'max. Auflösung:']]
For $i = 1 To $iCount
$sTmp = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\services\monitor\Enum', $i - 1)
$sMfg = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sTmp, 'Mfg')
$aMonitor[$i][0] = StringRegExpReplace($sMfg, '.+;(.+)', '$1')
$sDeviceDesc = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sTmp, 'DeviceDesc')
$aMonitor[$i][1] = StringRegExpReplace($sDeviceDesc, '.+;(.+)', '$1')
$sDPMS = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sTmp & '\Device Parameters', 'DPMS')
$aMonitor[$i][2] = StringMid('NeinJa', $sDPMS * 4 + 1, 4)
$sClassGUID = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sTmp, 'ClassGUID')
$sHardwareID = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sTmp, 'HardwareID')
Local $iEnum = 0, $sTmpKey, $sMatchingDeviceId, $sConnectivity, $sRecent, $sMatchConfig, $j, $x, $y, $cx, $cy
While True
$sTmpKey = $sHKLM & '\SYSTEM\CurrentControlSet\Control\Class\' & $sClassGUID & '\' & StringRight('0000' & $iEnum, 4)
$sMatchingDeviceId = RegRead($sTmpKey, 'MatchingDeviceId')
If @error Then ExitLoop
If $sMatchingDeviceId = $sHardwareID Then
$aMonitor[$i][5] = StringReplace(RegRead($sTmpKey, 'MaxResolution'), ',', ' x ')
$sConnectivity = RegEnumKey($sHKLM & '\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Connectivity', 1)
$sRecent = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Connectivity\' & $sConnectivity, 'Recent')
$j = 0
Do
$j += 1
$sMatchConfig = RegEnumKey($sHKLM & '\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration\', $j)
Until StringInStr($sMatchConfig, $sRecent) Or (@error <> 0)
$sTmp = $sHKLM & '\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration\' & $sMatchConfig & '\' & StringRight('00' & $i - 1, 2)
$x = Number(String(RegRead($sTmp, 'Position.cx')))
If $x > 2 ^ 31 Then $x = -BitXOR($x, 0xffffffff)
$y = Number(String(RegRead($sTmp, 'Position.cy')))
If $y > 2 ^ 31 Then $y = -BitXOR($y, 0xffffffff)
$cx = RegRead($sTmp, 'PrimSurfSize.cx')
$cy = RegRead($sTmp, 'PrimSurfSize.cy')
$aMonitor[$i][4] = $cx & ' x ' & $cy
$aMonitor[$i][3] = $x & ', ' & $y
ExitLoop
EndIf
$iEnum += 1
WEnd
Next
Return $aMonitor
Case Else
Local $aReturn[2][8] = [[ _
'Hersteller:', 'Modell:', 'Breite (Pixel):', 'Höhe (Pixel):', _
'Pixel pro Inch (X):', 'Pixel pro Inch (Y):', 'Monitorgröße (ca.):', 'PNPDeviceID:']]
Local $x = 0, $objWMIService, $colItems, $Output
$objWMIService = ObjGet('winmgmts:\\' & $strComputer & '\root\cimv2')
If Not IsObj($objWMIService) Then Return SetError(1, 0, 0)
$colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_DesktopMonitor', 'WQL', 0x30)
If IsObj($colItems) Then
For $objItem In $colItems
$x += 1
ReDim $aReturn[$x + 1][8]
$aReturn[$x][0] = $objItem.MonitorManufacturer
$aReturn[$x][1] = $objItem.Name
$aReturn[$x][2] = $objItem.ScreenWidth
$aReturn[$x][3] = $objItem.ScreenHeight
$aReturn[$x][4] = $objItem.PixelsPerXLogicalInch
$aReturn[$x][5] = $objItem.PixelsPerYLogicalInch
$aReturn[$x][6] = Round($objItem.ScreenWidth / ($objItem.PixelsPerXLogicalInch / 2.54), 2) & _
' x ' & Round($objItem.ScreenHeight / ($objItem.PixelsPerYLogicalInch / 2.54), 2) & ' cm²'
$aReturn[$x][7] = $objItem.PNPDeviceID
Next
EndIf
Return $aReturn
EndSwitch
EndFunc ;==>_CI_GetMonitor