In einem früheren Thread habe ich schon mal danach gefragt, einen Tastaturbefehl an ein bestimmtes Fenster (auf einem bestimmten Monitor) zu senden, speziell für den Fall, daß mehrere identische Instanzen dieses Fensters laufen, so daß die Identifizierung per Fenstertitel wegfällt. (Thread-Titel: "Per Skript sekundären Monitor in den Fokus bringen" vom 01.04.21)
Zunächst war/ist für mich die Lösung, vor weiteren Befehlen das betreffende Fenster erst per Maus-Koordinaten festzulegen, per Mausklick in den Vordergrund zu bringen, und dann den gewünschten Befehl zu senden. Das funktioniert vom Prinzip her gut und kann auch schön automatisiert werden, wenn man (auf mehreren Monitoren) spezielle Fenster immer an denselben Stellen hat.
Aber es ist sehr störanfällig, wenn es sich um ein Loop-Skript mit immer wiederkehrenden Befehlen handelt und währenddessen an anderer Stelle aktuell weitergearbeitet wird. Dann passiert es immer wieder, daß sich Mausbewegungen und Fensteraktivierungen gegenseitig in die Quere kommen und trotz sorgfältig zwischengeschalteter Sleep´s (oder gerade deswegen ) unerwünschte Ergebnisse die Folge sind.
Die Problemlösung sehe ich nun darin, nicht für jeden weiteren Loop-Durchgang des Skriptes mit Koordinaten und Klicks zu arbeiten, sondern mit einer einzigartigen Fenster-ID, die anfangs abgefragt und für den restlichen Verlauf dieses Skripts festgelegt wird. Das setzt natürlich voraus, daß auch bei mehreren Instanzen ansonsten völlig gleichartiger Fenster und Titel trotzdem jede Instanz per Windows-ID eindeutig identifizierbar ist, solange diese Fenster-Instanz geöffnet ist. Aber davon gehe ich aus.
Da ich mich noch im Anfängerstadium befinde, benötige ich für einige Skriptteile noch Hilfe:
- ControlGet, AusgabeVar, HWND ...
- "Die HWND-Nummer eines Steuerelements kann auch via MouseGetPos abgerufen werden."
- loop ...
Das Skript soll folgendes machen:
Die Koordinaten (z.B. von der Mitte) des gewünschten Fensters werden per Variable an das Skript übergeben.
Beispiel Skriptstart: skript.ahk -1053,936
Code: Select all
1. Die Fenster-ID der an diesen Koordinaten zuoberst laufenden Anwendung wird ermittelt
und für den weiteren Skriptverlauf als feste Instanz (Variable) beibehalten.
2. Loop-Start
3. Abfrage, ob die Fenster-ID noch vorhanden ist, falls nicht, Skript sofort beenden
4. Abfrage Clipboard nach dem STOP-Wort für den Loop:
Wenn Inhalt Clipboard = [STOP-Wort] dann Loop jetzt beenden und weiter bei 8.
5. send {PgDn} ;an bekannte Fenster-ID !
6. sleep 30000
7. Loop-Return zu 2.
8. clipboard=""
Falls das nicht möglich ist, dann hoffe ich auf eine hohe Geschwindigkeit des Ablaufs, die in den hoffentlich meisten Fällen andere Arbeiten nicht unliebsam stört.
Oder per Zusatzbefehle
- aktuelle Maus- und Cursorposition inkl. Fenster-Fokus einfrieren
- Loop-Befehl ausführen
- Maus, Cursor und Fenster-Fokus an aktueller Stelle wieder freigeben
oder etwas ähnliches.
Der weitere Vorteil dieses Skriptes wäre die Unabhängigkeit des Fensters von der Position beim Start des Skriptes. Durch die eindeutige Fenster-ID kann das Fenster im gesamten Skriptverlauf an jeder Stelle des Monitor-Koordinaten-Universums aufgespürt werden, an die es evtl. verschoben wird.
Sind diese Wünsche realisierbar?
Kann mir jemand helfen und die fehlenden Skript-Teile ergänzen?
Vielen Dank!
Stroker-007