EDID / DDC Daten direkt vom Monitor lesen

  • Es sind ja nicht nur die Chefs...
    Ich könnte so eine Funktion auch gut in 2-3 anderen AutoIt Programmen gebrauchen.
    Und da die Benutzer der Programme diverse Kriterien der Monitore überprüfen sollen (auf ganz speziellen und spezifischen Hintergrundbildern) würde das offene Fenster von softMCCS nur stören!!!

    Wenn jemand dazu eine Idee hat, oder den Code doch irgendwie übersetzen kann, bin ich dankbar.
    Ansonsten muss ich mich damit abfinden, die 8'000 Monitore manuell zu prüfen!
    Aber mal schauen!

  • Hier habe ich von einem Kollegen noch was bekommen.
    Eine DLL und eine Hilfe.

    Es ist von einem anderen Programm. Allerdings weiss ich nicht, wie es mit der Lizenz aussieht! Der Kollege hat das Programm gekauft......
    Falls ich das hier nicht posten darf, dann sollen die Mods die Anhänge löschen!

    Ansonsten: Vielleicht kann ja jemand mit dieser DLL was anfangen!
    Veronesi

  • Hallo Progandy,

    vielen Dank.
    Das Tool habe ich schon getestet.
    Ich glaube, es liesst wirklich nur aus der Registry!

    Zudem funktioniert es leider bei meinem Monitortyp nicht.

    ==> Failed to extract the EDID record. <==

    Sehr schade. Danke trotzdem!

  • Der Rivatuner sollte auch so eine Funktion haben. Eventuell kansnt du die ja nutzen.

  • Den kenne ich nicht!
    Ich schaue mir den mal an. Aber ein kurzer Blick auf der Homepage lässt mich vermuten, dass es wohl eher schwieriger wird, dies automatisiert und ohne Installation einzusetzen.

    Doch ich schaue mir das morgen oder übermorgen mal an!

  • So, leider habe ich keine mögliche Lösung gefunden.
    Auch im softMCCs Forum habe ich einen negativen Bescheid bezüglich einer ansteuerbaren DLL bekommen.

    Das ist sehr schade!

  • Hier habe ich noch einen älteren Code gefunden, der EDID Daten lesen soll. 3. Post!

    Kann mir jemand sagen, ob das mit dem klappen könnte und kann den vielleicht sogar jemand in AutoIt übersetzen??????

    Veronesi

  • Habe auch schon versucht an die Daten zu gelangen. Hab's daber dann aufgegeben, da sich jemand gefunden hat, der die Daten händisch reinklopft ;)
    Aber vielleicht helfen Dir die threads im englischen Forum:
    Get Monitor Information Reading WMI with Monitor Model and Serial
    Simple monitor serial number retriever

    Eine andere Idee: Da Windows ja eigentlich die gewünschten Infos in die Registry pinselt, dort aber nach einiger Zeit ein Sammelsurium aller jemals angehängter Monitore zu finden ist, könnte man vielleicht die Keys löschen, neu booten und dann sollte da nur mehr der aktuelle Monitor zu finden sein. Dann die EDID Daten aus der Registry auswerten.

  • Hallo zusammen!

    So, ich habe nun eine Lösung, welche für mich funktioniert, und mit welcher ich die 8'000 Monitore testen kann.
    Leider werden die EDID Daten nicht direkt vom Monitor gelesen. Das wäre das schönste!

    Aber mit dem devcon.exe Tool von Microsoft kann ich doch wenigstens ein rescan der PnP Hardware durchführen und mir
    dann alle Hardware-IDs von den angeschlossenen Monitoren zurückgeben lassen.

    In diesen steht jeweils auch der Registry Schlüssel! (z.B. DISPLAY\HWP286E\5&F5BF76&0&UID41943312)
    Alles was zwischen diesen beiden Backslash steht, ist der Herstellername.
    Wenn die EDID Daten nicht gelesen werden konnte, steht dort DEFAULT_MONITOR

    Da ich (momentan) nur wissen muss, ob EDID Daten empfangen wurden und wer der Hersteller ist, reicht mir das aus!
    In meinen Test's hat diese Funktion immer den richtigen Wert zurückgeliefert - auch bei denen, bei welchen softMCCs versagt oder extrem lange gebraucht hat.

    Die Funktion gibt ein Array zurück.
    Index 0 = Anzahl gefundene Monitore
    Index 1 - .... = jeweiliger Registry Key.

    Dieses Array muss man dann nur noch nach DEFAULT_MONITOR durchsuchen, dann weiss man, ob von allen die EDID Daten gesendet wurden, oder nicht!
    Die Hersteller ID kann man dann auch herausparsen!
    Enjoy!

    Spoiler anzeigen
    [autoit]


    #cs
    ==================================================================================
    Function: _GetPnPScreens()
    Description: Rescan PnP Hardware and get all Registry Keys from PnP Screens
    Parameter(s): -

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

    Return Value(s): On Success - Return Array with registry keys, @ERROR = 0
    On Failure: - Return 0, @ERROR <> 0
    Author(s): Veronesi
    ==================================================================================
    #ce
    #RequireAdmin
    #include-once

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

    Func _GetPnPScreens()
    Local $PID, $Timer, $Read, $aTmp, $aRead[1] = [0], $iGetPnPScreens
    Local Const $Timeout = 5000

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

    If Not FileExists(@TempDir & "\devcon.exe") Then FileInstall("S:\UE_Std\TestPC\Tools\DevCon\i386\devcon.exe", @TempDir & "\devcon.exe", 1)
    RunWait('"' & @ComSpec & '" /c ' & @TempDir & '\devcon.exe rescan', @TempDir, @SW_HIDE) ;Rescan for new PnP hardware
    $PID = Run('"' & @ComSpec & '" /c ' & @TempDir & '\devcon.exe hwids Monitor*', @TempDir, @SW_HIDE, 0x2) ;Get IDs from all screens

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

    $Timer = TimerInit()
    While 1
    $Read &= StdoutRead($PID)
    If @error Or TimerDiff($Timer) > $Timeout Then ExitLoop
    Sleep(10)
    WEnd
    #cs
    $Read =
    DISPLAY\HWP286E\5&F5BF76&0&UID41943312
    Name: PnP-Monitor (Standard)
    Hardware ID's:
    MONITOR\HWP286E
    Compatible ID's:
    *PNP09FF
    DISPLAY\ENC2012\5&F5BF76&0&UID41943313
    Name: PnP-Monitor (Standard)
    Hardware ID's:
    MONITOR\ENC2012
    Compatible ID's:
    *PNP09FF
    2 matching device(s) found.
    #ce
    $aTmp = StringSplit($Read, @CRLF) ;Split into array
    For $iGetPnPScreens = 1 To UBound($aTmp) - 1
    If StringInStr($aTmp[$iGetPnPScreens], "DISPLAY\") Then ;Take only the registry string!
    $aTmp[$iGetPnPScreens] = StringStripWS($aTmp[$iGetPnPScreens], 8) ;Strip ALL spaces in the correct registry path (if any found)
    $aRead[0] += 1 ;Increment number of found screens
    ReDim $aRead[$aRead[0] + 1]
    $aRead[$aRead[0]] = $aTmp[$iGetPnPScreens]
    EndIf
    Next
    #cs
    When in registry path the string "DEFAULT_MONITOR" is found, then this monitor didn't sent any EDID datas!
    $aRead =
    [0] | 2
    [1] | DISPLAY\HWP286E\5&F5BF76&0&UID41943312
    [2] | DISPLAY\ENC2012\5&F5BF76&0&UID41943313
    #ce
    If $aRead[0] = 0 Then Return SetError(1, 1, 0)
    Return $aRead
    EndFunc ;==>_GetPnPScreens

    [/autoit]


    Gruss Veronesi

  • Manchmal ist die Lösung so nah.....
    Hier ein zweites Script, welches ohne die externe devcon.exe auskommt und auch keine Admin-Rechte benötigt und erst noch schneller ist :)
    Ansonsten die gleichen Einschränkungen / Features, wie die letzte UDF!

    Spoiler anzeigen
    [autoit]

    #cs
    ==================================================================================
    Function: _GetPnPScreens()
    Description: Rescan PnP Hardware and get all Registry Keys from PnP Screens
    Parameter(s): -

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

    Return Value(s): On Success - Return Array with registry keys, @ERROR = 0
    On Failure: - Return 0, @ERROR <> 0
    Author(s): Veronesi
    ==================================================================================
    #ce

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

    #include-once
    #include <WinAPI.au3>

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

    Func _GetPnPScreens()
    Local $aGPU[1] = [0]
    Local $aScreens[1] = [0]
    Local $aEnumDisplayDevices
    Local $iDevNum = 0
    Local $iGPU
    ShellExecuteWait(@WindowsDir & "\System32\DisplaySwitch.exe", "/extend") ;Force Windows 7 to read all screens!

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

    While 1
    $aEnumDisplayDevices = _WinAPI_EnumDisplayDevices("", $iDevNum) ;Find all GPU controllers
    If $aEnumDisplayDevices[3] = 0 Then ExitLoop ;When Flag = 0 the end of all GPUs found
    If Not BitAND($aEnumDisplayDevices[3], 4) Then ;Only if this device is no pseudo device (virtual screen)
    If BitAND($aEnumDisplayDevices[3], 1) Then ;Only if this device is part of the desktop
    $aGPU[0] += 1 ;Increment number of GPUs found
    ReDim $aGPU[$aGPU[0] + 1]
    $aGPU[$aGPU[0]] = $aEnumDisplayDevices[1]
    EndIf
    EndIf
    $iDevNum += 1
    WEnd
    If Not IsArray($aGPU) Then Return SetError(1, 1, 0)

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

    $iDevNum = 0
    For $iGPU = 1 To $aGPU[0] ;For each GPU... find all screens
    While 1
    $aEnumDisplayDevices = _WinAPI_EnumDisplayDevices($aGPU[$iGPU], $iDevNum)
    If $aEnumDisplayDevices[3] = 0 Then ExitLoop ;When Flag = 0 the end of all screens of this GPU found
    If Not BitAND($aEnumDisplayDevices[3], 4) Then ;Only if this device is no pseude device (virtual screen)
    If BitAND($aEnumDisplayDevices[3], 1) Then ;Only if this device is part of the desktop
    $aScreens[0] += 1 ;Increment number of screens found
    ReDim $aScreens[$aScreens[0] + 1]
    $aScreens[$aScreens[0]] = $aEnumDisplayDevices[4]
    EndIf
    EndIf
    $iDevNum += 1
    WEnd
    $iDevNum = 0
    Next
    If Not IsArray($aScreens) Then Return SetError(2, 2, 0)

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

    For $iDevNum = 1 To $aScreens[0]
    $aScreens[$iDevNum] = StringReplace(StringTrimLeft($aScreens[$iDevNum], 4), "#", "\")
    Next
    Return $aScreens
    EndFunc ;==>_GetPnPScreens

    [/autoit]

    Gruss Veronesi