AutoIT - Multidesktop Unterstützung?

  • Hey Com,

    hab da mal ne Frage. Das Problem ist ganz einfach erklärt, ich möchte auslesen wieviel Monitore an den PC angeschlossen sind, welche Ausmasse sie haben, und wo sie liegen (z.b. liegt Desktop 2 rechts neben Desktop 1). Ich denke das wird man irgendwie über irgendeine DLL auslesen können, aber da kenn ich mich jetz nich so aus ;) Und die beiden Makros @DesktopHeight und @DesktopWidth bringen ja jetzt nur Daten über den Haupt-Monitor. Optimal wäre es noch, wenn ich noch die Farbtiefe und die Frequenz der zusätzlichen Bildschirme auslesen könnte (passend zu @DesktopRefresh und @DesktopDepth).

    Ryan

  • Hmm, danke für den Tipp, ich hab das mal versucht. Allerdings erkennt er bei mir nur den Hauptbildschirm, aber nicht meinen 2. :/

    [autoit]

    #include <CompInfo.au3>
    #include <Array.au3>

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

    Dim $mon

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

    _ComputerGetMonitors($mon)

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

    _ArrayDisplay($mon)

    [/autoit]
    • Offizieller Beitrag

    @GeneralKaboom: Das funktioniert auch nicht. Hab's bei mir getestet (2 Monitore).

    Ich hatte mal eine Funktion geschrieben, die zumindest unter Vista/Win7 die entsprechende Werte liefert:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $aMonitor = _CI_GetMonitor()
    _ArrayDisplay($aMonitor)

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

    Func _CI_GetMonitor()
    Local $iCount = 0, $sHKLM, $sDeviceVideo, $iMaxObjectNumber, $sVideo, $sTmp, $sVideoID, $sUnitedVideo, $sMfg, $sDeviceDesc, $sDPMS, $sDriver, $x, $y, $xRes, $yRes, $sMaxRes
    Local $sRecent
    Local $aMonitor[$iCount + 1][6] = [['Hersteller:', 'Modell:', 'DPMS-Untersützung:', 'Position (x, y):', 'akt. Auflösung:', 'max. Auflösung:']]
    $sHKLM = 'HKEY_LOCAL_MACHINE'
    If @OSArch <> 'X86' Then $sHKLM &= '64'
    Switch @OSVersion
    Case 'WIN_VISTA', 'WIN_7'
    $iCount = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\services\monitor\Enum', 'Count')
    ReDim $aMonitor[$iCount + 1][6]
    For $i = 1 To $iCount
    $sDisplay = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\services\monitor\Enum', $i-1)
    $sMfg = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sDisplay, 'Mfg')
    $sMfg = StringRegExpReplace($sMfg, '.+;(.+)', '$1')
    $aMonitor[$i][0] = $sMfg
    $sDeviceDesc = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sDisplay, 'DeviceDesc')
    $sDeviceDesc = StringRegExpReplace($sDeviceDesc, '.+;(.+)', '$1')
    $aMonitor[$i][1] = $sDeviceDesc
    $sDPMS = Number(String(RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sDisplay & '\Device Parameters', 'DPMS')))
    $aMonitor[$i][2] = StringMid('NeinJa', $sDPMS * 4 + 1, 4)
    $sDriver = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sDisplay, 'Driver')
    $sMaxRes = String(RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Control\Class\' & $sDriver, 'MaxResolution'))
    $sMaxRes = StringReplace($sMaxRes, ',', ' x ')
    $aMonitor[$i][5] = $sMaxRes
    $sRecent = RegEnumKey($sHKLM & '\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Connectivity', 1)
    $sRecent = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Connectivity\' & $sRecent, 'Recent')
    Local $sConfiguration = '', $j = 0
    Do
    $j += 1
    $sConfiguration = RegEnumKey($sHKLM & '\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration', $j)
    Until StringInStr($sConfiguration, $sRecent) = 1
    $sConfiguration = $sHKLM & '\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration\' & $sConfiguration
    $x = Number(String(RegRead($sConfiguration & '\' & StringRight('0' & $i-1, 2), 'Position.cx')))
    If $x > 2 ^ 31 Then $x = -BitXOR($x, 0xffffffff)

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

    $y = Number(String(RegRead($sConfiguration & '\' & StringRight('0' & $i-1, 2), 'Position.cy')))
    If $y > 2 ^ 31 Then $y = -BitXOR($y, 0xffffffff)

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

    $xRes = Number(String(RegRead($sConfiguration & '\' & StringRight('0' & $i-1, 2), 'PrimSurfSize.cx')))
    If $xRes > 2 ^ 31 Then $xRes = -BitXOR($xRes, 0xffffffff)

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

    $yRes = Number(String(RegRead($sConfiguration & '\' & StringRight('0' & $i-1, 2), 'PrimSurfSize.cy')))
    If $yRes > 2 ^ 31 Then $yRes = -BitXOR($yRes, 0xffffffff)

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

    $aMonitor[$i][3] = $x & ', ' & $y
    $aMonitor[$i][4] = $xRes & ' x ' & $yRes

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

    Next
    Return SetError(0, 0, $aMonitor)
    Case Else
    ; Unterstützung für XP funktioniert nicht
    Return SetError(1, 0, 0)
    EndSwitch
    EndFunc ;==>_CI_GetMonitor

    [/autoit]


    Allerdings gibt es diese Registrywerte bei den Windowsversionen vor Vista nicht, deshalb keine XP-Unterstützung.
    Ich hatte ziemlich lange in der Registry gesucht, aber unter XP habe ich nichts vergleichbares gefunden.