GetMonitor-Funktion testen

    • Offizieller Beitrag

    Der Hinweis auf den Reg_Binary-Key "VolatileSettings" hat mich entscheidend weiter gebracht. Jetzt habe ich die Funktion für Win7 fertig.
    Es werden immer Einträge aus RegKeys benutzt, kein "raten" mehr. :thumbup:

    So weit erstmal die Win7-Monitor-Erkennung:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $aMonitor = _CI_GetMonitor()
    _ArrayDisplay($aMonitor)

    [/autoit] [autoit][/autoit] [autoit]

    Func _CI_GetMonitor()
    Local $iCount = 0, $sHKLM, $sDeviceVideo, $iMaxObjectNumber, $sVideo, $sTmp, $sUnitedVideo, $sMfg, $sDeviceDesc, $sDPMS, $sDriver, $x, $y, $xRes, $yRes, $sMaxRes
    Local $aMonitor[$iCount + 1][6] = [['Hersteller:', 'Modell:', 'DPMS-Untersützung:', 'Position (x, y):', 'akt. Auflösung:', 'max. Auflösung:']]
    $sHKLM = 'HKEY_LOCAL_MACHINE'
    If @OSArch <> 'X86' Then $sHKLM &= '64'
    Switch @OSVersion
    Case 'WIN_VISTA', 'WIN_7'
    $sDeviceVideo = $sHKLM & '\HARDWARE\DEVICEMAP\VIDEO'
    $iMaxObjectNumber = Number(String(RegRead($sDeviceVideo, 'MaxObjectNumber')))
    If $iMaxObjectNumber > 0 Then
    For $i = 0 To $iMaxObjectNumber
    $sVideo = StringReplace(RegRead($sDeviceVideo, '\Device\Video' & $i), '\Registry\Machine', $sHKLM)
    $sTmp = String(RegEnumVal($sVideo & '\VolatileSettings', 1))
    If $sTmp <> '' Then
    $sUnitedVideo = StringReplace($sVideo, '\Control', '\Hardware Profiles\UnitedVideo\Control')
    $x = Number(String(RegRead($sUnitedVideo, 'Attach.RelativeX')))
    If $x > 2 ^ 31 Then $x = -BitXOR($x, 0xffffffff)
    $y = Number(String(RegRead($sUnitedVideo, 'Attach.RelativeY')))
    If $y > 2 ^ 31 Then $y = -BitXOR($y, 0xffffffff)
    $xRes = Number(String(RegRead($sUnitedVideo, 'DefaultSettings.XResolution')))
    $yRes = Number(String(RegRead($sUnitedVideo, 'DefaultSettings.YResolution')))
    $sMonitor = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\services\monitor\Enum', $iCount)
    $sMfg = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sMonitor, 'Mfg')
    $sMfg = StringRegExpReplace($sMfg, '.+;(.+)', '$1')
    $sDeviceDesc = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sMonitor, 'DeviceDesc')
    $sDeviceDesc = StringRegExpReplace($sDeviceDesc, '.+;(.+)', '$1')
    $sDPMS = Number(String(RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sMonitor & '\Device Parameters', 'DPMS')))
    $sDriver = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sMonitor, 'Driver')
    $sMaxRes = String(RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Control\Class\' & $sDriver, 'MaxResolution'))
    $sMaxRes = StringReplace($sMaxRes, ',', ' x ')
    $iCount += 1
    ReDim $aMonitor[$iCount + 1][6]
    $aMonitor[$iCount][0] = $sMfg
    $aMonitor[$iCount][1] = $sDeviceDesc
    $aMonitor[$iCount][2] = StringMid('NeinJa', $sDPMS * 4 + 1, 4)
    $aMonitor[$iCount][3] = $x & ', ' & $y
    $aMonitor[$iCount][4] = $xRes & ' x ' & $yRes
    $aMonitor[$iCount][5] = $sMaxRes
    EndIf
    Next
    Return $aMonitor
    EndIf
    Case Else
    MsgBox(0,0, 'OS wird z.Zt. nicht unterstützt.')
    EndSwitch
    EndFunc ;==>_CI_GetMonitor

    [/autoit]


    Nach Weihnachten mache ich mich an die Funktion für den Rest. Danke, Bitboy, für den Hinweis. :)

    User mit Win7 könnten die Funktion mal testen. Normalerweise müsste es jetzt passen...

  • Gern geschehen. Arbeite ja selber daran, deswegen würde ich mich auch sehr freuen wenn du es für XP umgesetzt bekommst und den Code hier veröffentlichst.

    Das Problem wo ich nicht weitergekommen bin steht ja im vorherigen Beitrag.

    Wünsche noch schöne Feiertage.

  • So hab hier mal eine neue Version für XP. Bitte mal testen.

    Mit folgendem könnte es Probleme geben: Zeile 63 Da in der Registry die deutschen bezweichnungen gespeichert sind (Gerät, Funktion) wird der Aufruf bei anderssprachigen Betriebssystemen nicht funktionieren. Daneben bin ich mir nciht sicher ob meine Zuordnung der Geräte wirklich korrekt ist, hab leider zu wenig Hardware für ausführliche Tests.

    ToDo: Rückgabe von Fehlern.

    Edit: kleinen Fehler korrigiert

    Einen Fehler hab ich noch gefunden: Wenn Windows mehr Monitore erkennt als tatsächlich angeschlossen sind, wirkt sich das auch auf das Script aus :(

    Spoiler anzeigen
    [autoit]

    ;####################################################################
    ;#
    ;# Function _Get_Displays()
    ;#
    ;# Rückgabe: Array
    ;# Array[0][0] = Anzahl der Displays [n]
    ;# Array[n][0] = Hersteller
    ;# Array[n][1] = Modell
    ;# Array[n][2] = HardwareID
    ;# Array[n][3] = Treiber-Anbieter
    ;# Array[n][4] = Treiberversion
    ;# Array[n][5] = Maximale Auflösung X
    ;# Array[n][6] = Maximale Auflösung Y
    ;# Array[n][7] = Aktuelle Auflösung X
    ;# Array[n][8] = Aktuelle Auflösung Y
    ;# Array[n][9] = Farbtiefe
    ;# Array[n][10] = Bildwiederholrate
    ;# Array[n][11] = Teil des Desktops (1=Ja)
    ;# Array[n][12] = Position X
    ;# Array[n][13] = Position Y
    ;#
    ;# Autor: Bitboy, autoit.de
    ;#
    ;####################################################################

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Get_Displays()
    Local $MainKey, $ConfigKey, $i, $j, $tmpStr, $tmpStr2, $tmpArr
    Local $DeviceCount, $DCounter=0, $DeviceArr[64][11]
    Local $enum1, $enum2, $MonCounter=0, $MonArr[64][10]
    Local $retArr[64][14], $retCounter=0

    [/autoit] [autoit][/autoit] [autoit]

    ;Hauptschlüssel entsprechd der Architektur
    If @OSArch <> "X86" Then
    $MainKey = "HKLM64"
    $ConfigKey = "HKCC64"
    Else
    $MainKey = "HKLM"
    $ConfigKey = "HKCC"
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $DeviceCount = RegRead($MainKey & "\HARDWARE\DEVICEMAP\VIDEO", "MaxObjectNumber")

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To $DeviceCount
    ;Alle VideoDevices ermiteln
    $tmpStr = RegRead($MainKey & "\HARDWARE\DEVICEMAP\VIDEO", "\Device\Video" & $i)
    $tmpStr = StringReplace($tmpStr, "\Registry\Machine", $MainKey)
    $tmpStr2 = RegEnumVal($tmpStr & "\VolatileSettings", 1)
    If $tmpStr2 = "" Then
    ContinueLoop
    EndIf
    $DCounter = $DCounter + 1
    $tmpStr = RegRead($tmpStr & "\VolatileSettings", $tmpStr2)

    [/autoit] [autoit][/autoit] [autoit]

    $tmpStr = _Internal_HexToStr($tmpStr)

    [/autoit] [autoit][/autoit] [autoit]

    $tmpStr = StringReplace($tmpStr, "\??\", "")
    $tmpStr = StringReplace($tmpStr, "#", "\")
    $tmpStr = StringLeft($tmpStr, StringInStr($tmpStr, "\{", 0, -1)-1)

    [/autoit] [autoit][/autoit] [autoit]

    $DeviceArr[$DCounter][0] = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\" & $tmpStr, "ParentIdPrefix")
    $tmpStr2 = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\" & $tmpStr, "LocationInformation")
    $tmpStr2 = StringRegExpReplace($tmpStr2, "[^0-9,]", "")
    $tmpArr = StringSplit($tmpStr2, ",")

    [/autoit] [autoit][/autoit] [autoit]

    ;PCI-BUS = 1; Gerät = 2; Funktion = 3
    For $j = 1 To $tmpArr[0]
    $DeviceArr[$DCounter][$j] = $tmpArr[$j]
    Next

    [/autoit] [autoit][/autoit] [autoit]

    If $DeviceArr[$DCounter][3] <> 0 Then $DeviceArr[$DCounter][3] = $DeviceArr[$DCounter][3] + 1

    [/autoit] [autoit][/autoit] [autoit]

    ;Dazugehörige Informationen ermitteln (Auflösung..)
    $tmpStr = RegRead($MainKey & "\HARDWARE\DEVICEMAP\VIDEO", "\Device\Video" & $i)
    $tmpStr = StringReplace($tmpStr, "\Registry\Machine", $ConfigKey)
    $tmpStr = StringRegExpReplace($tmpStr, "(\ControlSet)[0-9]{3}", "\CurrentControlSet")
    MsgBox(0, "debug", $tmpStr)
    $DeviceArr[$DCounter][4] = RegRead($tmpStr, "DefaultSettings.XResolution") ;X-Auflösung
    $DeviceArr[$DCounter][5] = RegRead($tmpStr, "DefaultSettings.YResolution") ;Y-Auflösung
    $DeviceArr[$DCounter][6] = RegRead($tmpStr, "DefaultSettings.BitsPerPel") ;Farbtiefe
    $DeviceArr[$DCounter][7] = RegRead($tmpStr, "DefaultSettings.VRefresh") ;Bildwiederholrate
    $DeviceArr[$DCounter][8] = RegRead($tmpStr, "Attach.ToDesktop") ;Teil des Desktops ?
    $DeviceArr[$DCounter][9] = RegRead($tmpStr, "Attach.RelativeX") ;X-Position
    $DeviceArr[$DCounter][10] = RegRead($tmpStr, "Attach.RelativeY") ;Y-Position

    [/autoit] [autoit][/autoit] [autoit]

    ;_ArrayDisplay($DeviceArr)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $DeviceArr[0][0] = $DCounter
    ReDim $DeviceArr[$DCounter+1][14]

    [/autoit] [autoit][/autoit] [autoit]

    ;Monitore ermitteln
    $i = 1
    While 1
    $enum1 = RegEnumKey($MainKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY", $i)
    If @error Then ExitLoop

    [/autoit] [autoit][/autoit] [autoit]

    $j = 1
    While 1
    $enum2 = RegEnumKey($MainKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enum1, $j)
    If @error Then ExitLoop

    [/autoit] [autoit][/autoit] [autoit]

    RegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enum1 & "\" & $enum2 & "\Control", "")
    If @error <> 1 Then
    $MonCounter = $MonCounter + 1
    $MonArr[$MonCounter][0] = StringLeft($enum2, 12) ;Parent ID Prefix
    $MonArr[$MonCounter][1] = Int(StringMid($enum2, 23, 2)) ;PCI-Bus Nummer
    $MonArr[$MonCounter][2] = StringRight($enum2, 2) ; Funktion und oder Gerätenummer ?
    $MonArr[$MonCounter][3] = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enum1 & "\" & $enum2, "Mfg")
    $MonArr[$MonCounter][4] = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enum1 & "\" & $enum2, "DeviceDesc")
    $MonArr[$MonCounter][5] = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enum1 & "\" & $enum2, "HardwareID")
    $tmpStr = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enum1 & "\" & $enum2, "Driver")
    $MonArr[$MonCounter][6] = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Control\Class\" & $tmpStr, "ProviderName")
    $MonArr[$MonCounter][7] = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Control\Class\" & $tmpStr, "DriverVersion")
    $tmpStr2 = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Control\Class\" & $tmpStr, "MaxResolution")

    [/autoit] [autoit][/autoit] [autoit]

    $MonArr[$MonCounter][8] = StringLeft($tmpStr2, StringInStr($tmpStr2, ",")-1)
    $MonArr[$MonCounter][9] = StringRight($tmpStr2, StringLen($tmpStr2) - StringInStr($tmpStr2, ","))
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $j = $j + 1
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    $i = $i + 1
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ;Arrays zusammenführen
    For $i = 1 To $DeviceArr[0][0]
    ;ParentID prüfen
    $tmpStr = $DeviceArr[$i][0]

    [/autoit] [autoit][/autoit] [autoit]

    For $j = 1 To $MonCounter
    If $MonArr[$j][0] = $tmpStr Then
    ;ParentID stimmt -> Bus-Nummer prüfen
    If $DeviceArr[$i][1] = $MonArr[$j][1] Then
    ;Bus-Nummer Stimmt -> Gerätenummer / Funktion prüfen
    If String($DeviceArr[$i][3] & $DeviceArr[$i][2]) = $MonArr[$j][2] Then
    ;Geräte stimmen überein
    $retCounter = $retCounter + 1
    $retArr[$retCounter][0] = $MonArr[$j][3]
    $retArr[$retCounter][1] = $MonArr[$j][4]
    $retArr[$retCounter][2] = $MonArr[$j][5]
    $retArr[$retCounter][3] = $MonArr[$j][6]
    $retArr[$retCounter][4] = $MonArr[$j][7]
    $retArr[$retCounter][5] = $MonArr[$j][8]
    $retArr[$retCounter][6] = $MonArr[$j][9]
    $retArr[$retCounter][7] = $DeviceArr[$i][4]
    $retArr[$retCounter][8] = $DeviceArr[$i][5]
    $retArr[$retCounter][9] = $DeviceArr[$i][6]
    $retArr[$retCounter][10] = $DeviceArr[$i][7]
    $retArr[$retCounter][11] = $DeviceArr[$i][8]
    $retArr[$retCounter][12] = $DeviceArr[$i][9]
    $retArr[$retCounter][13] = $DeviceArr[$i][10]
    EndIf
    EndIf
    EndIf
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $retArr[0][0] = $retCounter
    Redim $retArr[$retCounter+1][14]
    ;MsgBox(0, "debug", $tmpStr)
    ;_ArrayDisplay($MonArr)
    ;_ArrayDisplay($DeviceArr)
    Return $retArr
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Internal_HexToStr($HexString)
    Local $i, $Len, $retStr, $tmpStr

    [/autoit] [autoit][/autoit] [autoit]

    $HexString = StringRight($HexString, StringLen($HexString) - 2)
    $Len = StringLen($HexString)
    For $i = 1 To $Len Step 2
    $tmpStr = StringMid ($HexString, $i, 2)
    If $tmpStr <> "00" Then
    $retStr = $retStr & Chr(Dec($tmpStr))
    EndIf
    Next
    Return $retStr
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <array.au3>
    $test = _Get_Displays()
    _ArrayDisplay($test)

    [/autoit]

    Einmal editiert, zuletzt von Bitboy (4. Januar 2010 um 16:17)

  • Der Hinweis auf den Reg_Binary-Key "VolatileSettings" hat mich entscheidend weiter gebracht. Jetzt habe ich die Funktion für Win7 fertig.
    Es werden immer Einträge aus RegKeys benutzt, kein "raten" mehr. :thumbup:

    So weit erstmal die Win7-Monitor-Erkennung:
    ...
    Nach Weihnachten mache ich mich an die Funktion für den Rest. Danke, Bitboy, für den Hinweis. :)

    User mit Win7 könnten die Funktion mal testen. Normalerweise müsste es jetzt passen...

    Die Erkennung der akt. und max. Auflösung stimmt nicht:
    [1],[2] akt. Auflösung ist nicht 0x0
    [1] max. Auflösung sollte 1920x1200 stehen

    Testsystem: Vista x32.

    Gruß,
    UEZ

  • So hab hier mal eine neue Version für XP. Bitte mal testen.

    Mit folgendem könnte es Probleme geben: Zeile 63 Da in der Registry die deutschen bezweichnungen gespeichert sind (Gerät, Funktion) wird der Aufruf bei anderssprachigen Betriebssystemen nicht funktionieren. Daneben bin ich mir nciht sicher ob meine Zuordnung der Geräte wirklich korrekt ist, hab leider zu wenig Hardware für ausführliche Tests.

    ToDo: Rückgabe von Fehlern.

    Ich bekomme ein leeres Array zurück!

    Testsystem Vista x32.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Wie gesagt, meine Funktion ist nur für XP, wie Oscar schon bemerkte haben sich die Regkeys mit VISTA geändert.

    Mir geht es auch erstmal nur um XP, wenn das sauber läuft kann man Oscars und meine Funktion zu einer zusammenbasteln.

  • Wie gesagt, meine Funktion ist nur für XP, wie Oscar schon bemerkte haben sich die Regkeys mit VISTA geändert.

    Mir geht es auch erstmal nur um XP, wenn das sauber läuft kann man Oscars und meine Funktion zu einer zusammenbasteln.

    Sorry, habe ich überlesen!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Das von mir oben angesprochene Problem mit den vielen Monitoren scheint besonders bei On-Board Intel Grafikkarten aufzutreten.
    Hab es eben an meinem Tablet versucht und Tada 7(!) Monitore im Gerätemanager bei maximal 3 möglichen. Und das Script liefert natürlich genauso viele zurück.

    Gut möglich das die Intel-Treiber etwas kurios programmiert sind. Leider hab ich nicht wirklich ne Idee wie man das Problem in den Griff bekommen kann, ansonsten funktioniert das Script und zeigt alle Werte richtig an.


    Edit: It's not a bug, it's a feature!
    http://www.intel.com/support/graphi…b/CS-022204.htm

    leuchtet mir trotzdem nicht ein warum das so gemacht wurde. und mein Problem löst es auch nicht...

    Einmal editiert, zuletzt von Bitboy (4. Januar 2010 um 21:18)

  • So, anscheinend legt INTEL einen zusätzlichen Schlüssel an der in anderen Systemen nicht da ist.

    Hier also die neue Version. Weiß eigentlich jemand wie amn die Größe vom Monitor bestimmen kann? Man bräuchte irgendwie einen Vergleichswert der PixelperInch oder so ähnlich heißt, finde aber dazu nichts.

    Spoiler anzeigen
    [autoit]

    ;####################################################################
    ;#
    ;# Function _Get_Displays()
    ;#
    ;# Rückgabe: Array
    ;# Array[0][0] = Anzahl der Displays [n]
    ;# Array[n][0] = Monitornummer
    ;# Array[n][1] = Hersteller
    ;# Array[n][2] = Modell
    ;# Array[n][3] = HardwareID
    ;# Array[n][4] = Treiber-Anbieter
    ;# Array[n][5] = Treiberversion
    ;# Array[n][6] = Maximale Auflösung X
    ;# Array[n][7] = Maximale Auflösung Y
    ;# Array[n][8] = Aktuelle Auflösung X
    ;# Array[n][9] = Aktuelle Auflösung Y
    ;# Array[n][10] = Farbtiefe
    ;# Array[n][11] = Bildwiederholrate
    ;# Array[n][12] = Teil des Desktops (1=Ja/0=Nein)
    ;# Array[n][13] = Position X
    ;# Array[n][14] = Position Y
    ;# Array[n][15] = DPMS (1=Ja/0=Nein)
    ;#
    ;# Autor: Bitboy, autoit.de
    ;#
    ;####################################################################

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Get_Displays()
    Local $MainKey, $ConfigKey, $MonKey, $i, $j, $tmpStr, $tmpStr2, $tmpArr
    Local $DeviceCount, $DCounter=0, $DeviceArr[64][11]
    Local $enum1, $enum2, $MonCounter=0, $MonArr[64][12]
    Local $retArr[64][16], $retCounter=0

    [/autoit] [autoit][/autoit] [autoit]

    ;Hauptschlüssel entsprechd der Architektur
    If @OSArch <> "X86" Then
    $MainKey = "HKLM64"
    $ConfigKey = "HKCC64"
    Else
    $MainKey = "HKLM"
    $ConfigKey = "HKCC"
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $DeviceCount = RegRead($MainKey & "\HARDWARE\DEVICEMAP\VIDEO", "MaxObjectNumber")

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To $DeviceCount
    ;Alle VideoDevices ermiteln
    $tmpStr = RegRead($MainKey & "\HARDWARE\DEVICEMAP\VIDEO", "\Device\Video" & $i)
    $tmpStr = StringReplace($tmpStr, "\Registry\Machine", $MainKey)
    $tmpStr2 = RegEnumVal($tmpStr & "\VolatileSettings", 1)
    If $tmpStr2 = "" Then
    ContinueLoop
    EndIf
    $DCounter = $DCounter + 1
    $tmpStr = RegRead($tmpStr & "\VolatileSettings", $tmpStr2)

    [/autoit] [autoit][/autoit] [autoit]

    $tmpStr = _Internal_HexToStr($tmpStr)

    [/autoit] [autoit][/autoit] [autoit]

    $tmpStr = StringReplace($tmpStr, "\??\", "")
    $tmpStr = StringReplace($tmpStr, "#", "\")
    $tmpStr = StringLeft($tmpStr, StringInStr($tmpStr, "\{", 0, -1)-1)

    [/autoit] [autoit][/autoit] [autoit]

    $DeviceArr[$DCounter][0] = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\" & $tmpStr, "ParentIdPrefix")
    $tmpStr2 = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\" & $tmpStr, "LocationInformation")
    $tmpStr2 = StringRegExpReplace($tmpStr2, "[^0-9,]", "")
    $tmpArr = StringSplit($tmpStr2, ",")

    [/autoit] [autoit][/autoit] [autoit]

    ;PCI-BUS = 1; Gerät = 2; Funktion = 3
    For $j = 1 To $tmpArr[0]
    $DeviceArr[$DCounter][$j] = $tmpArr[$j]
    Next

    [/autoit] [autoit][/autoit] [autoit]

    If $DeviceArr[$DCounter][3] <> 0 Then $DeviceArr[$DCounter][3] = $DeviceArr[$DCounter][3] + 1

    [/autoit] [autoit][/autoit] [autoit]

    ;Dazugehörige Informationen ermitteln (Auflösung..)
    $tmpStr = RegRead($MainKey & "\HARDWARE\DEVICEMAP\VIDEO", "\Device\Video" & $i)
    $tmpStr = StringReplace($tmpStr, "\Registry\Machine", $ConfigKey)
    $tmpStr = StringRegExpReplace($tmpStr, "(\ControlSet)[0-9]{3}", "\CurrentControlSet")
    $DeviceArr[$DCounter][4] = RegRead($tmpStr, "DefaultSettings.XResolution") ;X-Auflösung
    $DeviceArr[$DCounter][5] = RegRead($tmpStr, "DefaultSettings.YResolution") ;Y-Auflösung
    $DeviceArr[$DCounter][6] = RegRead($tmpStr, "DefaultSettings.BitsPerPel") ;Farbtiefe
    $DeviceArr[$DCounter][7] = RegRead($tmpStr, "DefaultSettings.VRefresh") ;Bildwiederholrate
    $DeviceArr[$DCounter][8] = RegRead($tmpStr, "Attach.ToDesktop") ;Teil des Desktops ?
    $DeviceArr[$DCounter][9] = RegRead($tmpStr, "Attach.RelativeX") ;X-Position
    $DeviceArr[$DCounter][10] = RegRead($tmpStr, "Attach.RelativeY") ;Y-Position

    [/autoit] [autoit][/autoit] [autoit]

    ;_ArrayDisplay($DeviceArr)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $DeviceArr[0][0] = $DCounter
    ReDim $DeviceArr[$DCounter+1][14]

    [/autoit] [autoit][/autoit] [autoit]

    ;Prüfung der real angeschlossenen Monitore (erfoderlich für einige Grafikkarten z.B INTEL)
    RegRead($ConfigKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY", "")
    If @error <> 1 Then
    $MonKey = $ConfigKey
    Else
    $MonKey = $MainKey
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;Monitore ermitteln
    $i = 1
    While 1
    $enum1 = RegEnumKey($MonKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY", $i)
    If @error Then ExitLoop

    [/autoit] [autoit][/autoit] [autoit]

    $j = 1
    While 1
    $enum2 = RegEnumKey($MonKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enum1, $j)
    If @error Then ExitLoop

    [/autoit] [autoit][/autoit] [autoit]

    RegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enum1 & "\" & $enum2 & "\Control", "")
    ;MsgBox(0, "debug", @extended)
    If @error <> 1 Then
    $MonCounter = $MonCounter + 1
    $MonArr[$MonCounter][0] = StringLeft($enum2, 12) ;Parent ID Prefix
    $MonArr[$MonCounter][1] = Int(StringMid($enum2, 23, 2)) ;PCI-Bus Nummer
    $MonArr[$MonCounter][2] = StringRight($enum2, 2) ; Funktion und oder Gerätenummer ?
    $MonArr[$MonCounter][3] = StringMid($enum2, 14, 8) ; "SettingsID"
    $MonArr[$MonCounter][4] = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enum1 & "\" & $enum2, "Mfg")
    $MonArr[$MonCounter][5] = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enum1 & "\" & $enum2, "DeviceDesc")
    $MonArr[$MonCounter][6] = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enum1 & "\" & $enum2, "HardwareID")
    $tmpStr = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enum1 & "\" & $enum2, "Driver")
    $MonArr[$MonCounter][7] = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Control\Class\" & $tmpStr, "ProviderName")
    $MonArr[$MonCounter][8] = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Control\Class\" & $tmpStr, "DriverVersion")
    $tmpStr2 = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Control\Class\" & $tmpStr, "MaxResolution")

    [/autoit] [autoit][/autoit] [autoit]

    $MonArr[$MonCounter][9] = StringLeft($tmpStr2, StringInStr($tmpStr2, ",")-1)
    $MonArr[$MonCounter][10] = StringRight($tmpStr2, StringLen($tmpStr2) - StringInStr($tmpStr2, ","))
    $MonArr[$MonCounter][11] = Int(RegRead($MainKey & "\SYSTEM\CurrentControlSet\Control\Class\" & $tmpStr, "DPMS"))
    If $MonArr[$MonCounter][11] = "" Then $MonArr[$MonCounter][11] = 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $j = $j + 1
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    $i = $i + 1
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ;Arrays zusammenführen
    For $i = 1 To $DeviceArr[0][0]
    ;ParentID prüfen
    $tmpStr = $DeviceArr[$i][0]

    [/autoit] [autoit][/autoit] [autoit]

    For $j = 1 To $MonCounter
    If $MonArr[$j][0] = $tmpStr Then
    ;ParentID stimmt -> Bus-Nummer prüfen
    If $DeviceArr[$i][1] = $MonArr[$j][1] Then
    ;Bus-Nummer Stimmt -> Gerätenummer / Funktion prüfen
    If String($DeviceArr[$i][3] & $DeviceArr[$i][2]) = $MonArr[$j][2] Then
    ;Geräte stimmen überein
    $retCounter = $retCounter + 1
    $retArr[$retCounter][0] = $j
    $retArr[$retCounter][1] = $MonArr[$j][4]
    $retArr[$retCounter][2] = $MonArr[$j][5]
    $retArr[$retCounter][3] = $MonArr[$j][6]
    $retArr[$retCounter][4] = $MonArr[$j][7]
    $retArr[$retCounter][5] = $MonArr[$j][8]
    $retArr[$retCounter][6] = $MonArr[$j][9]
    $retArr[$retCounter][7] = $MonArr[$j][10]
    $retArr[$retCounter][8] = $DeviceArr[$i][4]
    $retArr[$retCounter][9] = $DeviceArr[$i][5]
    $retArr[$retCounter][10] = $DeviceArr[$i][6]
    $retArr[$retCounter][11] = $DeviceArr[$i][7]
    $retArr[$retCounter][12] = $DeviceArr[$i][8]
    $retArr[$retCounter][13] = $DeviceArr[$i][9]
    $retArr[$retCounter][14] = $DeviceArr[$i][10]
    $retArr[$retCounter][15] = $MonArr[$MonCounter][11]
    EndIf
    EndIf
    EndIf
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $retArr[0][0] = $retCounter
    Redim $retArr[$retCounter+1][16]
    ;MsgBox(0, "debug", $tmpStr)
    ;_ArrayDisplay($MonArr)
    ;_ArrayDisplay($DeviceArr)
    Return $retArr
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Internal_HexToStr($HexString)
    Local $i, $Len, $retStr, $tmpStr

    [/autoit] [autoit][/autoit] [autoit]

    $HexString = StringRight($HexString, StringLen($HexString) - 2)
    $Len = StringLen($HexString)
    For $i = 1 To $Len Step 2
    $tmpStr = StringMid ($HexString, $i, 2)
    If $tmpStr <> "00" Then
    $retStr = $retStr & Chr(Dec($tmpStr))
    EndIf
    Next
    Return $retStr
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;TestCode
    #include <array.au3>
    $test = _Get_Displays()
    $test[0][1] = "Hersteller"
    $test[0][2] = "Modell"
    $test[0][3] = "HardwareID"
    $test[0][4] = "Treiber Anbieter"
    $test[0][5] = "Treiberversion"
    $test[0][6] = "Max. X"
    $test[0][7] = "Max Y"
    $test[0][8] = "Aktuell X"
    $test[0][9] = "Aktuell Y"
    $test[0][10] = "Farbtiefe"
    $test[0][11] = "Bildwiederholrate"
    $test[0][12] = "Teil des Desktops"
    $test[0][13] = "Position X"
    $test[0][14] = "Position Y"
    $test[0][15] = "DPMS"
    _ArrayDisplay($test)

    [/autoit]
  • So einen festen "PixelPerInch"-Wert gibt es doch nicht.

    Der ist bei Röhrenmonitoren von der Lochmaske und bei modernen LCD's vom physikalischen Aufbau des Panels abhängig.
    Es gibt ja LCD's mit ein und derselben Pixelzahl, aber in verschiedenen Größen !

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Eben, ist nur die Frage ob die physikalische Größe per Edid (oder sonstwie) übermittelt und hinterlegt wird.
    Anschließend kann der Wert dann mit zusammen der nativen Auflösung errechnet werden.

  • Der Hinweis auf den Reg_Binary-Key "VolatileSettings" hat mich entscheidend weiter gebracht. Jetzt habe ich die Funktion für Win7 fertig.
    Es werden immer Einträge aus RegKeys benutzt, kein "raten" mehr. :thumbup:

    So weit erstmal die Win7-Monitor-Erkennung:
    ....
    Nach Weihnachten mache ich mich an die Funktion für den Rest. Danke, Bitboy, für den Hinweis. :)

    User mit Win7 könnten die Funktion mal testen. Normalerweise müsste es jetzt passen...

    Das funktioniert unter Windows 7 Home Premium 32x Bit nicht!
    Ich habe nur einen Laptopmonitor angeschlossen mit 1600x900 Pixel (Aktueller-Wert und Max-Wert).

  • hab beim nachrechnen auch gemerkt, dass die Werte für die Bildschirmgröße zu ungenau sind. naja war nen Versuch wert.

    Das mit dem zusätzlichen Schlüssel für INTEL Grafikkarten ist auch nicht bei allen so, auf meinem laptop gehts jedenfalls nicht....
    Langsam glaub ich auch nicht mehr dran, dass das allein über die registry geht, dafür ist das System zu wirr aufgebaut, dabei hätte es so einfach sein können...

    • Offizieller Beitrag

    Ich hab jetzt auch gemerkt, dass in meinem Win7-Code immer noch ein Fehler drin ist. Die Zuordnung der Position und akt. Auflösung zu dem jeweiligen Monitor passt nicht.
    Die Reihenfolge ist nicht genauso, wie beim Displaykey. Ich habe mittlerweile die Registry von vorne bis hinten durchgesehen. Ich kann keinen direkten Verweis auf diese Daten entdecken.
    Irgendwo ist da noch etwas, dass sich vor mir verbirgt. ?(
    Und dann kommt noch dazu, dass sich die Werte bei jeder Windowsversion woanders befinden. X(
    Ich glaub', ich geb's auf...

  • So wie ich das bis jetzt sehe gibt windows die kontrolle darüber auch an den grafiktreiber, bzw den Dienst davon ab.

    HKLM\CurrentControlSet\Services\$Dienstname

    und da hat jeder Hersteller seine eigenen "Ideen" umgesetzt.

    einzige Möglichkeit die ich noch seh ist, dass man sich über die wmi ein paar infos besorgt die man dann eindeutig mit selbst gesammelten verknüpfen kann.
    Für XP sieht das auf anhieb möglich aus, wie zuverlässig das bei verschiedenen Einstellungen (Monitor zwar angeschlossen, aber nicht benutzt) lässt sich aber nicht sagen.
    teilweise liefert ja auch wmi sinnlose werte.