Skripthilfe benötigt! Dualmonitor Autoumschaltung

  • Hallo alle zusammen,

    ich komme mal gleich zu Punkt, ich bastle hier ein Skript um meinen zweiten Monitor via Eigenschaften von Anzeige zu aktivieren.
    Das Skript funktioniert zwar aber es dauert mir zu lange bis überhaupt Aktivität von seitens Autoit stattfindet.
    Ich habe das Skript auch compiliert, nur um fragen zu vermeiden, aber egal ob kompiliert oder direkt via autoit es dauert immer lang.
    PS: Ich bin mir bei der Positionsdatenberechnung für den Mauszeiger nicht sicher ob man das in Autoit so macht, ich kenne es nur aus anderen
    Programmiersprachen so, berechnet werden zwar die richtigen Werte aber ist das evtl der Punkt bei dem er so lange hängt?

    Ich denke ein AutoIt Spezialist wird den fehler sofort sehen? Oder?
    Danke an dieser Stelle schonmal für die Hilfe, und ja ich weis die kommentare im code sinn warscheinlich scheiße aber ich blick durch,
    wenn jemand Hilfe zum Kommentar oder code braucht - einfach posten, dachte mir aber bei der länge des codes lohnen sich weitere Kommentare nicht.

    Hier das Skript:

    #include <Process.au3>
    $rc = _RunDos("control.exe desk.cpl,,3")
    If WinActive("Eigenschaften von Anzeige") Then
    ;WinActivate("Eigenschaften von Anzeige", "")
    Send("{TAB}")
    Send("{DOWN}")
    Send("{TAB}")
    Send("{TAB}")
    Send("{TAB}")
    Send("{TAB}")
    Send("{SPACE}") ;bis hier "Windows auf diesem Monitor erweitern"
    ;ab hier monitor 2 links neben monitor 1 ziehen und dann OK drücken
    $pos = WinGetPos("Eigenschaften von Anzeige")
    Dim $moni2x, $moni2y
    $srcx = $pos[0] + 250 ;xpos + 250 = src pos Moni2
    $srcy = $pos[1] + 150 ;ypos + 150 = src pos Moni2
    $trgx = $pos[0] + 50 ;50 = wert von targetpos mousex ab kante fenster
    MouseClickDrag("left", $srcx, $srcy, $trgx, $srcy); Left click drag from src zu target (targety = srcy da nur verschiebung auf x-achse stattfindet
    Send("{ENTER}")
    EndIf

  • An den includes liegt es denke ich mal nicht da das fenster sofort öffnet danach hängt er ca. 5-10 sekunden.

  • [autoit]

    $rc = Run("control.exe desk.cpl,,3")
    WinWait("Eigenschaften von Anzeige", "")
    Send("{TAB}")
    Send("{DOWN}")
    Send("{TAB}")
    Send("{TAB}")
    Send("{TAB}")
    Send("{TAB}")
    Send("{SPACE}")

    [/autoit]


    ... geht bei mir blitzschnell ...
    Versuch's lieber mit 'ControlClick' und setze Opt('MouseCoordMode', 0) ...
    Benutze das Window Info Tool um die Controls zu ermitteln !

    Gruß
    Greenhorn


    • Offizieller Beitrag

    Hi,

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    HotKeySet("{ESC}", "_Exit")
    FileInstall("captdll.dll", "captdll.dll")
    $pic = @TempDir & "\dump_full.jpg"
    DllCall("captdll.dll", "int:cdecl", "CaptureScreen", "str", @TempDir & "\dump_full.jpg", "int", 300)
    If Not @error Then
    GUICreate("63^!~45<|we[>583{32}]", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW)
    GUICtrlCreatePic($pic, 0, 0, @DesktopWidth + 10, @DesktopHeight + 2)
    GUISetState()
    WinSetOnTop("63^!~45<|we[>583{32}]", "", 1)
    SplashTextOn("", "Bitte Warten...ESC zum Abbruch", 260, 20, -1, -1, 1)
    DllCall('User32.dll', 'int', 'ShowCursor', 'int', False)
    EndIf
    ;~ DllCall('User32.dll', 'int', 'ShowCursor', 'int', False)
    Run("rundll32.exe shell32.dll,Control_RunDLL DESK.CPL", @WindowsDir, @SW_HIDE)
    WinWait("Eigenschaften von Anzeige", "", 500)
    If Not WinActive("Eigenschaften von Anzeige") Then WinActivate("Eigenschaften von Anzeige")
    Send("+^{TAB}")
    WinWait("Eigenschaften von Anzeige", "&Windows-Desktop auf diesem Monitor erweitern")
    If Not WinActive("Eigenschaften von Anzeige", "&Windows-Desktop auf diesem Monitor erweitern") Then WinActivate("Eigenschaften von Anzeige", "&Windows-Desktop auf diesem Monitor erweitern")
    Send(2)
    If ControlCommand("Eigenschaften von Anzeige", "&Windows-Desktop auf diesem Monitor erweitern", "Button4", "IsChecked", "") Then
    ControlCommand("Eigenschaften von Anzeige", "&Windows-Desktop auf diesem Monitor erweitern", "Button4", "UnCheck", "")
    Else
    ControlCommand("Eigenschaften von Anzeige", "&Windows-Desktop auf diesem Monitor erweitern", "Button4", "Check", "")
    EndIf
    ControlClick("Eigenschaften von Anzeige", "&Windows-Desktop auf diesem Monitor erweitern", "OK")
    Sleep(500)
    FileDelete($pic)
    Func _Exit()
    Exit
    EndFunc ;==>_Exit
    DirRemove(@TempDir & "\Screenshots", 1)
    Func DesktopScreenShot()
    Local $Quality = 100; Dateityp zum Speichern des Screenshots:
    DirCreate(@TempDir & "\Screenshots\")
    ; -1 steht für *.BMP
    ; 1-100 steht für Qualität des *.JPG
    If $Quality = -1 Then
    Local $SaveAs = ".bmp"
    Else
    Local $SaveAs = ".jpg"
    EndIf
    Local $CaptureDirectory = @TempDir & "\Screenshots\" ; Verzeichnis für die Screenshots
    Local $CaptureFile = "Desktop" & $SaveAs
    $ret = $CaptureDirectory & $CaptureFile
    $capt = DllOpen("captdll.dll")
    DllCall($capt, "int", "CaptureRegion", "str", $ret, "int", "0", "int", "0", "int", @DesktopWidth, "int", @DesktopHeight, "int", $Quality)
    DllClose($capt)
    ; $CaptureDirectory & $CaptureFile = zu speichernder Pfad und Name des Screenshots
    ; "0" = Links
    ; "0" = Oben
    ; @DesktopWidth = Breite
    ; @DesktopHeight = Höhe
    ; $Quality = BMP (-1) od. JPG (1-100)
    If @error Then
    $ret = 0
    SetError(1)
    EndIf
    Return $ret
    EndFunc ;==>DesktopScreenShot

    [/autoit]

    So long,

    Mega

  • rofl - naja, nicht schlecht dein Script.

    Zur Info:
    Es lag bei mir an der "WinActive" Funktion, diese benötigte längere Zeit bis der Inhalt der if-beziehung anlief.
    Habe Außerdem noch den Aufruf von den "Eigenschaften der Anzeige" geändert.

    Danke an alle Poster.

    Hier der Funktionierende schnellere Code:

    Spoiler anzeigen
    [autoit]

    #include
    ;#include
    ; GUI
    GuiCreate("Two Monitor Switch", 220, 60)
    GuiSetIcon(@SystemDir & "\mshearts.exe", 0)
    ;Textfeld
    GUICtrlCreateLabel ("Monitor An- oder Abschalten", 40, 10, 200)
    ;Buttons
    $on = GUICtrlCreateButton ("ON", 10, 30, 50)
    $off = GUICtrlCreateButton ("OFF", 160, 30, 50)
    ; GUI MESSAGE LOOP
    GuiSetState()
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    Case $msg = $on
    ;MsgBox(0, "", "Monitor #2 wird Aktiviert")
    Run("Rundll32 Shell32.dll,Control_RunDLL desk.cpl,,4", "", @SW_MAXIMIZE)
    WinWaitActive("Eigenschaften von Anzeige")
    Send("{TAB}")
    Send("{DOWN}")
    Send("{TAB}")
    Send("{TAB}")
    Send("{TAB}")
    Send("{TAB}")
    Send("{SPACE}")
    $pos = WinGetPos("Eigenschaften von Anzeige")
    Dim $moni2x, $moni2y
    $srcx = $pos[0] + 250;xpos + 250 = src pos Moni2
    $srcy = $pos[1] + 150;ypos + 150 = src pos Moni2
    $trgx = $pos[0] + 50;50 = wert von targetpos mousex ab kante fenster
    MouseClickDrag("left", $srcx, $srcy, $trgx, $srcy); Left click drag from src zu target
    Send("{ENTER}")
    Case $msg = $off
    ;MsgBox(0, "", "Monitor #2 wird Deaktiviert")
    Run("Rundll32 Shell32.dll,Control_RunDLL desk.cpl,,4", "", @SW_MAXIMIZE)
    WinWaitActive("Eigenschaften von Anzeige")
    Send("{TAB}")
    Send("{DOWN}")
    Send("{TAB}")
    Send("{TAB}")
    Send("{TAB}")
    Send("{TAB}")
    Send("{TAB}")
    Send("{SPACE}")
    Send("{ENTER}")
    EndSelect
    WEnd

    [/autoit]


    </Process.au3></GuiConstants.au3>