AutoIt Skript trotz Mausbewegungen im Hintergrund laufen lassen

Warhorstl

Commodore
Registriert
Nov. 2008
Beiträge
4.618
Hi!

Ich suche eine Lösung für folgendes Problem:
Ich habe mit ein AutoIt-Skript geschrieben, das mehrfach die Maus bewegt und ein paar Sachen klickt und länger laufen soll. Nun möchte ich meinen Rechner, auf dem das Skript laufen soll, auch noch nebenbei anderweitig nutzen, also im Browser surfen, etc, sodass Skript und anderer Nutzen leider um das Bewegen der Maus konkurrieren.

Wie kann ich erreichen, dass beides auf meinem Rechner (Win 7) möglich ist?

Gruß
Warhorstl
 
Nei ja kannst doch eine VM aufsetzen und darin läuft dein Script :-)
Dann kannst du immernoch auf dem Horstsystem arbeiten :-)
 
Sobald ne Interaktion auf der GUI passiert, hast du keine Chance. Dann bleibt dir nur übrig, die Buttons im Hintergrund zu "drücken", indem du die richtigen Systemnachrichten an die entsprechenden Fenster schickst. Du kannst ja auch nicht schwimmen, wenn du gerade Fahrrad fährst.
 
Erst einmal danke für die Antworten.

frankx82, die Idee hatte ich auch schon, ich hatte gehofft, noch eine einfacherer Lösung zu finden. Da ich bereits mit dem VMware Player eine VM auf meinem (zugegeben leistungsschwachen) Notebook ausführe, macht es mir außerdem sorgen, dass der Browser, in dem geklickt wird, auch auf diesem PC immer etwas behäbig arbeiten konnte. Da das, wenn ich das Skript nicht stark verlangsame, eventuell das Skript fehlerhaft macht, wäre das natürlich etwas suboptimal. Deshalb kommt es auch nicht infrage, das Skript auf dem Notebook auszuführen (problem ist nämlich wirklich nicht das Internet, sondern wirklich nur die Leistung). Ich werde das wohl testen müssen.
Gibt es zu virtuellen Maschinen auch noch andere Möglichkeiten und gibt es beim OS eventuell Alternativen wie zum Beispiel Ubuntu bzw. würde mein AutoIt Skript darauf laufen?

Bagbag, der Vorschlag ist mir leider ein wenig zu aufwändig, obwohl er dafür aber meinen Algorithmus wahrscheinlich mit deutlich geringerer Laufzeit umsetzen könnte. Ich kann zwar Programmieren, aber dann müsste ich mich da wieder in ein neues System reinfuchsen und da ich das heute schon mit AutoIt getan habe, fehlt mir dazu gerade die Motivation :D
 
Warhorstl schrieb:
macht es mir außerdem sorgen, dass der Browser, in dem geklickt wird, auch auf diesem PC immer etwas behäbig arbeiten konnte. Da das, wenn ich das Skript nicht stark verlangsame, eventuell das Skript fehlerhaft macht, wäre das natürlich etwas suboptimal.
Dann such dir eine Funktion, die nachschaut, ob die Anwendung reagiert. Auf die Schnelle hab ich das gefunden. Fehlertolerant solltest du sowieso programmieren, denn irgendwas kann immer mal passieren und sei es, dass es kurz den Fokus durch ne Anwendung im Tray o.ä. verliert. Anzunehmen, dass das Fenster schon aktiv ist, hilft dir nicht und das kannst du auch nicht forcieren.
Warhorstl schrieb:
gibt es beim OS eventuell Alternativen wie zum Beispiel Ubuntu bzw. würde mein AutoIt Skript darauf laufen?
Was soll bei Ubuntu anders laufen? Wenn du dort nebenbei genauso rumklickst, hast du ebenso keine Chance mit der GUI zu interagieren. Da musst du den gleichen Weg gehen: Mit den Fenstern und der Anwendung direkt kommunizieren.
 
Naja, so viel Aufwand ist das nicht, um in einem Programm ein Knopf zu drücken wären geschätzt <10 Zeilen nötig.
 
