Übergabe von Parametern an laufendes Skript

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

halweg
Posts: 72
Joined: 17 Apr 2018, 10:34
Location: Dresden

Übergabe von Parametern an laufendes Skript

27 Oct 2020, 07:02

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
BoBo
Posts: 4362
Joined: 13 May 2014, 17:15

Re: Übergabe von Parametern an laufendes Skript

27 Oct 2020, 08:06

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 :)
just me
Posts: 7747
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Übergabe von Parametern an laufendes Skript

27 Oct 2020, 12:10

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.
halweg
Posts: 72
Joined: 17 Apr 2018, 10:34
Location: Dresden

Re: Übergabe von Parametern an laufendes Skript

10 Nov 2020, 04:17

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
just me
Posts: 7747
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Übergabe von Parametern an laufendes Skript

10 Nov 2020, 05:59

Moin halweg!
halweg wrote:... - Ansteuerung der WM_COPYDATA Funktionalität direkt aus VBA heraus ...
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.

P.S.: Ich habe gerade das hier gefunden. Es könnte also klappen

P.P.S.: Das hier (Antwort 1) ist auch nicht schlecht.
halweg
Posts: 72
Joined: 17 Apr 2018, 10:34
Location: Dresden

Re: Übergabe von Parametern an laufendes Skript

10 Nov 2020, 06:34

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.
User avatar
Frosti
Posts: 379
Joined: 27 Oct 2017, 14:30
GitHub: Ixiko

Re: Übergabe von Parametern an laufendes Skript

11 Nov 2020, 01:49

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.
halweg
Posts: 72
Joined: 17 Apr 2018, 10:34
Location: Dresden

Re: Übergabe von Parametern an laufendes Skript

11 Nov 2020, 01:54

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.
User avatar
Frosti
Posts: 379
Joined: 27 Oct 2017, 14:30
GitHub: Ixiko

Re: Übergabe von Parametern an laufendes Skript

11 Nov 2020, 06:22

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
halweg
Posts: 72
Joined: 17 Apr 2018, 10:34
Location: Dresden

Re: Übergabe von Parametern an laufendes Skript

11 Nov 2020, 06:29

Na ja, die Excel-Ereignisroutine habe ich ja, muss eben nur noch das Datum nach AHK kriegen.
halweg
Posts: 72
Joined: 17 Apr 2018, 10:34
Location: Dresden

Re: Übergabe von Parametern an laufendes Skript

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...

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 3 guests