Hallo zusammen,
gibt es eine Möglichkeit, einem laufenden Skript Parameter zu übergeben?
Ich würde gern einem Skript (mit offener GUI) ein Datum übergeben, damit in der GUI in der Datumsliste das entsprechende Datum ausgewählt wird. Die Übergabe erfolgt aus Excel/VBA.
Normalerweise würde ich das Skript per Kommandozeile neu starten und dabei das Datum als Parameter übergeben. Aber vielleicht gibt es auch eine elegantere Art der Übergabe, so das der Dialog erhalten bleiben kann, also das Skript nicht gänzlich neu starten muss.
Besten Dank fürs Mitdenken im voraus!
Halweg
Übergabe von Parametern an laufendes Skript
Moderator: jNizM
Re: Übergabe von Parametern an laufendes Skript
Ich sehe in dir mal einen potentiellen Abnehmer für das hilfreiche tutorial von @just-me: https://www.autohotkey.com/boards/viewtopic.php?f=11&p=342199#p342199
Frohes Gelingen
Frohes Gelingen
Re: Übergabe von Parametern an laufendes Skript
Alternativ:
Im Excel-VBA Datum in eine Datei schreiben.
Mit Timer im AHK-Skript auf die Datei mit dem Datum warten, Datum einlesen, Datei löschen.
Im Excel-VBA Datum in eine Datei schreiben.
Mit Timer im AHK-Skript auf die Datei mit dem Datum warten, Datum einlesen, Datei löschen.
Re: Übergabe von Parametern an laufendes Skript
Hallo zusammen,
sorry zunächst, dass ich mich jetzt erst melde. Ich stehe mit der Benachrichtigungsfunktion dieses Forums auf Kriegsfuß, konkret wird die immer erst nach meinem 2. Beitrag automatisch aktiviert.
Danke für Eure Tipps.
Wenn ich das richtig sehe, muss ich in das empfangende Skript eine Datenempfangsroutine einbauen. Für das Senden müsste ich mir ein Sender-Skript bauen, dem ich per Kommandozeile sagen kann: Schicke die und die Daten an das und das Skript.
Das Ganze ist überschaubar, aber trotzdem die Frage: Einfacher bzw. direkter geht es nicht? Konkret also:
- Neuaufruf des empfangenden Skriptes mit Parametern derart, dass das Skript nur die neuen Parameter sieht und nicht wirklich neu gestartet wird
oder
- Ansteuerung der WM_COPYDATA Funktionalität direkt aus VBA heraus
Ansonsten muss ich das eben über den Shell-Befehl in VBA ansteuern.
Viele Grüße, Halweg
sorry zunächst, dass ich mich jetzt erst melde. Ich stehe mit der Benachrichtigungsfunktion dieses Forums auf Kriegsfuß, konkret wird die immer erst nach meinem 2. Beitrag automatisch aktiviert.
Danke für Eure Tipps.
Wenn ich das richtig sehe, muss ich in das empfangende Skript eine Datenempfangsroutine einbauen. Für das Senden müsste ich mir ein Sender-Skript bauen, dem ich per Kommandozeile sagen kann: Schicke die und die Daten an das und das Skript.
Das Ganze ist überschaubar, aber trotzdem die Frage: Einfacher bzw. direkter geht es nicht? Konkret also:
- Neuaufruf des empfangenden Skriptes mit Parametern derart, dass das Skript nur die neuen Parameter sieht und nicht wirklich neu gestartet wird
oder
- Ansteuerung der WM_COPYDATA Funktionalität direkt aus VBA heraus
Ansonsten muss ich das eben über den Shell-Befehl in VBA ansteuern.
Viele Grüße, Halweg
Re: Übergabe von Parametern an laufendes Skript
Moin halweg!
P.S.: Ich habe gerade das hier gefunden. Es könnte also klappen
P.P.S.: Das hier (Antwort 1) ist auch nicht schlecht.
Das würde gehen, wenn VBA eine eigene SendMessage Funktion hat oder die aus der User32.dll ähnlich wie ein AHK DllCall aufrufen kann. Das Problem besteht dann aber darin, das HWND Handle des AHK-Fensters zu bestimmen.halweg wrote:... - Ansteuerung der WM_COPYDATA Funktionalität direkt aus VBA heraus ...
P.S.: Ich habe gerade das hier gefunden. Es könnte also klappen
P.P.S.: Das hier (Antwort 1) ist auch nicht schlecht.
Re: Übergabe von Parametern an laufendes Skript
Danke just me. Das wäre für mich ein richtiger Fortschritt. Denn, soweit ich das begreife, kann ich so auch Botschaften von AHK nach VBA übertragen.
Jetzt muss ich nur noch die entsprechende Funktionalität von AHK nach VBA übersetzen.
Jetzt muss ich nur noch die entsprechende Funktionalität von AHK nach VBA übersetzen.
Re: Übergabe von Parametern an laufendes Skript
Warum läßt Du das Skript mit der Gui nicht selbst das Datum nach Tastendruck (Hotkey) aus Excel holen? Dafür ist kein zweites Skript notwendig und auch keine andere Programmiersprache.
Re: Übergabe von Parametern an laufendes Skript
Danke Frosti fürs Mitdenken.
Allerdings, der Trigger liegt hier bei VBA. D. h. dort wird automatisch auf eine Eingabe reagiert (neues Datum) und letztlich soll das dort eingegebene Datum in einer Datumsliste des AHK-Skripts markiert werden.
Allerdings, der Trigger liegt hier bei VBA. D. h. dort wird automatisch auf eine Eingabe reagiert (neues Datum) und letztlich soll das dort eingegebene Datum in einer Datumsliste des AHK-Skripts markiert werden.
Re: Übergabe von Parametern an laufendes Skript
Könnte man eventuell ein COM-Event einrichten im GUI Skript. Habe mich mit Excel Events noch nicht beschäftigt bisher, daher weiß ich nicht welche Ereignisse von Excel gemeldet werden.
using Events with Excel-objects
using Events with Excel-objects
Re: Übergabe von Parametern an laufendes Skript
Na ja, die Excel-Ereignisroutine habe ich ja, muss eben nur noch das Datum nach AHK kriegen.
Re: Übergabe von Parametern an laufendes Skript
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.
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...
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...
Who is online
Users browsing this forum: No registered users and 4 guests