Yuuri schrieb:
Dann such dir eine Funktion, die nachschaut, ob die Anwendung reagiert. Auf die Schnelle hab ich das gefunden. Fehlertolerant solltest du sowieso programmieren, denn irgendwas kann immer mal passieren und sei es, dass es kurz den Fokus durch ne Anwendung im Tray o.ä. verliert. Anzunehmen, dass das Fenster schon aktiv ist, hilft dir nicht und das kannst du auch nicht forcieren.

Wirkliche Fehlertoleranz würde mein Programm komplexer machen als das Problem, das ich lösen will. Bislang habe ich deshalb das Skript nur in einem extra dafür eingerichten Benutzeraccount ausgeführt, damit es in meiner Abwesenheit nicht aus Versehen irgendetwas kaputt macht. Falls dann mal etwas schief geht, habe ich dadurch immerhin keinen Schaden. Bei einer VM kann ich es dann ja genauso machen und die Sleepzeiten zwischen den einzelnen Schritten, wenn der Browser lädt, so hoch schrauben, dass nur noch sehr selten Fehler auftreten und ich dann bei Bemerken das Skript manuell neustarten kann. Darüber, dass das Fenster nicht immer aktiv sein sollte, mache ich mir keine Sorgen, dass lief bisher immer problemlos.
Komplett zuverlässig muss das Skript also nicht sein.

Yuuri schrieb:
Was soll bei Ubuntu anders laufen? Wenn du dort nebenbei genauso rumklickst, hast du ebenso keine Chance mit der GUI zu interagieren. Da musst du den gleichen Weg gehen: Mit den Fenstern und der Anwendung direkt kommunizieren.

Da ging es mir einfach darum, dass es kostenlos ist. Für Win 7 oder XP müsste ich mich wieder um eine Lizenz bemühen.

Bagbag schrieb:
Naja, so viel Aufwand ist das nicht, um in einem Programm ein Knopf zu drücken wären geschätzt <10 Zeilen nötig.

Es ist schon ein bisschen mehr. Pro Durchlauf muss aktuell etwa 100 Mal Tab auf verschiedenen Seiten (wobei das nicht verschiedene Internetseiten sind sondern eher sowas wie "Seiten" einer App, durch die ich mich nacheinander durchklicken will), ein paar mal Enter und weniger Mausklicks machen - die Mausklicks auch nur aus der Verlegenheit heraus, dass ich an die Stellen nicht hintabben konnte. Die Seiten sind auch alle unterschiedlich aufgebaut.
 
Warhorstl schrieb:
Für Win 7 oder XP müsste ich mich wieder um eine Lizenz bemühen.
Hast du Win 7 Pro? Dann hast du im Prinzip ne XP-Lizenz mit dabei, denn der XP-Mode wird "werksmäßig" mit ausgeliefert.
Warhorstl schrieb:
Es ist schon ein bisschen mehr. Pro Durchlauf muss aktuell etwa 100 Mal Tab auf verschiedenen Seiten (wobei das nicht verschiedene Internetseiten sind sondern eher sowas wie "Seiten" einer App, durch die ich mich nacheinander durchklicken will), ein paar mal Enter und weniger Mausklicks machen - die Mausklicks auch nur aus der Verlegenheit heraus, dass ich an die Stellen nicht hintabben konnte. Die Seiten sind auch alle unterschiedlich aufgebaut.
Ein einfaches jQuery Script zu injecten funktioniert da nicht oder gar ein kleines Addon? Gerade der FF eignet sich doch hervorragend für sowas. Basiert komplett auf HTML + XML + JS, musst dir nur kurz die Addon-API ansehen. Das wäre zumindest der bessere Weg, anstatt eine Anwendung mittels einer anderen Anwendung zu steuern. Weiterer Vorteil: Das Script/Addon wird pro Tab geladen, ergo kein Rumgeklicke, kein Gewechsel, ... Sowas könntest du einfach in nem neuen/privaten Fenster laufen lassen und der kümmert sich um alles.
Code:
$('#button').click()
reicht da, nicht 100 mal Tab + Enter drücken. ;)
 
