Befehle an ein Fenster per ID-Identifikation senden

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Befehle an ein Fenster per ID-Identifikation senden

12 May 2021, 23:04

Hallo und schönen Vatertag!

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=""
Schlüsselzeile ist 5. Idealerweise sollte der Tastaturbefehl gesendet werden, ohne dafür das Fenster vorher aktivieren zu müssen. Also so, als wäre es ein interner Programmbefehl. Viele Programme können im Hintergrund z.B. per Macro einen Job erledigen und Ergebnisse präsentieren, ohne sich dafür in den Fokus drängen zu müssen.

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
Kobaltauge
Posts: 264
Joined: 09 Mar 2019, 01:52
Location: Germany
Contact:

Re: Befehle an ein Fenster per ID-Identifikation senden

13 May 2021, 13:42

Hallo.

Keine Komplettlösung aber vielleicht etwas an dem du dich entlanghangeln kannst.
Schau die mal den Befehl ControlSend an. Damit kann man alles Mögliche an Fenster schicken auch, wenn diese nicht im Focus sind.
https://www.autohotkey.com/docs/commands/ControlSend.htm
Als Identifizierung kann der Titel, die Klasse oder die ID gegeben werden.

Hier ein Beispiel das alle Editoren (notepad.exe) sucht und einen Text hinschickt.

Code: Select all

WinGet, id, list, ahk_exe notepad.exe
Loop, %id%
{
	this_ID := id%A_Index%
	ControlSend,,This is a line of text, ahk_id %this_ID%
	WinGetTitle, title, ahk_id %this_ID%
	MsgBox %title% %this_ID%
	Sleep, 1000
}
return
Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Re: Befehle an ein Fenster per ID-Identifikation senden

13 May 2021, 15:16

Danke Dir erstmal, das klingt vielversprechend!
Muß ich mir jetzt erst näher ansehen und durchtesten.
Melde mich dann wieder.

Bin noch etwas wackelig mit der richtigen Verwendung der diversen Befehle bzgl. mancher Parameter unterwegs.
Die Befehlsreferenz/Hilfedatei hilft da meist auch nicht weiter.

Hat mir jemand noch eine (Standard-)Formulierung für die beiden Abfragen in den Schritten 3. und 4. - siehe oben?
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Befehle an ein Fenster per ID-Identifikation senden

14 May 2021, 05:10

Moin,

die AHK-Anweisungen für Fenster 'fremder' Anwendungen finden sich in der deutschen AHK-Doku im Abschnitt "Fenster" (z.B. WinExist()). Damit haben wir auch schon eine Lösung zu 3.

Für die Zwischenablage hat AHK eine eigene 'interne' Variable -> Clipboard. Damit solltest Du das Problem zu 4. lösen können.

Noch zu 1.:
Die ID des Fensters an einer bestimmten Position kannst Du Dir auf einfache Weise mit etwas 'Masuschubserei' holen. Zum Beispiel kann man beim Start des Skripts Folgendes machen:

Code: Select all

XF := 1053 ; Bildschirmkoordinaten der Fensterposition
YF := 936
CoordMode Mouse, Screen ; die Mausbefehle verwenden Bildschirmkoordinaten
MouseGetPos, XM, YM ; aktuelle Mausposition holen
MouseMove, XF, YF ; Maus zu den Fensterkoordinaten bewegen
MouseGetPos, , , FensterID ; ID des Fensters unter der Maus holen
MouseMove, XM, YM ; Maus auf die ursprüngliche Position zurücksetzen.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 24 guests