Bildschirmnummer gemäss "Windows Identify" bestimmen.

  • Hallo zusammen,

    das nachfolgende Script taucht immer wieder in diversen Foren auf - es ist also nicht von mir ;)

    Spoiler anzeigen
    [autoit]

    #include-once

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

    Func _GetMonitorInfo()
    ;Returns some informations about your screens
    ;Call: _GetMonitorInfo()
    ;Return: Array With
    ;[0][0] Nr of Monitors
    ;[1][0] X Resolution of Monitor 1
    ;[1][1] Y Resolution of Monitor 1
    ;[1][2] X Position of Monitor 1
    ;[1][3] Y Position of Monitor 1

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

    ;[2][0] X Resolution of Monitor 2
    ;[2][1] Y Resolution of Monitor 2
    ;[2][2] X Position of Monitor 2
    ;[2][3] Y Position of Monitor 2
    ;......

    Local $NrOfMonitors, $ResolutionX[32], $ResolutionY[32], $PositionX[32], $PositionY[32], $Ret
    Local $cbMonitorEnumProc = DllCallbackRegister("MonitorEnumProc", "ubyte", "ptr;ptr;ptr;int")

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

    If @error Then Return SetError(1, 0, False)
    Local $strctCount = DllStructCreate("uint Count;uint Width[12];uint Height[12];int left[12];int top[12]")
    If @error Then Return SetError(2, @error, False)
    Local $iCount

    DllStructSetData($strctCount, "Count", 0)

    $Ret = DllCall("User32.dll", "ubyte","EnumDisplayMonitors","ptr", 0,"ptr", 0, "ptr", DllCallbackGetPtr($cbMonitorEnumProc), "ptr", DllStructGetPtr($strctCount))
    If @error Or $Ret[0] = 0 Then Return SetError(3, @error, False)

    DllCallbackFree($cbMonitorEnumProc)

    $iCount = Int(DllStructGetData($strctCount, "Count"))

    Local $aMonitors[$iCount+1][4] = [[$iCount]]

    For $i = 1 To $iCount
    $aMonitors[$i][0] = Int(DllStructGetData($strctCount, "Width",$i))
    $aMonitors[$i][1] = Int(DllStructGetData($strctCount, "Height",$i))
    $aMonitors[$i][2] = Int(DllStructGetData($strctCount, "left",$i))
    $aMonitors[$i][3] = Int(DllStructGetData($strctCount, "top",$i))
    Next
    $strctCount = 0
    Return $aMonitors
    EndFunc

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

    Func MonitorEnumProc($hMonitor, $hdcMonitor, $lprcMonitor, $dwData)
    Local $strctRECT = DllStructCreate("long left;long top;long right;long bottom", $lprcMonitor)
    Local $strctCount = DllStructCreate("uint Count;uint Width[12];uint Height[12];int left[12];int top[12]", $dwData)
    Local $iNumber = DllStructGetData($strctCount, "Count")
    Local $Height = Int(DllStructGetData($strctRECT, "bottom"))-Int(DllStructGetData($strctRECT, "top"))
    Local $Width = Int(DllStructGetData($strctRECT, "right"))-Int(DllStructGetData($strctRECT, "left"))

    DllStructSetData($strctCount, "Width", $Width, $iNumber+1)
    DllStructSetData($strctCount, "Height", $Height, $iNumber+1)
    DllStructSetData($strctCount, "left", Int(DllStructGetData($strctRECT, "left")), $iNumber+1)
    DllStructSetData($strctCount, "top", Int(DllStructGetData($strctRECT, "top")), $iNumber+1)
    DllStructSetData($strctCount, "Count", $iNumber+1)
    Return True
    EndFunc

    [/autoit]

    Es gibt die Anzahl der Monitore, deren Auflöung und Position zurück.
    Das funktioniert auch wunderbar!

    Bisher habe ich jedoch immer gedacht, dass wenn ich $aMonitors[1][0] verwende, die X-Auflösung des 1. Monitors erhalte.
    Dies stimmte auch bis jetzt. Nun habe ich jedoch einen neuen Grafikkarten - Treiber installiert. Jetzt stimmt diese Nummer nicht mehr mit dem überein, was Windows bestimmt.

    Mit anderen Worten: Gehe ich in die Systemsteuerung und drücke bei den Monitoren auf "Identify / Identifizieren" dann werden mir ja die Monitornummer auf jedem Bildschirm kurz eingeblendet.
    Und genau diese Nummern möchte ich eigentlich mit AutoIt auslesen.

    Bei gewissen Grafikkarten / Treibern stimmen die Nummern (zufälligerweise ?) überein. Aber nicht immer!

    Kann man die Nummern auch über eine DLL bestimmen?

    Grüsse
    Veronesi

  • Hoi name22,

    nein, @DesktopWidth und @DesktopHeight zeigt nur die Auflösung des primären Monitors an.
    Ich habe aber hier 8 Monitore gleichzeitig.....

    Das _WinApi_EnumDisplayDevices sieht interessant aus, jedoch habe ich noch nicht gefunden, wie oder ob ich überhaupt die Bildschirmnummer herausfinden kann!
    Aber ist mal ein Anfang!

    Kennt sich jemand mit EnumDisplayDevices etwas aus?

    Edit:
    Auch bei den _WinAPI_GetSystemMetrics habe ich nichts gefunden. (MSDN)

    Es müsste ja nicht zwingend eine fertige Funktion sein. Wenn jemand eine DLL kennt, mit welcher man bei Multimonitor Systemen an die Informationen kommt, dann nur her damit :)

    Einmal editiert, zuletzt von veronesi (26. Mai 2010 um 12:33)