Und woher kommt die max. Auflösung beim analog angeschlossenen CRT?
GetMonitor-Funktion testen
-
- [ offen ]
-
Oscar -
20. Dezember 2009 um 16:08 -
Geschlossen -
Erledigt
-
-
- Offizieller Beitrag
Da habe ich einen Verweis auf den Key gefunden. Die max. Auflösung müßte unter Vista/Win7 jetzt immer stimmen.
Nur die Position/akt. Auflösung ist eigentlich "geraten". Da habe ich noch keinen Verweis gefunden. -
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
//EDIT: Juhuuuu Post #800!
-
- Offizieller Beitrag
Verdammt! Gibt es da auch noch Unterschiede zwischen Vista und Win7?
Der von Dir beschriebene Schlüssel liefert bei mir (Win7, 64Bit) völlig falsche Werte:
autoit.de/wcf/attachment/7042/unter Win7 sieht das so aus:
autoit.de/wcf/attachment/7043/ -
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];####################################################################
[/autoit] [autoit][/autoit] [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, $DriverFunc _GetDisplays()
[/autoit] [autoit][/autoit] [autoit]
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$j = 1
[/autoit] [autoit][/autoit] [autoit]
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],
;Aktuelle Auflösung Y (Höhe)
$retArray[$counter][3] = StringStripWS($CurResArr[2],
;Aktuelle Bildwiederholrate (Hz)
$retArray[$counter][4] = StringStripWS(StringReplace($CurResArr[3],"Hz",""),
;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#Include <String.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <array.au3>$test = _GetDisplays()
[/autoit]
_ArrayDisplay($test) -
- Offizieller Beitrag
Der eine RegistryPfad allein reicht nicht aus, um alle Infos einzulesen:
autoit.de/wcf/attachment/7056/Das ist ja mein Problem. Wenn dort alle Infos stehen würden, würde es diesen Thread gar nicht geben.
-
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? -
- Offizieller Beitrag
Bitboy: Unter Win7 gibt es den von Dir geposteten Reg-Pfad gar nicht mehr.
-
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];####################################################################
[/autoit] [autoit][/autoit] [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, $DriverFunc _GetDisplays()
[/autoit] [autoit][/autoit] [autoit]
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;32 / 64 Bit Registryschlüssel festlegen
[/autoit] [autoit][/autoit] [autoit]
If @OSArch = "X86" Then
$Mainkey = "HKEY_LOCAL_MACHINE"
Else
$Mainkey = "HKEY_LOCAL_MACHINE64"
EndIf;Anzahl und DeviceID der VideoDevices bestimmen
[/autoit] [autoit][/autoit] [autoit]
$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
NextReDim $VidDevArr[$counter + 1][2]
[/autoit] [autoit][/autoit] [autoit]
$VidDevArr[0][0] = $counter
_ArrayDisplay($VidDevArr)
$i = 1
$j = 1
$counter = 0While 1
[/autoit] [autoit][/autoit] [autoit]
$enumkey1 = RegEnumKey($Mainkey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY", $i)
If @error <> 0 then ExitLoop$j = 1
[/autoit] [autoit][/autoit] [autoit]
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 = $VidDevArr[0][0] to 0 step -1
[/autoit] [autoit][/autoit] [autoit]
$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],
;Aktuelle Auflösung Y (Höhe)
$retArray[$counter][3] = StringStripWS($CurResArr[2],
;Aktuelle Bildwiederholrate (Hz)
$retArray[$counter][4] = StringStripWS(StringReplace($CurResArr[3],"Hz",""),
;MsgBox(0, $MonitorID & ":" & $MonDriver & ",0", $CurRes);Farbtiefe
[/autoit] [autoit][/autoit] [autoit]
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;Maximale Auflösung
[/autoit] [autoit][/autoit] [autoit]
$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
[/autoit] [autoit][/autoit] [autoit]
WEnd
ReDim $retArray[$counter+1][13]
$retArray[0][0] = $counter
Return $retArray
EndFunc#Include <String.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <array.au3>$test = _GetDisplays()
[/autoit]
_ArrayDisplay($test) -
- Offizieller Beitrag
Unter Win7 kommt damit das Gleiche raus, wie mein Screenshot bei Post #28.
-
- 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") -
Bernd
Hab ich auch schon vorgeschlagen.
Position und Auflösung bekommt man damit ja auch problemlos.
Auch den primären Monitor.
Aber Oscar will ja noch paar Infos welche man damit nicht so leicht bekommt. -
- Offizieller Beitrag
Ich hätte gern:
- Hersteller
- Modell
- akt. Auflösung
- max. Auflösung
- Position bei mehreren MonitorenDas 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) -