ControlSend auf mehrere Fenster mit demselbem Titel

  • Hallo liebe Nutzer der AutoIt Gemeinde,

    ich habe vor kurzem dieses Programm entdeckt und ich finde es sehr einfach zu coden, zumindest das was ich bis jetzt geschafft habe ;)
    Nach der Bemerkung der Möglichkeiten des Programmes werde ich mich mehr damit auseinander setzen wollen.
    Da die meisten von euch fixer mit dem coden sind bitte ich um eure Hilfe. In der SuFu habe ich passende Themen gefunden, jedoch konnten diese mir nicht weiterhelfen.

    Der Fall:
    ControlSend soll auf zwei oder mehrere minimierte Fenster mit der selben Bezeichnung sprich dem Titel gleichzeitig die Tastenkombinationen reinschreiben.
    Und ist es richtig damit ich eine Endlosschleife habe mit While 1 und WEnd arbeiten muss?
    mein Code:

    Spoiler anzeigen
    [autoit]

    While 1
    ControlSend("[CLASS:Notepad]",'','[CLASS:Edit; INSTANCE:1]',"Hallo leute, ")
    Sleep(100)
    ControlSend("[CLASS:Notepad]",'','[CLASS:Edit; INSTANCE:1]',"dies ist ein Test")
    Sleep(2000)
    WEnd

    [/autoit]


    Für eure Bemühungen bedanke ich mich vielmals und ich wünsche euch einen ruhigen Sonntag-Abend :)

    Gruß

    wawaking :rock:

    Gruß :thumbup:

    wawaking

    ~~~~~~~~~~~~~ Work Hard Play Hard :rock: ~~~~~~~~~~~~~

    4 Mal editiert, zuletzt von wawaking (24. Februar 2014 um 00:32)

  • [autoit]

    ; Zwei Notepad Prozesse minimiert starten:
    Run('notepad.exe', '', @SW_MINIMIZE)
    Run('notepad.exe', '', @SW_MINIMIZE)

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

    ; Kurz Zeit geben damit die Fenster registriert werden können:
    Sleep(100)

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

    ; Nun werden alle Fenster die mit der Klassenbezeichnung "Notepad" registriert sind
    ; in ein Array geladen. Nun können mithilfer deren Handles die Texte gesendet werden:
    $avWindow = WinList('[CLASS:Notepad]')

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

    ; Fenster 1:
    ConsoleWrite(@CRLF & ' Titel: ' & $avWindow[1][0] & @CRLF & ' Handle: ' & $avWindow[1][1] & @CRLF)

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

    ; Fenster 2:
    ConsoleWrite(@CRLF & ' Titel: ' & $avWindow[2][0] & @CRLF & ' Handle: ' & $avWindow[2][1] & @CRLF & @CRLF)

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

    ; An Fenster #1 senden:
    ControlSend($avWindow[1][1], '', 15, 'Fenster #1')

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

    ; An Fenster #2 senden:
    ControlSend($avWindow[2][1], '', 15, 'Fenster #2')

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

    ; Nun nur noch die Fenster einzelnd maximieren und dann schließen:
    WinSetState($avWindow[1][1], '', @SW_MAXIMIZE)
    Sleep(2500)
    ProcessClose(WinGetProcess($avWindow[1][1]))
    Sleep(100)
    WinSetState($avWindow[2][1], '', @SW_MAXIMIZE)
    Sleep(2500)
    ProcessClose(WinGetProcess($avWindow[2][1]))

    [/autoit]
  • Deshalb gibt es nicht nur Titel sondern auch Text.

    Was soll ich darunter verstehen??


    Mir geht es darum wenn ich z. B. bereits zwei Wordpads an habe, diese heißen ja beide im Titel "Unbenannt" und haben auch den selben CodeNN.
    Aber wenn ich sendcontrol dann laufen lasse, sucht er sich nur das letzte Fenster aus in dem ich gewesen bin und schreibt auch nur dort den Text rein.
    Ist es möglich, dass der das gleichzeitig macht in beide macht?

    Für jede hilfe gibt es ein imaginäres Bier von mir ;)

    Gruß :thumbup:

    wawaking

    ~~~~~~~~~~~~~ Work Hard Play Hard :rock: ~~~~~~~~~~~~~

  • Sieh dir doch mal den Code von mir an...
    Ich habe dort auch 2 exakt gleiche Fenster, jedoch werden in beide genau der Text hinein geschrieben, den ich möchte!
    Komisch dass es bei dir nicht klappt, was?

    Die Fenster haben (Neben den Titel und den Klassen) ein Handle welches nur einmalig vergeben wird. Dieses Handle ist wie eine ID und wird solange besetzt, wie das Programm läuft. Somit können selbst "gleiche Fenster" unterschieden werden. Wenn du nun das gleiche Verfahren anwendest wie ich, kannst du zielgerichtet auf deine gewünschten Fenster den gewünschten Text senden. Die Betonung liegt auf "zielgerichtet". Bei dir ist das eher ein Blindflug ^^

    €dit:

    [autoit]

    ControlSendAll('[CLASS:Notepad]', '', 15, 'Der zu sendene Text!', 1)

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

    Func ControlSendAll($title, $text, $controlID, $string, $flag = 0)
    Local $avWindow = WinList($title, $text)
    Local $i

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

    If Not IsArray($avWindow) Then Return 0
    For $i = 1 To $avWindow[0][0]
    ControlSend($avWindow[$i][1], '', $controlID, $string, $flag)
    Next

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

    Return 1
    EndFunc

    [/autoit]

    Noch einfacher kann ich dir es nicht machen! ^^
    Die Parameter sind exakt die gleichen wie bei ControlSend().
    Nur wird der Text an alle Fenster gesendet die auf den Titel bzw. der Klasse zutreffen.
    Mehr kann man nun wirklich nicht mehr für dich tun. :D

    Einmal editiert, zuletzt von Yjuq (24. Februar 2014 um 00:19)

  • Was ich meine ist ganz einfach, da jedes Fenster unterschiedlich ist hat es nicht den gleichen WinGetText aber vielleicht denselben WinGetTitle. Der 2. Parameter von ControlSend ist Text, da kannst du das Fenster genauer definieren.

    Das wusste ich bereits hat aber auch nicht geklappt. Mit der Funktion oben klappte alles wunderbar ;)

    Gruß :thumbup:

    wawaking

    ~~~~~~~~~~~~~ Work Hard Play Hard :rock: ~~~~~~~~~~~~~