Post by halweg » 11 Nov 2020, 13:22
So, dank Eurer Tipps und der AHK-Hilfe habe ich es relativ schnell hinbekommen, ein Sendeskript zu bauen. Das ist doch erheblich einfacher, als die ganzen Strukturen noch mal in VBA zu deklarieren.
Damit kann ich nun mit SHELL-Befehlen in VBA Daten an meine Skripte senden. Hier der Vollständigkeit halber das Skript, welches sich nun, kompiliert, als Befehl von überall aufrufen lässt.
Code: Select all
; Dieses Skipt sendet per Befehlszeile überggebene Daten an ein anzugebendes laufendes Fenster
#SINGLEINSTANCE FORCE
SETTITLEMATCHMODE, 2 ; Textsuche innerhalb des Fenstertitels
DETECTHIDDENWINDOWS, On
; 1. Argumente vorbereiten
IF A_ARGS.LENGTH() <> 2
{
MSGBOX, 16, sende_daten.exe,Dieses Skript erfordert zwei Parameter:`n1. Titel des Datenempfängers (z. B. Teil des Skriptnamens)`n2. Zu sendende Zeichenkette (ggf. in "...")
EXITAPP
}
ZuSendendeZkette := A_ARGS[2]
ZielSkriptTitel := A_ARGS[1] . " AHK_CLASS AutoHotkey"
; 2. Datenstruktur vorbereiten
VARSETCAPACITY(KopieDatenStrukt, 3*A_PtrSize, 0) ; Speicherbereich der Struktur einrichten.
; 3. Daten eintragen
AnzahlBytes := (STRLEN(ZuSendendeZkette) + 1) * (A_ISUNICODE ? 2 : 1) ; cbData-Element der Struktur auf Größe der Zeichenkette + Null-Terminator setzen
NumPut(AnzahlBytes, KopieDatenStrukt, A_PtrSize) ; Muss für das OS getan werden.
NumPut(&ZuSendendeZkette, KopieDatenStrukt, 2*A_PtrSize) ; Lässt lpData auf die Zeichenkette selbst verweisen.
; 4. Senden der Zeichenkette
TimeoutWert := 4000 ; Optional. Zeit in Millisekunden, die Empfänger.ahk zum Antworten hat. Standard ist 5000
SENDMESSAGE, 0x4a, 0, &KopieDatenStrukt,, %ZielSkriptTitel%,,,, %TimeoutWert% ; 0x4a ist WM_COPYDATA.
; 5. Auswerten, ob es geklappt hat
IF (ERRORLEVEL="FAIL") ; ErrorLevel=(FAIL: Konnte nicht senden, 1 : Meldung akzeptiert, 0 : Meldung ignoriert)
MSGBOX, 16, sende_daten.exe,Übertragung nach Zielfenster "%ZielSkriptTitel%" fehlgeschlagen (Ergebnis von SENDMESSAGE: %ERRORLEVEL%)
SLEEP, 200 ; für alle Fälle
EXITAPP
PS: Ich wusste bisher gar nicht, dass sich die Übersetzer der Hilfe sogar die Mühe gemacht haben, die Variablennamen in den Beispielen nach Deutsch zu übersetzen. Vielleicht sollte ich künftig grundsätzlich die deutsche Hilfe verwenden...
So, dank Eurer Tipps und der AHK-Hilfe habe ich es relativ schnell hinbekommen, ein Sendeskript zu bauen. Das ist doch erheblich einfacher, als die ganzen Strukturen noch mal in VBA zu deklarieren.
Damit kann ich nun mit SHELL-Befehlen in VBA Daten an meine Skripte senden. Hier der Vollständigkeit halber das Skript, welches sich nun, kompiliert, als Befehl von überall aufrufen lässt.
[code]; Dieses Skipt sendet per Befehlszeile überggebene Daten an ein anzugebendes laufendes Fenster
#SINGLEINSTANCE FORCE
SETTITLEMATCHMODE, 2 ; Textsuche innerhalb des Fenstertitels
DETECTHIDDENWINDOWS, On
; 1. Argumente vorbereiten
IF A_ARGS.LENGTH() <> 2
{
MSGBOX, 16, sende_daten.exe,Dieses Skript erfordert zwei Parameter:`n1. Titel des Datenempfängers (z. B. Teil des Skriptnamens)`n2. Zu sendende Zeichenkette (ggf. in "...")
EXITAPP
}
ZuSendendeZkette := A_ARGS[2]
ZielSkriptTitel := A_ARGS[1] . " AHK_CLASS AutoHotkey"
; 2. Datenstruktur vorbereiten
VARSETCAPACITY(KopieDatenStrukt, 3*A_PtrSize, 0) ; Speicherbereich der Struktur einrichten.
; 3. Daten eintragen
AnzahlBytes := (STRLEN(ZuSendendeZkette) + 1) * (A_ISUNICODE ? 2 : 1) ; cbData-Element der Struktur auf Größe der Zeichenkette + Null-Terminator setzen
NumPut(AnzahlBytes, KopieDatenStrukt, A_PtrSize) ; Muss für das OS getan werden.
NumPut(&ZuSendendeZkette, KopieDatenStrukt, 2*A_PtrSize) ; Lässt lpData auf die Zeichenkette selbst verweisen.
; 4. Senden der Zeichenkette
TimeoutWert := 4000 ; Optional. Zeit in Millisekunden, die Empfänger.ahk zum Antworten hat. Standard ist 5000
SENDMESSAGE, 0x4a, 0, &KopieDatenStrukt,, %ZielSkriptTitel%,,,, %TimeoutWert% ; 0x4a ist WM_COPYDATA.
; 5. Auswerten, ob es geklappt hat
IF (ERRORLEVEL="FAIL") ; ErrorLevel=(FAIL: Konnte nicht senden, 1 : Meldung akzeptiert, 0 : Meldung ignoriert)
MSGBOX, 16, sende_daten.exe,Übertragung nach Zielfenster "%ZielSkriptTitel%" fehlgeschlagen (Ergebnis von SENDMESSAGE: %ERRORLEVEL%)
SLEEP, 200 ; für alle Fälle
EXITAPP[/code]
PS: Ich wusste bisher gar nicht, dass sich die Übersetzer der Hilfe sogar die Mühe gemacht haben, die Variablennamen in den Beispielen nach Deutsch zu übersetzen. Vielleicht sollte ich künftig grundsätzlich die deutsche Hilfe verwenden...