Ach, was ich bis jetzt noch zurückgehalten habe, weil ich es bislang auch nicht nachgesehen habe, da es für mein Vorgehen unerheblich war: Rechtsklick macht den Flash Player offensichtlich. Allerdings ist das nur die Hälfte der Seite, vorher muss ich nur Knöpfe drücken, hinter denen Links liegen. (Ich hätte ja gleich am Anfang einen Link reingestellt, leider ist die Seite nicht öffentlich zugänglich.)

Irgendwie habe ich jetzt doch gerade Lust bekommen, eine bessere Lösung zu finden. HTML, XML und JS habe ich bislang noch nie benutzt, nur C, Java, MatLab und eben AutoIt. Aber wenn an den dreien jetzt nicht alles komplett anders ist (von Java auf C war die Umstellung bei mir ja nun ziemlich klein), sollte ich damit klarkommen. Aber vor allem stellt sich mir jetzt die Frage: Funktioniert das auch in einer Flash-Anwendung?
 
Ich bin mir sicher, dass du weder mit Javascript, noch mit der Win API auf Flash-Anwendungen zugreifen kannst.

Jedoch weiß ich, dass man mit der Flash-COM-Schnittstelle zumindest etwas manipulieren kann, aber das geht glaube ich nur, wenn dein Programm im Besitz des Flash Player Objekts ist, hilft dir also wohl nicht weiter.
 
Zuletzt bearbeitet:
OK, also doch VM. Dann schau ich mal, ob mir irgendwer noch eine alte Lizenz vermacht :D
 
Sollte sehr wohl mit AutoIt funktionieren.

Schau dir dazu mal die Funktionen "ControlClick" und "ControlSend" an. Alternative direkt die Windows API benutzen um die entsprechenden Nachrichten an das Fenster zu senden.

Dazu die Funktionen "PostMessage" und "SendMessage" ansehen. AutoIt hat da sogar Wrapper-Funktionen, namentlich "_WinAPI_PostMessage" und "_WinAPI_SendMessage".

Falls du nicht weiterkommst, sind genauere Angaben zu deinem Problem notwendig.
 
Genau das ist es ja.

Flash nutzt meines Wissens nicht die Windows API um Controls zu erstellen sondern etwas eigenes, deshalb ist es ja auch Plattformunabhängig.
 
Flash benutzt zwar keine Windows Controls, aber es muss ja trotzdem noch Maus/Tastaturinput verarbeiten können.
Also Messages wie z.B. WM_LBUTTONDOWN oder WM_LBUTTONUP kann man an Flash senden und es wird sie auch verarbeiten.

Das Problem ist eher, dass Browserplugins in einer Sanbox laufen, also bringts nix Mausklicks an den Browser zu senden.
Man braucht also ne Möglichkeit das Flash Control/ChildWindow irgendwie zu identifizieren. AutoIt bringt aber gücklicherweise ein ziemlich gutes Window Info Tool mit, womit man unter Anderem den Klassennamen von Controls auslesen kann.

Lange Rede kurzer Sinn - so kann ich z.B. ein Youtube Video starten/stoppen:
Code:
AutoItSetOption('WinTitleMatchMode', '-2') ; match substrings case insensitive

$class = '[CLASS:GeckoFPSandboxChildWindow]'
$hWnd = WinGetHandle('youtube - mozilla firefox')

ControlClick($hWnd, '', $class, 'left', 1, 25, 375)
Das Firefox Fenster muss dazu nicht im Vordergrund sein und andere Anwendungen bekommen davon nix mit, da ControlKlick die Messages direkt an das GeckoFPSandboxChildWindow sendet.
 
Zuletzt bearbeitet:
Oh stimmt, ich hatte im Kopf die "Click" Message direkt an den Button zu senden, aber ans Fenster, das geht ja auch.
Also dann ist dein Vorhaben doch nicht schwer.
 
Zurück
Oben