Tastenkombinationen werden oft zerstückelt gesendet

  • Hallo

    Ich habe ein Problem dass mich schon länger nervt. Oft werden Tastenkürzel falsch abgeschickt. Zb statt STRG+V wird nur ein "V" abgesendet. Das passiert vorallem dort, wo ich unmittelbar ein Tastenkürzel absende, sobald sich das dazugehörige Textfeld aufgebaut hat (also zb bei Popup-Dialogen). Aber wenn die Zeit zu knapp bemessen ist, sollte doch eher garnichts ankommen, als nur der Teil eines Tastenkürzels, oder?! Oder benutzt AutoIt eine Methode die einfach unzuverlässig ist?

    Beispiel mit Notepad:

    [autoit]

    If WinExists("[CLASS:Notepad]") Then
    ControlSend("[CLASS:Notepad]","","","^o")
    $cacheZwAbl = ClipGet()
    ClipPut("Irgendein beliebiger Text...")
    Sleep(250)
    ControlSend("Öffnen","","Edit1","^v")
    ClipPut($cacheZwAbl)
    EndIf

    [/autoit]

    Gibt es eine Methode AutoIt zu zwingen, Tastenkürzel auch wirklich als Tastenkürzel abzuschicken, statt einfach die einzelnen Tasten abzuschicken und dann zu beten dass sie auch gleichzeitig ankommen? Oder mach ich was falsch?

    Natürlich könnte ich als Workaround überall einen großzügig bemesennen Sleep einbauen, aber dass wäre nicht nur unschön sondern immernoch unlogisch wieso eine Kombination als Einzelteile geschickt wird...

    Bin wie immer gespannt auf eure Antworten.

    Einmal editiert, zuletzt von klischee (27. Juni 2011 um 00:56)

  • Naja offensichtlich nicht, sonst wüsstest du, dass du mit clipget den Inhalt der Zwischenablage bekommst und somit garkein STRG+V benötigt wird.

    So sollte es genauso funktionieren:

    [autoit]


    ControlSend("Öffnen","","Edit1",clipget())

    [/autoit]

    Es ist aber anzuraten vor dem Senden zunächst in einer Schleife zu prüfen ob das "öffnen Fenster" bereits existiert, dann kann es auch nicht passieren, dass der controlsend Befehl ins leere läuft.
    Alternativ kann übrigens auch controlsettext verwendet werden. Noch einfacher und sinnvoller in deinem Beispiel wäre es aber, wenn du die notepad.exe mit Paramter aufrufst, also z.b.

    [autoit]


    run('notepad.exe "c:\test.txt"')
    ; oder
    run('notepad.exe ' & '"' & clipget() & '"') ; sofern der Pfad unbedingt per Zwischenablage übergeben werden soll

    [/autoit]
  • Kann es sein das ihr sein Script nicht versteht? Er speichert den Text der zwischenablage zwischen um ihn am ende wiederherstellen zu können. Dazwischen setzt er seinen eigenen Text ein um ihn per Strg+V wieder zu pasten.

    So nun zum Thema:

    [autoit]


    Send("{CTRLDOWN}")
    Send("v")
    Send("{CTRLUP}")

    [/autoit]
    • Offizieller Beitrag

    Kann es sein das ihr sein Script nicht versteht? Er speichert den Text der zwischenablage zwischen um ihn am ende wiederherstellen zu können.


    Kann es sein, dass du das mißverstehst? :whistling:
    - Strg+o = Menü zum Datei Öffnen
    - $cacheZwAbl = ClipGet() - Sinnlos, Cursor steht in der Adresszeile des Öffnen-Menüs, nichts ist markiert, somit wird auch nichts in die Zwischenablage geschrieben ;)
    - Strg+v = immer noch im Öffnen-Menü, eingefügt wird der ('irgendein Text' ??) Inhalt aus der Zwischenablage, vermutlich soll da ein Dateiname rein
    - ClipPut($cacheZwAbl) = (leerer) Inhalt von $cacheZwAbl wird in die Zwischenablage geschrieben

  • Nö Bugfix, da hast du nun das Script nicht verstanden :P
    Es ist schon richtig, dass er zunächst den Inhalt der Zwischenablage in eine Variable speichert um den Inhalt am Scriptende wiederherzustellen.
    Dazwischen setzt er einen Text (wohl Dateipfad/name) in die Zwischenablage um ihn dann im Datei öffnen Dialog wieder einzufügen, was eigentlich sinnfrei ist, denn man kann den Pfad ja auch direkt dort verwenden ohne die Zwischenablage zu bemühen.

  • Also ich verstehe das Script so:

    [autoit]

    If WinExists("[CLASS:Notepad]") Then ;Wenn ein Notepad Fenster existiert, dann...
    ControlSend("[CLASS:Notepad]","","","^o") ;Sendet Strg + o an das Fenster
    $cacheZwAbl = ClipGet() ;Holt Daten aus der Zwischenablage
    ClipPut("Irgendein beliebiger Text...") ;Kopiert den String in die Zwischenablage
    Sleep(250) ;Schläft für 250 Millisekunden
    ControlSend("Öffnen","","Edit1","^v") ;Sendet Strg + v an das EditControl im Öffnen Dialog
    ClipPut($cacheZwAbl) ;Setzt ursprüngliche Daten wieder in die Zwischenablage
    EndIf

    [/autoit]


    BugFix Ähm... ClipGet ist nicht äquivalent zu Strg + C...

    Mein Vorschlag wäre, mit Opt("SendKeyDownDelay", ...) etc. zu experimentieren.

  • Sorry, ich schlaf zur Zeit tagsüber, kann erst jetzt antworten.

    Die Verwirrung tut mir leid, es ging mir natürlich tatsächlich darum die Zwischenablage zu backupen bevor ich sie überschreibe, wie es name22 freundlicherweise korrekt kommentiert hat. Ich dachte halt dass macht das Wörtchen "Cache" in der Variable klar. Ich hab das ins Beispielscript eingebaut weil's auch im Originalscript so ist und ich mir nicht sicher war ob das mit dem beschriebenen Problem im Zusammenhang stehen könnte.

    So sollte es genauso funktionieren:

    [autoit]


    ControlSend("Öffnen","","Edit1",clipget())

    [/autoit]


    Warum du ein Control ansteuerst um die Zwischenablage zu kopieren erschließt sich mir nicht. Die Zwischenablage ist doch global und hat mit einem Edit-Control garnichts zu tun. Ansonsten ging es mir grad nicht drum ein perfektes Script mit Schleifen etc zu posten sondern nur ein Beispielskript zu liefern um das Problem der Zerstückelung zu demonstrieren. ^^

    Mein Vorschlag wäre, mit Opt("SendKeyDownDelay", ...) etc. zu experimentieren.


    Habe ich probiert, dass ändert leider nichts. ;(

    So nun zum Thema:

    [autoit]


    Send("{CTRLDOWN}")
    Send("v")
    Send("{CTRLUP}")

    [/autoit]


    Dass sieht nach einer Lösung aus, werde ich gleich ausprobieren, danke!

    Edit: Nah, es passiert leider damit noch viel öfter dass nur ein "V"-Ankommt. Wenn ich es in eine Zeile schreib ist es praktisch gleich oft wie wenn ich "^v" benutze. Was ich echt nicht versteh, weil ja die STRG Taste erst nach dem V gelöst werden sollte nach meinem Verständnis 8|

    5 Mal editiert, zuletzt von klischee (27. Juni 2011 um 00:09)

  • Ahh, genial. Klärt zwar die Zerhack-Frage nicht, aber die Methode ist für den Zweck echt besser, ich dachte bisher der Befehl würde sich nur auf die eigene GUI beziehen. Danke für den Tipp!

  • Warum du ein Control ansteuerst um die Zwischenablage zu kopieren erschließt sich mir nicht. Die Zwischenablage ist doch global und hat mit einem Edit-Control garnichts zu tun. Ansonsten ging es mir grad nicht drum ein perfektes Script mit Schleifen etc zu posten sondern nur ein Beispielskript zu liefern um das Problem der Zerstückelung zu demonstrieren. ^^

    Hö? Du willst doch den Inhalt der Zwischenablage an das Control schicken, genau das macht meine Zeile. Clipget liest die Zwischenablage aus und mit controlsen füllst du das Editfeld des Öffnen Dialogs aus. Das ist genau das selbe wie wenn du den Inhalt der Zwischenablage mit STRG+V in das Feld einfügst. Controlsend wie auch send haben manchmal Probleme, weil jedes Zeichen einzeln gesendet wird, das ist eigentlich bekannt. Besser ist es wie ich ebenfalls erwähnt habe ein controlsettext zu verwenden. auch hier kannst du dann so vorgehen wie bei controlsend und den Inhalt der Zwischenablage mit clipget() auslesen. Aber wie schon erwähnt brauchst du die Zwischenablage doch garnicht, denn alle folgenden Zeilen machen ganau das selbe:

    [autoit]


    $meinevariable="pfad"
    clipput("pfad")
    ControlSend("Öffnen","","Edit1",clipget())
    ControlSend("Öffnen","","Edit1","pfad")
    ControlSend("Öffnen","","Edit1",$meinevariable)
    ControlSend("Öffnen","","Edit1","^v")
    ControlSetText("Öffnen","","Edit1",clipget())
    ControlSetText("Öffnen","","Edit1","pfad")
    ControlSetText("Öffnen","","Edit1",$meinevariable)

    [/autoit]
  • Achso, jetzt hab ich's verstanden. Muss wohl noch zu müde gewesen sein, ich hab deinen Post oben vorhin total falsch gelesen/verstanden gehabt. So ist das natürlich alles in der Tat sinnvoller, danke für die Geduld mit mir :D

    Wär aber trotzdem einfach so neugierig wieso AutoIt trotz gehaltener STRG-Taste ein v postet, aber da habt ihr wohl auch keine Ahnung?

    Ich stell den Thread mal auf gelöst weil dass Problem ja jetzt umgangen ist, auch wenn die eigentliche Frage aus Interesse noch steht.