Win32_DesktopMonitor

  • Hallo zusammen,

    ich möchte gerne mit AutoIt diverse Informationen zu den angeschlossenen Bildschirmen auslesen. (Mehrere Monitore)
    Mit ein bisschen suchen bin ich auf diese Seite gestossen: MSDN

    Leider kenne ich mich in AutoIt überhaupt nicht aus, wie man eine DLL ansteuert. Da habe ich regelmässig Probleme. Ich kriege es einfach nicht hin.
    Könnte mir jemand helfen?

    Ich weiss einfach dass bei mir die Availability auf 3 stehen müsste.
    Zurückbekommen möchte ich von der Funktion den ConfigManagerErrorCode ob er korrekt initialisiert wurde, sowie den String von MonitorType

    Dazu benötigt man die Cimwin32.dll. Aber ich steh echt auf dem Schlauch, wie ich das auslesen könnte!

    Vielen Dank für Eure Hilfen!
    Veronesi

    Einmal editiert, zuletzt von veronesi (24. Juni 2010 um 13:30)

  • Dieser Beitrag endet leider im Januar mit mehr oder weniger dem Satz: "Ich geb's auf"...
    Und leider funktioniert das script von dort bei mir nicht auf allen Win7 PCs mit allen Grafikkarten. Das ist mein eigentliches Problem!

    Trotzdem danke für die Antwort.

    Das Tutorial werde ich gerne mal lesen. Aber ich habe nicht grosse Hoffnungen für mich. (Bin eigentlich kein Programmierer) Und ich habe noch nicht mal herausgefunden war für ein Datentyp der Rückgabewert hat.....

    Wäre um Hilfe echt froh und dankbar!
    Veronesi

  • So, mit diesem Script (aus dem Link welchen Du mir genannt hast) funktioniert es nun!
    Ich muss einfach vorher unter Windows 7 folgende Befehle ausführen:

    [autoit]

    ShellExecuteWait(@WindowsDir & "\System32\DisplaySwitch.exe", "/extend")

    [/autoit]


    Damit werden alle Bildschirme neu eingelesen.
    (Hintergrund: bei mir werden im laufenden Betrieb neue Bildschirme angeschlossen und gewechselt. Wäre dies nicht der Fall, würde das Script auch ohne diese Zeile funktionieren)

    Script:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $aMonitor = _CI_GetMonitor()
    $hFile = FileOpen(@ScriptDir & '\!Monitor-Info.txt', 2)
    If $hFile <> -1 Then
    For $i = 0 To UBound($aMonitor) - 1
    $save = ''
    For $j = 0 To UBound($aMonitor, 2) - 1
    $save &= $aMonitor[$i][$j] & ' *** '
    Next
    FileWriteLine($hFile, $save)
    Next
    FileClose($hFile)
    EndIf
    _ArrayDisplay($aMonitor)

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

    Func _CI_GetMonitor($strComputer = '.')
    Switch @OSVersion
    Case 'WIN_VISTA', 'WIN_7'
    Local $sX64 = '', $iCount, $sHKLM, $sTmp, $sMfg, $sDeviceDesc, $sDPMS, $sClassGUID, $sHardwareID
    If @OSArch <> 'X86' Then $sX64 = '64'
    $sHKLM = 'HKEY_LOCAL_MACHINE' & $sX64
    $iCount = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\services\monitor\Enum', 'Count')
    Local $aMonitor[$iCount + 1][6] = [['Hersteller:', 'Modell:', 'DPMS-Untersützung:', 'Position (x, y):', 'akt. Auflösung:', 'max. Auflösung:']]
    For $i = 1 To $iCount
    $sTmp = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\services\monitor\Enum', $i - 1)
    $sMfg = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sTmp, 'Mfg')
    $aMonitor[$i][0] = StringRegExpReplace($sMfg, '.+;(.+)', '$1')
    $sDeviceDesc = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sTmp, 'DeviceDesc')
    $aMonitor[$i][1] = StringRegExpReplace($sDeviceDesc, '.+;(.+)', '$1')
    $sDPMS = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sTmp & '\Device Parameters', 'DPMS')
    $aMonitor[$i][2] = StringMid('NeinJa', $sDPMS * 4 + 1, 4)
    $sClassGUID = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sTmp, 'ClassGUID')
    $sHardwareID = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sTmp, 'HardwareID')
    Local $iEnum = 0, $sTmpKey, $sMatchingDeviceId, $sConnectivity, $sRecent, $sMatchConfig, $j, $x, $y, $cx, $cy
    While True
    $sTmpKey = $sHKLM & '\SYSTEM\CurrentControlSet\Control\Class\' & $sClassGUID & '\' & StringRight('0000' & $iEnum, 4)
    $sMatchingDeviceId = RegRead($sTmpKey, 'MatchingDeviceId')
    If @error Then ExitLoop
    If $sMatchingDeviceId = $sHardwareID Then
    $aMonitor[$i][5] = StringReplace(RegRead($sTmpKey, 'MaxResolution'), ',', ' x ')
    $sConnectivity = RegEnumKey($sHKLM & '\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Connectivity', 1)
    $sRecent = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Connectivity\' & $sConnectivity, 'Recent')
    $j = 0
    Do
    $j += 1
    $sMatchConfig = RegEnumKey($sHKLM & '\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration\', $j)
    Until StringInStr($sMatchConfig, $sRecent) Or (@error <> 0)
    $sTmp = $sHKLM & '\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration\' & $sMatchConfig & '\' & StringRight('00' & $i - 1, 2)
    $x = Number(String(RegRead($sTmp, 'Position.cx')))
    If $x > 2 ^ 31 Then $x = -BitXOR($x, 0xffffffff)
    $y = Number(String(RegRead($sTmp, 'Position.cy')))
    If $y > 2 ^ 31 Then $y = -BitXOR($y, 0xffffffff)
    $cx = RegRead($sTmp, 'PrimSurfSize.cx')
    $cy = RegRead($sTmp, 'PrimSurfSize.cy')
    $aMonitor[$i][4] = $cx & ' x ' & $cy
    $aMonitor[$i][3] = $x & ', ' & $y
    ExitLoop
    EndIf
    $iEnum += 1
    WEnd
    Next
    Return $aMonitor
    Case Else
    Local $aReturn[2][8] = [[ _
    'Hersteller:', 'Modell:', 'Breite (Pixel):', 'Höhe (Pixel):', _
    'Pixel pro Inch (X):', 'Pixel pro Inch (Y):', 'Monitorgröße (ca.):', 'PNPDeviceID:']]
    Local $x = 0, $objWMIService, $colItems, $Output
    $objWMIService = ObjGet('winmgmts:\\' & $strComputer & '\root\cimv2')
    If Not IsObj($objWMIService) Then Return SetError(1, 0, 0)
    $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_DesktopMonitor', 'WQL', 0x30)
    If IsObj($colItems) Then
    For $objItem In $colItems
    $x += 1
    ReDim $aReturn[$x + 1][8]
    $aReturn[$x][0] = $objItem.MonitorManufacturer
    $aReturn[$x][1] = $objItem.Name
    $aReturn[$x][2] = $objItem.ScreenWidth
    $aReturn[$x][3] = $objItem.ScreenHeight
    $aReturn[$x][4] = $objItem.PixelsPerXLogicalInch
    $aReturn[$x][5] = $objItem.PixelsPerYLogicalInch
    $aReturn[$x][6] = Round($objItem.ScreenWidth / ($objItem.PixelsPerXLogicalInch / 2.54), 2) & _
    ' x ' & Round($objItem.ScreenHeight / ($objItem.PixelsPerYLogicalInch / 2.54), 2) & ' cm²'
    $aReturn[$x][7] = $objItem.PNPDeviceID
    Next
    EndIf
    Return $aReturn
    EndSwitch
    EndFunc ;==>_CI_GetMonitor

    [/autoit]

    Vielen Dank!