GetMonitor-Funktion testen

  • Garnix ^^
    Schau auf das Bild. Ich habe, nach etwas stöbern meine aktuelle Auflösung in
    "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Control\VIDEO\{DC8F5146-99A1-450C-AA19-3233F6BD554F}\0000" gefunden. Die 2 Unterschlüssel, die du auf dem Bild erkennen kannst sind meine Bildschirme: Der erste ist der ausgeschaltete (weil durchgebrochen :( ) Laptopdisplay, und der zweie ist mein aktiver Röhrenmonitor.

    Der überschlüssel "0000" scheint den grade aktiven Monitor auszugeben?! Nur wie sähe das aus wenn ich 2 Monitore angeschlossen hab? Fragen über Fragen :S

    //EDIT: Juhuuuu Post #800!

  • Hi Oscar,
    habe mit DumpEDID herumgespielt um die "Extended display identification data " auszulesen. Funktioniert unter XP sehr gut und gibt z.B. die den Monitor Namen ("Philips 190P"), die Seriennummer, Bildschirmgrößen etc. aus.
    Das Problem dabei ist, dass sich in der Registry die jemals am PC angeschlossenen Bildschirme akkumulieren (d.h. die Registry wird beim Systemstart mit den EDID Daten gefüllt. Dort finden sich aber mehr Bildschirme als tatsächlich vorhanden, da nicht mehr gefundene Bildschirme nicht aus der Registry gelöscht werden). Vielleicht müsste man die WMI Abfragen und EDID kombinieren.
    Die Registry Werte findest Du unter HKLM\SYSTEM\CurrentControlSet\Enum\DISPLAY\....\EDID (unter XP).

    Ob bzw. wie man das in AutoIt einbaut so dass es sicher mit allen Windows Systemen funktioniert, bin ich leider überfragt.
    Vielleicht hilft dieses Posting oder dieses (hier wird der EDID String deaktiviert).

    Gut funktioniert dieses Skript (obwohl ich jeden Monitor 2x habe, aber das lässt sich aussortieren)

  • Scheint fast so. Bei meiner Freundin (Vista x64, TFT per Analog) befindet sich die Auflösung unter
    "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Control\VIDEO\{CCC3B725-F071-4649-A44D-F804ED56CE6C}\0000"

    Interessant ist, dass "{CCC3B725-F071-4649-A44D-F804ED56CE6C}" Hier auch der letzte Schlüssel unter "..\Control\VIDEO\" ist. Genauso wie die akt. Auflösung bei mir im letzten Schlüssel zu finden war.

  • Hab meins nochmal erweitert, kann das mal jemand mit mehreren Monitoren testen um zu sehen ob das der richtige Weg ist?

    Spoiler anzeigen
    [autoit]

    ;####################################################################
    ;#
    ;# Func _GetDisplays() ermittelt benutzte Monitore
    ;#
    ;# Rückgabewerte: Array[0][0] = Anzahl der Monitore = n
    ;# Array[n][0] = Hersteller
    ;# Array[n][1] = Modell
    ;# Array[n][2] = Aktuelle Auflösung X (Breite)
    ;# Array[n][3] = Aktuelle Auflösung Y (Höhe)
    ;# Array[n][4] = Aktuelle Bildwiederholrate (Hz)
    ;# !Array[n][5] = Farbqualität (Bit) (fehlt noch)
    ;# Array[n][6] = Monitornummer
    ;# Array[n][7] = Maximale Auflösung X (Breite)
    ;# Array[n][8] = Maximale Auflösung Y (Höhe)
    ;# Array[n][9] = Treiberversion
    ;# Array[n][10] = Treiberdatum, Format: MM-DD-YYYY
    ;# Array[n][11] = *.inf-Datei des Treibers
    ;# Array[n][12] = *.inf-Section Treibers
    ;# ToDO: Fehlerkorrektur
    ;# Autor: Bitboy
    ;####################################################################
    Dim $Monkey, $Driver

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

    Func _GetDisplays()
    Local $VidDevArr[1], $tmpKey, $tmpKey2, $DeviceID, $DeviceNum
    Local $counter=0, $enumkey1, $enumkey2, $retArray[64][13], $resArr, $temp, $MonitorID, $MonDriver, $CurRes, $CurResArr
    Local $Mainkey, $i, $j, $k, $tmpArr

    ;32 / 64 Bit Registryschlüssel festlegen
    If @OSArch = "X86" Then
    $Mainkey = "HKEY_LOCAL_MACHINE"
    Else
    $Mainkey = "HKEY_LOCAL_MACHINE64"
    EndIf

    ;Anzahl und DeviceID der VideoDevices bestimmen
    $DeviceNum = Dec(RegRead($Mainkey & "\HARDWARE\DEVICEMAP\VIDEO", "MaxObjectNumber"))
    Redim $VidDevArr[$DeviceNum+1]
    For $i = 0 To $DeviceNum
    ConsoleWrite($i)
    $tmpKey = RegRead($Mainkey & "\HARDWARE\DEVICEMAP\VIDEO", "\Device\Video" & $i)
    $tmpKey = StringReplace($tmpKey, "\Registry\Machine", $Mainkey)
    $tmpKey2 = RegEnumVal($tmpKey & "\VolatileSettings", 1)
    $tmpKey = RegRead($tmpKey & "\VolatileSettings", $tmpKey2)
    If $tmpKey <> "" Then
    $counter = $counter +1
    $tmpKey = StringReplace($tmpKey, "0x", "")
    $tmpKey = StringReplace($tmpKey, "00", "")
    ;MsgBox(0,"debug", $tmpKey)
    $tmpArr = StringSplit(_HexToString($tmpKey), "#")
    ;_ArrayDisplay($tmpArr)
    For $j = 1 To $tmpArr[0]
    If StringInStr($tmpArr[$j], "PCI") Then
    $DeviceID = "PCI:"
    EndIf
    If StringInStr($tmpArr[$j], "VEN") Then
    $DeviceID = $DeviceID & $tmpArr[$j]
    ExitLoop
    EndIf
    Next
    $VidDevArr[$i+1] = $DeviceID
    EndIf
    Next

    ReDim $VidDevArr[$counter + 1]
    $VidDevArr[0] = $counter
    ;_ArrayDisplay($VidDevArr)
    $i = 1
    $j = 1
    $counter = 0

    While 1
    $enumkey1 = RegEnumKey($Mainkey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY", $i)
    If @error <> 0 then ExitLoop

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

    $j = 1
    While 1
    $enumkey2 = RegEnumKey($Mainkey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1, $j)
    If @error <> 0 then ExitLoop
    RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1 & "\" & $enumkey2 & "\Control", "")
    If @error <> 1 Then
    $MonitorID = StringReplace(RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1 & "\" & $enumkey2, "HardwareID"), "\", ":")
    $MonDriver = StringReplace(RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1 & "\" & $enumkey2, "Driver"), "\", ":")
    $counter = $counter + 1
    ;Hersteller
    $retArray[$counter][0] = RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1 & "\" & $enumkey2, "Mfg")
    ;Modell
    $retArray[$counter][1] = RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1 & "\" & $enumkey2, "DeviceDesc")

    For $k = 1 To $VidDevArr[0]
    $CurRes = RegEnumKey($Mainkey & "\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel\Settings\Video\" & $VidDevArr[$k] & "\" & $MonitorID & ":" & $MonDriver & ",0", 1)
    If Not @error Then
    $CurResArr = StringSplit($CurRes,"x")
    ;aktuelle Auflösung X (Breite)
    $retArray[$counter][2] = StringStripWS($CurResArr[1], 8)
    ;Aktuelle Auflösung Y (Höhe)
    $retArray[$counter][3] = StringStripWS($CurResArr[2], 8)
    ;Aktuelle Bildwiederholrate (Hz)
    $retArray[$counter][4] = StringStripWS(StringReplace($CurResArr[3],"Hz",""), 8)
    ;MsgBox(0, $MonitorID & ":" & $MonDriver & ",0", $CurRes)

    ;ToDo: Schleife zum ermitteln der Farbtiefe

    $retArray[$counter][6] = $k
    EndIf
    Next

    ;Maximale Auflösung
    $temp = RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1 & "\" & $enumkey2, "Driver")
    $resArr = StringSplit(RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Control\Class\" & $temp, "MaxResolution"), ",")
    ;X (Breite)
    $retArray[$counter][7] = $resArr[1]
    ;Y (Höhe)
    $retArray[$counter][8] = $resArr[2]
    ;Treiberversion
    $retArray[$counter][9] = RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Control\Class\" & $temp, "DriverVersion")
    ;Treiberdatum
    $retArray[$counter][10] = RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Control\Class\" & $temp, "DriverDate")
    ;*.Inf-Datei
    $retArray[$counter][11] = RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Control\Class\" & $temp, "InfPath")
    ;Inf-Section
    $retArray[$counter][12] = RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Control\Class\" & $temp, "InfSection")
    EndIf
    $j = $j + 1
    WEnd

    $i = $i + 1
    WEnd
    ReDim $retArray[$counter+1][13]
    $retArray[0][0] = $counter
    Return $retArray
    EndFunc

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

    #Include <String.au3>
    #include <array.au3>

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

    $test = _GetDisplays()
    _ArrayDisplay($test)

    [/autoit]
  • Sieht bei mir (Windows XP SP 2) so aus:
    autoit.de/wcf/attachment/7057/
    Ich habe 2 Bildschirme (Philips 190P). Dass 5 angezeigt werden liegt daran, dass sich in der Registry alle jemals am PC angehängten Bildschirme sammeln (siehe meinen vorigen Beitrag).
    Ich habe den Eindruck, dass halbwegs richtige Aussagen über die angeschlossenen Bildschirme nur über EDID gemacht werden können.

  • An dem Rechner wo ichs getestet hab (XP SP3) waren auch mal andere Monitore angeschlossen.
    So wie ich das gesehen hab, haben aber nur aktive Monitore den Schlüssel
    HKLM\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1 & "\" & $enumkey2 & "\Control" (Zeile 93)

    ist das möglicherweise unter SP2 anders?

    Hab mir mit dem Process Monitor anzeigen lassen auf welche Schlüssel das Programm zur Anzeigeeinstellung zugreift und andere als die benutzten Schlüssel hab ich nicht gesehen.

  • Wenn ich mir die Keys ausgeben lasse die auf Zeile 79 gelesenw erden, so bekomme ich folgende Liste und als Ergebnis die vorhin gepostete Tabelle von 5 Bildschirmen.

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\Default_Monitor\4&21018055&0&80862100&00&02\Control
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\Default_Monitor\4&21018055&0&80862500&00&02\Control
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\Default_Monitor\4&290a4556&0&80872100&00&22\Control
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\NEC61BE\4&21018055&0&80861500&00&02\Control
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\PHL081B\4&21018055&0&80861100&00&02\Control
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\PHL081B\4&21018055&0&80861300&00&02\Control
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\PHL081B\4&290a4556&0&80871100&00&22\Control
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\PHL081B\4&290a4556&0&80871300&00&22\Control

  • water
    Werden im Gerätemanager bei dir auch soviele Monitore gelistet?

    Was ich auch nicht versteh ist, dass das Script gar keine eingestellte Auflösung anzeigt.
    ist unter dem Schlüssel HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel\Settings\Video\
    gar ncihts dass mit der Auflösung zu tun hat?

  • Zitat: "Oh verdammt, unter WinXP funktioniert die WMI-Methode auch nicht bei mehreren Monitoren?"

    Vista und Win7 hab ich gar nicht, also versuche ich die Funktion für XP ans laufen zu bekommen. Ideal wäre natürlich wenns für alle Versionen läuft.

    Soweit bin ich jetzt: Sind aber immer noch Fehler drin und Sachen wo ich nciht ganz genau weiß wie es funktioniert :(

    Spoiler anzeigen
    [autoit]

    ;####################################################################
    ;#
    ;# Func _GetDisplays() ermittelt benutzte Monitore
    ;#
    ;# Rückgabewerte: Array[0][0] = Anzahl der Monitore = n
    ;# Array[n][0] = Hersteller
    ;# Array[n][1] = Modell
    ;# Array[n][2] = Aktuelle Auflösung X (Breite)
    ;# Array[n][3] = Aktuelle Auflösung Y (Höhe)
    ;# Array[n][4] = Aktuelle Bildwiederholrate (Hz)
    ;# Array[n][5] = Farbqualität (Bit)
    ;# Array[n][6] = Monitornummer
    ;# Array[n][7] = Maximale Auflösung X (Breite)
    ;# Array[n][8] = Maximale Auflösung Y (Höhe)
    ;# Array[n][9] = Treiberversion
    ;# Array[n][10] = Treiberdatum, Format: MM-DD-YYYY
    ;# Array[n][11] = *.inf-Datei des Treibers
    ;# Array[n][12] = *.inf-Section Treibers
    ;#
    ;# Autor: Bitboy
    ;####################################################################
    Dim $Monkey, $Driver

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

    Func _GetDisplays()
    Local $VidDevArr[1][2], $tmpKey, $tmpKey2, $DeviceID, $DeviceNum
    Local $counter=0, $enumkey1, $enumkey2, $retArray[64][13], $resArr, $temp, $MonitorID, $MonDriver, $CurRes, $CurResArr
    Local $Mainkey, $i, $j, $k, $tmpArr

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

    ;32 / 64 Bit Registryschlüssel festlegen
    If @OSArch = "X86" Then
    $Mainkey = "HKEY_LOCAL_MACHINE"
    Else
    $Mainkey = "HKEY_LOCAL_MACHINE64"
    EndIf

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

    ;Anzahl und DeviceID der VideoDevices bestimmen
    $DeviceNum = Dec(RegRead($Mainkey & "\HARDWARE\DEVICEMAP\VIDEO", "MaxObjectNumber"))
    Redim $VidDevArr[$DeviceNum+2][2]
    For $i = 0 To $DeviceNum
    ConsoleWrite($i)
    $tmpKey = RegRead($Mainkey & "\HARDWARE\DEVICEMAP\VIDEO", "\Device\Video" & $i)
    $VidDevArr[$i+1][1] = StringRight($tmpKey, StringLen($tmpKey) - StringInStr($tmpKey, "\{", 0, -1))
    $tmpKey = StringReplace($tmpKey, "\Registry\Machine", $Mainkey)
    $tmpKey2 = RegEnumVal($tmpKey & "\VolatileSettings", 1)
    $tmpKey = RegRead($tmpKey & "\VolatileSettings", $tmpKey2)
    If $tmpKey <> "" Then
    $counter = $counter +1
    $tmpKey = StringReplace($tmpKey, "0x", "")
    $tmpKey = StringReplace($tmpKey, "00", "")
    ;MsgBox(0,"debug", $tmpKey)
    $tmpArr = StringSplit(_HexToString($tmpKey), "#")
    ;_ArrayDisplay($tmpArr)
    For $j = 1 To $tmpArr[0]
    If StringInStr($tmpArr[$j], "PCI") Then
    $DeviceID = "PCI:"
    ElseIf StringInStr($tmpArr[$j], "VEN") Then
    $DeviceID = $DeviceID & $tmpArr[$j]
    ExitLoop
    EndIf
    Next
    $VidDevArr[$i+1][0] = $DeviceID
    EndIf
    Next

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

    ReDim $VidDevArr[$counter + 1][2]
    $VidDevArr[0][0] = $counter
    _ArrayDisplay($VidDevArr)
    $i = 1
    $j = 1
    $counter = 0

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

    While 1
    $enumkey1 = RegEnumKey($Mainkey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY", $i)
    If @error <> 0 then ExitLoop

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

    $j = 1
    While 1
    $enumkey2 = RegEnumKey($Mainkey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1, $j)
    If @error <> 0 then ExitLoop
    RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1 & "\" & $enumkey2 & "\Control", "")
    If @error <> 1 Then
    $MonitorID = StringReplace(RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1 & "\" & $enumkey2, "HardwareID"), "\", ":")
    $MonDriver = StringReplace(RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1 & "\" & $enumkey2, "Driver"), "\", ":")
    $counter = $counter + 1
    ;Hersteller
    $retArray[$counter][0] = RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1 & "\" & $enumkey2, "Mfg")
    ;Modell
    $retArray[$counter][1] = RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1 & "\" & $enumkey2, "DeviceDesc")

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

    For $k = $VidDevArr[0][0] to 0 step -1
    $CurRes = RegEnumKey($Mainkey & "\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel\Settings\Video\" & $VidDevArr[$k][0] & "\" & $MonitorID & ":" & $MonDriver & ",0", 1)
    If Not @error Then
    $CurResArr = StringSplit($CurRes,"x")
    ;aktuelle Auflösung X (Breite)
    $retArray[$counter][2] = StringStripWS($CurResArr[1], 8)
    ;Aktuelle Auflösung Y (Höhe)
    $retArray[$counter][3] = StringStripWS($CurResArr[2], 8)
    ;Aktuelle Bildwiederholrate (Hz)
    $retArray[$counter][4] = StringStripWS(StringReplace($CurResArr[3],"Hz",""), 8)
    ;MsgBox(0, $MonitorID & ":" & $MonDriver & ",0", $CurRes)

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

    ;Farbtiefe
    If RegRead($Mainkey & "\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel\Settings\Video\" & _
    $VidDevArr[$k][0] & "\" & $MonitorID & ":" & $MonDriver & ",0\" & $CurRes, "32 bpp") = 1 Then
    $retArray[$counter][5] = 32
    ElseIf RegRead($Mainkey & "\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel\Settings\Video\" & _
    $VidDevArr[$k][0] & "\" & $MonitorID & ":" & $MonDriver & ",0\" & $CurRes, "16 bpp") = 1 Then
    $retArray[$counter][5] = 16
    ElseIf RegRead($Mainkey & "\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel\Settings\Video\" & _
    $VidDevArr[$k][0] & "\" & $MonitorID & ":" & $MonDriver & ",0\" & $CurRes, "8 bpp") = 1 Then
    $retArray[$counter][5] = 8
    ElseIf RegRead($Mainkey & "\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel\Settings\Video\" & _
    $VidDevArr[$k][0] & "\" & $MonitorID & ":" & $MonDriver & ",0\" & $CurRes, "4 bpp") = 1 Then
    $retArray[$counter][5] = 4
    EndIf
    $retArray[$counter][6] = $k
    Else
    ;$retArray[$counter][2] = 0
    ;$retArray[$counter][3] = 0
    ;$retArray[$counter][4] = 0
    ;$retArray[$counter][5] = 0
    ;$retArray[$counter][6] = 0
    EndIf
    Next

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

    ;Maximale Auflösung
    $temp = RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1 & "\" & $enumkey2, "Driver")
    $resArr = StringSplit(RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Control\Class\" & $temp, "MaxResolution"), ",")
    ;X (Breite)
    $retArray[$counter][7] = $resArr[1]
    ;Y (Höhe)
    $retArray[$counter][8] = $resArr[2]
    ;Treiberversion
    $retArray[$counter][9] = RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Control\Class\" & $temp, "DriverVersion")
    ;Treiberdatum
    $retArray[$counter][10] = RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Control\Class\" & $temp, "DriverDate")
    ;*.Inf-Datei
    $retArray[$counter][11] = RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Control\Class\" & $temp, "InfPath")
    ;Inf-Section
    $retArray[$counter][12] = RegRead($Mainkey & "\SYSTEM\CurrentControlSet\Control\Class\" & $temp, "InfSection")
    EndIf
    $j = $j + 1
    WEnd

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

    $i = $i + 1
    WEnd
    ReDim $retArray[$counter+1][13]
    $retArray[0][0] = $counter
    Return $retArray
    EndFunc

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

    #Include <String.au3>
    #include <array.au3>

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

    $test = _GetDisplays()
    _ArrayDisplay($test)

    [/autoit]
    • Offizieller Beitrag

    Hallo,

    vllt. solltest du die API-Funktionen von Windows verwenden.

  • Bitboy
    Auch der Gerätemanager zeigt 5 Bildschirme an (als "Plug and Play-Monitor")

    • Offizieller Beitrag

    Ich hätte gern:
    - Hersteller
    - Modell
    - akt. Auflösung
    - max. Auflösung
    - Position bei mehreren Monitoren

    Das Ganze nicht nur für den primären Monitor, sondern für alle momentan angeschlossenen.
    Und damit es nicht zu leicht ;) wird, auch noch mit allen Windows-Versionen kompatibel.
    Das ist verdammt kompliziert, weil Microsoft von Version zu Version die Reg-Einträge verändert hat. ?(
    Ich vergleiche hier schon die Registries von drei Rechnern:
    WinXP mit 1 Monitor (analog),
    WinXP mit 2 Monitoren (analog und Notebook-Display)
    und Win7 mit 2 Monitoren (beide per DVI).

  • Also, ich bin bis jetzt soweit:

    Angefangen wird im Schlüssel
    HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\VIDEO
    Da werden alle Devices ausgelesen. Die Devicenummer gibt dabei auch die Monitornummer an. In dem String steht der Schlüssel wo es weiter geht. In meinem Beispiel \REGISTRY\Machine\System\ControlSet002\Services\ialm\Device0. Dieser Schlüssel hat einen Unterschlüssel mit dem Namen "VolatileSettings". In diesem ist wiederum ein Reg_Binary, dass den Pfad zu einem PCI Device angibt (PCI_VEN....).
    Den sucht man jetzt unter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI heraus. Da gibt es einen Unterschlüssel und darin den String "ParentIDPrefix". ParentIDPrefix gibt den ersten Teil des "Monitornamens" an der unter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY zu finden ist. (aktiv sind alle Monitore die den Unterschlüssel "Control" besitzen, Hier finden sich auch Hersteller und Modell). Um den 2. Teil des "Monitornamens zu finden, folgt man dem oben fett geschriebenen Schlüssel nur, dass man als Hauptschlüssel "HKEY_Current_Config" nimmt. In meinem Beispiel: HKEY_CURRENT_CONFIG\System\CurrentControlSet\Services\iAlm\Device0. (In diesem Schlüssel steht die aktuelle Auflösung, Position usw). Dieser Schlüssel hat einen oder mehr Unterschlüssel die mit "Mon" beginnen, gefolgt von einer Zahl. Der "unterste" Schlüssel SCHEINT ebenfalls die aktuelle Auflösung usw zu beinhalten. Die Zahl des Schlüssels ist der 2. Teil des Monitornamens unter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY... Der Name besteht noch aus vier weiteren Ziffern getrennt von einem &, also &zz&zz. Wo dieser letzte Teil herkommt weiß ich allerdings nicht. Wäre aber ganz wichtig zu wissen weil sich der Monitorname teilweise nur durch diese letzten 2 Zahlengruppen unterscheidet.

    In WinXP SP3 scheint es ebenfalls unter dem Schlüssel
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel\Settings\Video eine verbindung zwischen den Geräten zu geben (Mein letztes Script geht diesen Weg) dort tauchen PCI-Device und die ID des Monitortreibers auf. Allerdings steht in dem Schlüssel hinter der TreiberID auch noch eine mit Komma abgetrennte Zahl, wie man nun wieder auf die Zahl kommt weiß ich nicht...

    Ich hoffe, das war einigermaßen verständlich, einfach mal in der Registry nachverfolgen.
    Wenn man jetzt noch wüsste wie sich die letzten 2 Zahlen des "Monitornamens" zusammensetzen könnte man den Algo programmieren und es muss einen Weg geben. Im Gerätemanager kann man schließlich bei den Eigenschaften der Grafikkarte "Bussverhältnisse" anzeigen lassen (= Pfad in der Registry zum angeschlossenen Monitor)

    2 Mal editiert, zuletzt von Bitboy (23. Dezember 2009 um 20:20)