gibt es eine Möglichkeit, das sich das Splash-Fenster automatisch an die Schriftgröße anpasst?
Also gerade so groß ist das der Text hineinpasst?
Beiträge von Bitboy
-
-
Etwas Offtopic aber ich hab mal gelesen, dass OpenOffice die wiki-foratierung beherscht. weiß einer wie zuverlässig das funktioniert? und wie man bestehende wikibooks-Seiten laden kann?
Das würde mein formatierungsproblem schonmal teilweise lösen. Dazu hab ich duden korrektor installiert, das heißt die rechtschreibeprüfung wäre in einem mit durch.Edit:
Achso, meine vorschläge finden sich dann jeweils in den diskussionsseiten -
Hab leider nicht soviel Zeit (wie immer...) würde aber ab und zu korrektur lesen und vllt kleinere änderungen machen. (kenn mich allerdings gar nciht mit dem fomatierungssystem aus...)
Bei den Schleifen fehlt noch for...each brauch man zwar selten, sollte aber wegen der wmi später schonmal angesprochen werden.
unter professionelles würde ich noch codeoptimierungen setzen
falls jemand einen wikipedia account hat: der artikel ist veraltet
-
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. -
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... -
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];####################################################################
[/autoit] [autoit][/autoit] [autoit][/autoit] [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
;#
;####################################################################Func _Get_Displays()
[/autoit] [autoit][/autoit] [autoit]
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;Hauptschlüssel entsprechd der Architektur
[/autoit] [autoit][/autoit] [autoit]
If @OSArch <> "X86" Then
$MainKey = "HKLM64"
$ConfigKey = "HKCC64"
Else
$MainKey = "HKLM"
$ConfigKey = "HKCC"
EndIf$DeviceCount = RegRead($MainKey & "\HARDWARE\DEVICEMAP\VIDEO", "MaxObjectNumber")
[/autoit] [autoit][/autoit] [autoit]For $i = 0 To $DeviceCount
[/autoit] [autoit][/autoit] [autoit]
;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)$tmpStr = _Internal_HexToStr($tmpStr)
[/autoit] [autoit][/autoit] [autoit]$tmpStr = StringReplace($tmpStr, "\??\", "")
[/autoit] [autoit][/autoit] [autoit]
$tmpStr = StringReplace($tmpStr, "#", "\")
$tmpStr = StringLeft($tmpStr, StringInStr($tmpStr, "\{", 0, -1)-1)$DeviceArr[$DCounter][0] = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\" & $tmpStr, "ParentIdPrefix")
[/autoit] [autoit][/autoit] [autoit]
$tmpStr2 = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\" & $tmpStr, "LocationInformation")
$tmpStr2 = StringRegExpReplace($tmpStr2, "[^0-9,]", "")
$tmpArr = StringSplit($tmpStr2, ",");PCI-BUS = 1; Gerät = 2; Funktion = 3
[/autoit] [autoit][/autoit] [autoit]
For $j = 1 To $tmpArr[0]
$DeviceArr[$DCounter][$j] = $tmpArr[$j]
NextIf $DeviceArr[$DCounter][3] <> 0 Then $DeviceArr[$DCounter][3] = $DeviceArr[$DCounter][3] + 1
[/autoit] [autoit][/autoit] [autoit];Dazugehörige Informationen ermitteln (Auflösung..)
[/autoit] [autoit][/autoit] [autoit]
$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;_ArrayDisplay($DeviceArr)
[/autoit] [autoit][/autoit] [autoit]
Next$DeviceArr[0][0] = $DCounter
[/autoit] [autoit][/autoit] [autoit]
ReDim $DeviceArr[$DCounter+1][14];Prüfung der real angeschlossenen Monitore (erfoderlich für einige Grafikkarten z.B INTEL)
[/autoit] [autoit][/autoit] [autoit]
RegRead($ConfigKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY", "")
If @error <> 1 Then
$MonKey = $ConfigKey
Else
$MonKey = $MainKey
EndIf;Monitore ermitteln
[/autoit] [autoit][/autoit] [autoit]
$i = 1
While 1
$enum1 = RegEnumKey($MonKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY", $i)
If @error Then ExitLoop$j = 1
[/autoit] [autoit][/autoit] [autoit]
While 1
$enum2 = RegEnumKey($MonKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enum1, $j)
If @error Then ExitLoopRegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enum1 & "\" & $enum2 & "\Control", "")
[/autoit] [autoit][/autoit] [autoit]
;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,
; "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")$MonArr[$MonCounter][9] = StringLeft($tmpStr2, StringInStr($tmpStr2, ",")-1)
[/autoit] [autoit][/autoit] [autoit]
$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$j = $j + 1
[/autoit] [autoit][/autoit] [autoit]
WEnd$i = $i + 1
[/autoit] [autoit][/autoit] [autoit]
WEnd;Arrays zusammenführen
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To $DeviceArr[0][0]
;ParentID prüfen
$tmpStr = $DeviceArr[$i][0]For $j = 1 To $MonCounter
[/autoit] [autoit][/autoit] [autoit]
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$retArr[0][0] = $retCounter
[/autoit] [autoit][/autoit] [autoit]
Redim $retArr[$retCounter+1][16]
;MsgBox(0, "debug", $tmpStr)
;_ArrayDisplay($MonArr)
;_ArrayDisplay($DeviceArr)
Return $retArr
EndFuncFunc _Internal_HexToStr($HexString)
[/autoit] [autoit][/autoit] [autoit]
Local $i, $Len, $retStr, $tmpStr$HexString = StringRight($HexString, StringLen($HexString) - 2)
[/autoit] [autoit][/autoit] [autoit]
$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;TestCode
[/autoit]
#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) -
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.htmleuchtet mir trotzdem nicht ein warum das so gemacht wurde. und mein Problem löst es auch nicht...
-
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.
-
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];####################################################################
[/autoit] [autoit][/autoit] [autoit][/autoit] [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
;#
;####################################################################Func _Get_Displays()
[/autoit] [autoit][/autoit] [autoit]
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;Hauptschlüssel entsprechd der Architektur
[/autoit] [autoit][/autoit] [autoit]
If @OSArch <> "X86" Then
$MainKey = "HKLM64"
$ConfigKey = "HKCC64"
Else
$MainKey = "HKLM"
$ConfigKey = "HKCC"
EndIf$DeviceCount = RegRead($MainKey & "\HARDWARE\DEVICEMAP\VIDEO", "MaxObjectNumber")
[/autoit] [autoit][/autoit] [autoit]For $i = 0 To $DeviceCount
[/autoit] [autoit][/autoit] [autoit]
;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)$tmpStr = _Internal_HexToStr($tmpStr)
[/autoit] [autoit][/autoit] [autoit]$tmpStr = StringReplace($tmpStr, "\??\", "")
[/autoit] [autoit][/autoit] [autoit]
$tmpStr = StringReplace($tmpStr, "#", "\")
$tmpStr = StringLeft($tmpStr, StringInStr($tmpStr, "\{", 0, -1)-1)$DeviceArr[$DCounter][0] = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\" & $tmpStr, "ParentIdPrefix")
[/autoit] [autoit][/autoit] [autoit]
$tmpStr2 = RegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\" & $tmpStr, "LocationInformation")
$tmpStr2 = StringRegExpReplace($tmpStr2, "[^0-9,]", "")
$tmpArr = StringSplit($tmpStr2, ",");PCI-BUS = 1; Gerät = 2; Funktion = 3
[/autoit] [autoit][/autoit] [autoit]
For $j = 1 To $tmpArr[0]
$DeviceArr[$DCounter][$j] = $tmpArr[$j]
NextIf $DeviceArr[$DCounter][3] <> 0 Then $DeviceArr[$DCounter][3] = $DeviceArr[$DCounter][3] + 1
[/autoit] [autoit][/autoit] [autoit];Dazugehörige Informationen ermitteln (Auflösung..)
[/autoit] [autoit][/autoit] [autoit]
$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;_ArrayDisplay($DeviceArr)
[/autoit] [autoit][/autoit] [autoit]
Next$DeviceArr[0][0] = $DCounter
[/autoit] [autoit][/autoit] [autoit]
ReDim $DeviceArr[$DCounter+1][14];Monitore ermitteln
[/autoit] [autoit][/autoit] [autoit]
$i = 1
While 1
$enum1 = RegEnumKey($MainKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY", $i)
If @error Then ExitLoop$j = 1
[/autoit] [autoit][/autoit] [autoit]
While 1
$enum2 = RegEnumKey($MainKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enum1, $j)
If @error Then ExitLoopRegRead($MainKey & "\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enum1 & "\" & $enum2 & "\Control", "")
[/autoit] [autoit][/autoit] [autoit]
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")$MonArr[$MonCounter][8] = StringLeft($tmpStr2, StringInStr($tmpStr2, ",")-1)
[/autoit] [autoit][/autoit] [autoit]
$MonArr[$MonCounter][9] = StringRight($tmpStr2, StringLen($tmpStr2) - StringInStr($tmpStr2, ","))
EndIf$j = $j + 1
[/autoit] [autoit][/autoit] [autoit]
WEnd$i = $i + 1
[/autoit] [autoit][/autoit] [autoit]
WEnd;Arrays zusammenführen
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To $DeviceArr[0][0]
;ParentID prüfen
$tmpStr = $DeviceArr[$i][0]For $j = 1 To $MonCounter
[/autoit] [autoit][/autoit] [autoit]
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$retArr[0][0] = $retCounter
[/autoit] [autoit][/autoit] [autoit]
Redim $retArr[$retCounter+1][14]
;MsgBox(0, "debug", $tmpStr)
;_ArrayDisplay($MonArr)
;_ArrayDisplay($DeviceArr)
Return $retArr
EndFuncFunc _Internal_HexToStr($HexString)
[/autoit] [autoit][/autoit] [autoit]
Local $i, $Len, $retStr, $tmpStr$HexString = StringRight($HexString, StringLen($HexString) - 2)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$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#include <array.au3>
[/autoit]
$test = _Get_Displays()
_ArrayDisplay($test) -
Da schließe ich mich gerne an: Frohe Weihnachten wünsche ich euch allen.
-
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.
-
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) -
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) -
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? -
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.
-
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) -
Son zufall, hab vor 2 Tagen selber an sowas gearbeitet, kam aber nicht sehr weit (Wusste nicht wie man rausbekommt ob der Monitor Primary oder Secondary ist)
Hier ist mal mein Code, Erkannt werden alle Monitore die auch im Gerätemanager angezeigt werden
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] = Maximale Auflösung X (Breite)
;# Array[n][3] = Maximale Auflösung Y (Höhe)
;# Array[n][4] = Treiberversion
;# Array[n][5] = Treiberdatum, Format: MM-DD-YYYY
;# Array[n][6] = *.inf-Datei des Treibers
;# Array[n][7] = *.inf-Sektion Treibers
;#
;# Autor: Bitboy
;####################################################################
Func _GetDisplays()
Local $i=1, $j=1, $counter=0, $enumkey1, $enumkey2, $retArray[64][8], $resArr, $temp
While 1
$enumkey1 = RegEnumKey("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY", $i)
If @error <> 0 then ExitLoop$j = 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
While 1
$enumkey2 = RegEnumKey("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1, $j)
If @error <> 0 then ExitLoop
RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1 & "\" & $enumkey2 & "\Control", "")
If @error <> 1 Then
$counter = $counter + 1
$retArray[$counter][0] = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1 & "\" & $enumkey2, "Mfg")
$retArray[$counter][1] = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1 & "\" & $enumkey2, "DeviceDesc")
$temp = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\" & $enumkey1 & "\" & $enumkey2, "Driver")
$resArr = StringSplit(RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\" & $temp, "MaxResolution"), ",")
$retArray[$counter][2] = $resArr[1]
$retArray[$counter][3] = $resArr[2]
$retArray[$counter][4] = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\" & $temp, "DriverVersion")
$retArray[$counter][5] = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\" & $temp, "DriverDate")
$retArray[$counter][6] = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\" & $temp, "InfPath")
$retArray[$counter][7] = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\" & $temp, "InfSection")
EndIf
$j = $j + 1
WEnd
$i = $i + 1
WEnd
ReDim $retArray[$counter+1][8]
$retArray[0][0] = $counter
Return $retArray
EndFunc#include <array.au3>
[/autoit]
$test = _GetDisplays()
_ArrayDisplay($test) -
Die Anzahl der Kerne lässt sich auch so bestimmen:
[autoit]Func GetCPUCores()
[/autoit][autoit][/autoit][autoit]
Local $S_SYSTEM_INFO = DllStructCreate("ushort dwOemId;short wProcessorArchitecture;dword dwPageSize;ptr lpMinimumApplicationAddress;" & _
"ptr lpMaximumApplicationAddress;long_ptr dwActiveProcessorMask;dword dwNumberOfProcessors;dword dwProcessorType;dword dwAllocationGranularity;" & _
"short wProcessorLevel;short wProcessorRevision")
Local $err;Anzahl der CPUs bestimmen
[/autoit][autoit][/autoit][autoit]
$err = DllCall("Kernel32.dll", "none", "GetSystemInfo", "ptr",DllStructGetPtr($S_SYSTEM_INFO))If @error Or Not IsArray($err) Then ;Fehler beim Dll Aufruf
[/autoit][autoit][/autoit][autoit]
Return -1
Else
Return DllStructGetData($S_SYSTEM_INFO, "dwNumberOfProcessors")
EndIfEndFunc
[/autoit] -
Hab mich auch mal daran versucht.
Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. -
Danke für den Tipp! Hatte leider keine Möglichkeit das zu testen. Werde ich aber noch so einbauen.