Variablen bei Parameter-Übergabe erhalten Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

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

Variablen bei Parameter-Übergabe erhalten

Post by Stroker-007 » 06 Jul 2022, 23:35

Hallo!

Ein Skript soll ständig laufen, von außen mit Parametern (oder was auch immer) gesteuert werden, und dabei aber seine bereits gesetzten Variablen für weitere Verwendung erhalten.

Code: Select all

; Datei c:\Var-Test\Var-Test.ahk

#SingleInstance Force
#Persistent

if 1 = Farben
   goto Farben

if 1 = Etwas
   goto Etwas

if 1 = VarStatus
   goto VarStatus

Return

Farben:
Var1 := "Rot"
MsgBox %Var1%

Var2 := "Gelb"
MsgBox %Var2%

Var3 := "Blau"
MsgBox %Var3%

VarStatus:
MsgBox Das sind meine Variablen:`n%Var1%, %Var2%, %Var3%
Return

Etwas:
FormatTime, Aktuell
MsgBox %Aktuell%:`nIch mache jetzt etwas anderes.
Return

Steuerung mit Parameterübergabe (oder wie auch immer), testhalber mit dieser Batchdatei:

Code: Select all

: Datei c:\Var-Test\Var-Test.bat

@echo off

:Menu
cls
echo.
echo.AHK-Variablen-Test
echo.
echo      F   Farben belegen
echo.
echo      E   Etwas anderes machen
echo.
echo      V   Variablen-Status abfragen
echo.
echo      X   Ende
echo.
choice /C FEVX /N /M "Druecke gewuenschten Buchstaben..."
if errorlevel 4 goto Ende
if errorlevel 3 goto VarStatus
if errorlevel 2 goto Etwas
if errorlevel 1 goto Farben
goto Ende
 
:Farben
start c:\Programme\AutoHotkey\AutoHotkey.exe c:\Var-Test\Var-Test.ahk Farben
goto Menu

:Etwas
start c:\Programme\AutoHotkey\AutoHotkey.exe c:\Var-Test\Var-Test.ahk Etwas	
goto Menu

:VarStatus
start c:\Programme\AutoHotkey\AutoHotkey.exe c:\Var-Test\Var-Test.ahk VarStatus
goto Menu

:Ende

Das Problem dabei ist, daß mit jedem (Fremd-)Aufruf das AHK-Skript (vermutlich) neu gestartet wird und damit alle bisherigen Variablen verliert.
Das Problem wäre gelöst, wenn das Batchmenü von oben nach unten durchgearbeitet wird und bei "V" immer noch "Rot, Gelb, Blau" als vorher gesetzte Variablen ausgibt. Dieses Skript ist ein vereinfachtes Testschema für ein sehr umfangreiches AHK-Skript, das von einer gut ausgebauten RemoteKeys-ButtonBar gesteuert werden soll.

Eine Krückenlösung wäre natürlich, die bei "F" gesetzten Variablen sofort in eine Datei zu schreiben und dann bei jedem neuen Durchlauf/Aufruf anfangs aus der Datei zu laden. Ungern.

Gibt es für das Problem eine reguläre Lösung, die ich nur noch nicht kenne?
Stroker-007

PS: Bitte jetzt nicht rückfragen, warum ich das nicht mit einem AHK-Button-Menü löse (würd ich liebend gerne), aber das ist in diesem Fall ein anderes Thema, das ich gerne in einem neuen Post vorstellen könnte.

just me
Posts: 9407
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Variablen bei Parameter-Übergabe erhalten

Post by just me » 07 Jul 2022, 04:23

Moin,

Kommandozeilenparameter werden nur beim Start einer Anwendung übergeben. Deshalb ist für dieses Verfahren ein (Neu)Start des Skripts unvermeidlich. Wenn Du das Skript unbedingt 'von außen' steuern willst, könntest Du die Parameterwerte in eine Datei schreiben, die vom Skript regelmäßig überprüft wird. Oder Du lässt ein weiteres Skript laufen, das die Parameter per SendMessage an das Hintergrundskript übergibt.

Alternativen wären die Steuerung über Hotkeys oder z.B. das Traymenü.

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Variablen bei Parameter-Übergabe erhalten

Post by BoBo » 07 Jul 2022, 09:26

@just me - wie wäre es mit einer client/server-lösung? :think:

just me
Posts: 9407
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Variablen bei Parameter-Übergabe erhalten

Post by just me » 07 Jul 2022, 09:41

@BoBo

Man kann natürlich auch per CMD ein AHK-Sript mit Parametern starten, das ausschließlich ebendiese Parameter an das Arbeitsskript sendet und sich dann verabschiedet.

Mir erschließt sich allerdings der 'tiefere Sinn' noch nicht. 'Fernsteuerung' bedeutet mit AHK normalerweise 'Hotkey'.

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

Re: Variablen bei Parameter-Übergabe erhalten

Post by Stroker-007 » 07 Jul 2022, 13:21

@just me
Alternativen wären die Steuerung über Hotkeys oder z.B. das Traymenü.
'Fernsteuerung' bedeutet mit AHK normalerweise 'Hotkey'.

Ja - aber in diesem Fall eben nicht.
Es gibt ein Leben jenseits von Hotkeys.
Bitte oben nochmal lesen:

...für ein sehr umfangreiches AHK-Skript, das von einer gut ausgebauten RemoteKeys-ButtonBar gesteuert werden soll.

Da möchte ich gerne sehen, wie Du das mit Hotkeys machen willst ohne einen Schluckauf zu bekommen...

Aber der Reihe nach, ich werde das Projekt mit Screenshots vorstellen, weiß nur noch nicht, ob hier im Anschluß oder als eigenes Thema. Denn es ist ein eigenes Thema, zu dem ich hier schon mit mehreren Anfragen Vorarbeit geleistet habe, und das mein Auslöser ist, überhaupt mit AHK angefangen zu haben.

Zunächst werde ich aber Deinen Tipp mit "SendMessage" und einem zusätzlichen parallel laufenden Skript untersuchen, das könnte funktionieren. Es geht nicht darum, einmalig eine Option rüberzuschieben, sondern um intensive Arbeitssitzungen, die dauernd Funktionen abrufen - ohne per Hotkeys (die obenderein längst ausgegangen sein dürften) Muskelkater zu bekommen.

Stroker-007
Last edited by Stroker-007 on 08 Jul 2022, 00:46, edited 1 time in total.

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Variablen bei Parameter-Übergabe erhalten

Post by BoBo » 07 Jul 2022, 14:55

…sondern um intensive Arbeitssitzungen, die dauernd Funktionen abrufen - ohne per Hotkeys (die obenderein längst ausgegangen sein dürften) Muskelkater zu bekommen.
Ein Grund, warum ich die Nutzung von mobile-devices als Tastaturersatz für vorteilhaft halte, da swapped/wechselt dann automatisch der Tastensatz abhängig von der Anwendung auf dem Desktop, und das ganze noch mit intuitiver Tastenbeschriftung, so das Tastenkombinationen nicht auswendig gelernt werden müssen. Dann noch hinter jeder Taste ein beliebiges Script geparkt und gut ist. JM2€ents ;)

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

Re: Variablen bei Parameter-Übergabe erhalten

Post by Stroker-007 » 08 Jul 2022, 00:32

@BoBo
Ja genau, zum Beispiel.
Aber laß Dich überraschen, werde ich demnächst schon noch was anderes tolles zeigen...

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

Re: Variablen bei Parameter-Übergabe erhalten

Post by Stroker-007 » 08 Jul 2022, 00:38

Also ich geh jetzt mal step-by-step vor.

Schritt 1:
Das Skript benötigt ein GUI-Steuerelement, das Text empfangen, bzw. an das Text gesendet werden kann.
Dieses GUI-Steuerelement sorgt auch dafür, daß das Skript erhalten bleibt, und somit auch seine erarbeiteten Variablen behalten kann.

Schritt 2:
Sodann muß es diesen Text als Variable in eine entsprechende Aktion umsetzen können, je nach Text.

Schritt 3:
Nach jeder Eingabe/Aktion braucht es abschließend (so testhalber nach 2000 msec) noch den Befehl, das Eingabefeld dieses GUI-Steuerelements zu löschen, um bereit für die nächste Eingabe zu sein.

Schritt 4:
Ein anderes AHK-Skript wird durch den Button (oder sonstwie, Batch etc.) einer externen Anwendung gestartet, um per "ControlSend, Steuerelement, Tasten, FensterTitel" einen spezifischen Text an das vorgenannte Eingabe-Steuerelement zu senden. Und fertig.

Jetzt erst mal 2 Versuche zu Schritt 1 + 2.
Folgendes funktioniert schon mal, mit g-Label:

Code: Select all

#SingleInstance Force

Gui, Font, s10
Gui, Add, Edit, gEingabe
Gui, Add, Button,, VariablenStatus prüfen
Gui, Show
Return

Eingabe:
Var1 := "rot"
MsgBox %Var1%
Return

ButtonVariablenStatusprüfen:
MsgBox Aktuell immer noch existierender Variablen-Inhalt:`n`n%Var1%`n`nZu gütigst, Euer Durchlaucht.
Return

Sehr schön, und auch lustig, weil kaum zuckt der Finger - schon fertig. Für meinen Zweck jedoch nicht brauchbar. Aber immerhin ein Beispiel dafür, in ein laufendes Skript nicht per (Button-)Klick, sondern per Text was auszulösen, das funktional etwas bewirkt, ohne daß das Skript neu gestartet wird und somit seine Variable, die mit dieser Aktion im Nachhinein erstellt wurde, behalten darf. Schon mal traumhaft.

Nächster Versuch: Mit einem v-Label würden wir der Sache schon näher kommen:

Code: Select all

#SingleInstance Force

Gui, Font, s10
Gui, Add, Edit, vEingabe
Gui, Add, Button,, VariablenStatus prüfen
Gui, Show
GuiControlGet Eingabe,, Eingabe

if Eingabe = rot
   goto rot

if Eingabe = gelb
   goto gelb

if Eingabe = blau
   goto blau

Return

rot:
Var1 := "rot"
MsgBox %Var1%
Return

gelb:
Var2 := "gelb"
MsgBox %Var2%
Return

blau:
Var3 := "blau"
MsgBox %Var3%
Return

ButtonVariablenStatusprüfen:
MsgBox Aktuell vorhandene Variablen:`n%Var1%, %Var2%, %Var3%
Return

Eingeben könne man, was man will. Erfolg haben sollten aber nur rot, gelb, oder blau.
Problem: Funktioniert noch nicht, was hoffentlich nur an meiner allzu unbedarften Formulierung liegt.

Wer kann helfen?

just me
Posts: 9407
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Variablen bei Parameter-Übergabe erhalten  Topic is solved

Post by just me » 08 Jul 2022, 03:28

Stroker-007 wrote:
...für ein sehr umfangreiches AHK-Skript, das von einer gut ausgebauten RemoteKeys-ButtonBar gesteuert werden soll.
Da möchte ich gerne sehen, wie Du das mit Hotkeys machen willst ohne einen Schluckauf zu bekommen...
Moin,

es kommt darauf an, was Deine RemoteKeys-ButtonBar auslösen kann. Wenn Sie z.B. beliebige Tastatureingaben generieren kann, kann sie wahrscheinlich auch Hotkeys auslösen.

Wenn Du den Weg über ein verborgenes Edit-Element gehen willst, solltest Du beim g-Label bleiben. Wenn das Edit 'von außen' gefüllt wird, ist der Text nach Änderung immer komplett vorhanden, wenn das g-Label aufgerufen wird.

Beispiel:

Arbeiter.ahk:

Code: Select all

#NoEnv
Var1 := Var2 := Var3 := ""

Gui, Add, Edit, w600 r1 vEingabe gNeuerBefehl
Gui, Show, Hide, RemoteKeys-ButtonBar-Worker-Skript
Return

NeuerBefehl:
   GuiControl, -g, Eingabe
   GuiControlGet, Eingabe
   Switch Eingabe {
      Case "Rot":
         Gosub Rot
      Case "Gelb":
         Gosub Gelb
      Case "Blau":
         Gosub Blau
      Case "Status":
         Gosub Status
      Case "Ende":
         Gosub Beenden
   }
   GuiControl, , Eingabe
   GuiControl, +gNeuerBefehl, Eingabe
Return

Beenden:
ExitApp

Rot:
   Var1 := "rot"
   MsgBox %Var1%
Return

Gelb:
   Var2 := "gelb"
   MsgBox %Var2%
Return

Blau:
   Var3 := "blau"
   MsgBox %Var3%
Return

Status:
   MsgBox, 0, Status, Aktuell vorhandene Variablen:`n%Var1%, %Var2%, %Var3%
Return
Chef.ahk:

Code: Select all

#NoEnv
Global Arbeiterfenster := "RemoteKeys-ButtonBar-Worker-Skript ahk_class AutoHotkeyGUI"
DetectHiddenWindows, On

Gui, Add, Button, w400 gAktion vBtnRot, Rot
Gui, Add, Button, w400 gAktion vBtnGelb, Gelb
Gui, Add, Button, w400 gAktion vBtnBlau, Blau
Gui, Add, Button, w400 gAktion vBtnStatus, Status
Gui, Add, Button, w400 gGuiClose vBtnEnde, Ende
Gui, Show, , Chef
Return

GuiClose:
   Send("Ende")
   ExitApp
Return

Aktion:
   Send(SubStr(A_GuiControl, 4))
Return

Send(Befehl) {
   If (HGUI := WinExist(Arbeiterfenster))
      ControlSetText, Edit1, %Befehl%, ahk_id %HGUI%
   Else
      MsgBox, 16, Fehler!, Das Arbeitsfenster konnte nicht gefunden werden
}

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

Re: Variablen bei Parameter-Übergabe erhalten

Post by Stroker-007 » 09 Jul 2022, 00:27

Vielen Dank, funktioniert großartig!

Chef.ahk ist aber nicht das, was ich letztlich brauche.
Mein Batch-Menü war nur zum Testen gedacht, damit Du nicht jedesmal mühsam die Zeilen in die cmd einklopfen mußt.
Ich benötige das nicht als (AHK)-GUI:

Chef.ahk teile ich auf in Auftraggeber.[wer auch immer] und Laufbursche.ahk
Und Arbeiter.ahk ist im Prinzip fast fertig so, ist aber eher als großes universelles Verarbeitungs-Zentrum.ahk zu verstehen.

Ich beschreib den Vorgang mal so:

Code: Select all

@echo off
goto start_Test

Der Auftraggeber (vormals "Chef.ahk") einer fremden Nation, die der AHK-Landessprache nicht mächtig ist, 
beaftragt seine Wünsche über das international anerkannte Übergabeprotokoll "Parameter" 
an den Laufburschen.ahk des fremden Landes "AutoHotKey".

Beispielsweise beauftragt das Land "StrokeIt" entsprechend seiner Landessprache so:
   Eingabefeld Datei: c:\Programme\AutoHotkey\AutoHotkey.exe
   Eingabefeld Argumente: c:\Var-Test\Laufbursche.ahk Ostereier

Das Land "RemoteKeys" würde entsprechend seiner Landessprache so formulieren:
   {/APP.OPEN c:\Programme\AutoHotkey\AutoHotkey.exe, c:\Var-Test\Laufbursche.ahk Ostereier gelb Schleife}

Und der Subkontinent DOS/Batch schreibt einfach nur:
   c:\Var-Test\Laufbursche.ahk Weihnachtsmann rot 

Warum kann es sich DOS/Batch leisten, so einfach zu schreiben?
Weil in diesem Subkontinent das Land "AutoHotKey" installiert, padon: bekannt ist, und deshalb *.ahk dort den Persilschein hat, 
während für die vorgenannten Nationen jedes fremde Land nur als *.exe konsultierbar ist.

Testhalber bleiben wir hier bei rot, gelb oder blau als Auftrags-Wünsche, weil das im VZ schon als Arbeitsziele besteht. 
Später können es dann "unendlich" viele Aufträge werden, wie es Wünsche und Worte zu formulieren gibt: 
Viele bunte Ostereier und Weihnachtsmänner, auch mal mit Ferrari  :superhappy: 

Und da ich nicht annehme, daß bei euch StrokeIt oder RemoteKeys zum Testen parat ist, …

; https://www.tcbmi.com/strokeit/ oder 
; https://www.chip.de/downloads/RemoteKeys_12995935.html

…schlage ich vor, die "Auftragsvergabe" per cmdline zu testen, z.B. damit und so:

:start_Test
c:\Var-Test\Laufbursche.ahk rot

REM Mehere Paameter gleichzeitig:
c:\Var-Test\Laufbursche.ahk rot gelb Tannenzapfen

Der Laufbursche.ahk versteht einerseits das internationale Übergabeprotokoll "Parameter", aber als AHK-Insider kann nur er die Auftrage in der AHK-Landessprache beim Verarbeitungs-Zentrum an der Auftragsannahme "Edit" einreichen. Ausländische Auftraggeber können das nicht direkt tun, deshalb gibt es den Job "Laufbursche".

Code: Select all

; Laufbursche.ahk

#NoEnv
Global Arbeiterfenster := "Verarbeitungs-Zentrum ahk_class AutoHotkeyGUI"
; "Arbeiterfenster" taucht nur hier auf. Wozu? Könnte es auch irgendein anderer Begriff sein, nur damit für "Global" was dasteht?

DetectHiddenWindows, On

MsgBox %1% %1% %2% %3% %4%;  vorübergehend zur Kontrolle, ob der Auftrag bei Laufbursche.ahk richtig angekommen ist 

ControlSetText, Edit1, %1%, ahk_id %HGUI% ;  der Auftrag wird sofort weitergereicht...
; Variante mehrere Parameter:
ControlSetText, Edit1, %1% %2% %3% %4%, ahk_id %HGUI% ;  müßte doch gehen, oder?


; ...und der Job von Laufbursche.ahk ist somit komplett beendet - bis zum nächsten Job. 
; Aber mit dieser Weitergabe ist das Verarbeitungs-Zentrum noch nicht einverstanden, es kommt nichts an,
; weil ich offensichtlich nicht in der Lage war, "Chef.ahk" erfolgreich zum bloßen "Laufbursche.ahk" zu degradieren.

Im VZ.ahk komm ich mit den 3 GuiControl-Befehlen nicht ganz klar, nur so vage.
Ich hab´s reingeschrieben:

Code: Select all

; VZ.ahk

#NoEnv
Var1 := Var2 := Var3 := "" ;  etwas verwirrend hier, sind wohl die VZ-internen Variablen gemeint, die Anfangs leer gemacht werden. Krieg ich dann schon hin...
;  wichtiger wären erst mal die zu übergebenden Variablen, sagen wir 4 Stück, siehe oben, die jedoch nicht alle besetzt sein MÜSSEN
; ich würde dann unten die Formulierung bevorzugen:
; if 1= Sonne
;    goto Sonne       
; if 2= Mond
;    goto Mond 
;  usw... einfach und klar, geht aber sicher auch mit Case und GoSub

Gui, Add, Edit, w600 r1 vEingabe gNeuerBefehl
Gui, Show, Verarbeitungs-Zentrum
Return

NeuerBefehl:
   GuiControl, -g, Eingabe ;  Entfernt das g-Label des Steuerelements "Eingabe". 
                           ;  Aber "Eingabe" ist doch ein v-Label? Wieso kommt hier "g" ins Spiel? Was ist hier "g"?
                           ;  "gNeuerBefehl" ist ja nur ein Sprungbefehl. Warum sollte der entfernt werden? 

   GuiControlGet, Eingabe ;  ruft den Wert der Variable "Eingabe" ab und verarbeitet ihn unter Switch... OK, versteh ich.
   Switch Eingabe {
      Case "Rot":
         Gosub Rot
      Case "Gelb":
         Gosub Gelb
      Case "Blau":
         Gosub Blau
      Case "Status":
         Gosub Status
      Case "Ende":
         Gosub Beenden
   }
   GuiControl, , Eingabe ;  bitte erklären
   GuiControl, +gNeuerBefehl, Eingabe ;  bitte erklären
Return

Beenden:
ExitApp

Rot:
   Var1 := "rot"
   MsgBox %Var1%
Return

Gelb:
   Var2 := "gelb"
   MsgBox %Var2%
Return

Blau:
   Var3 := "blau"
   MsgBox %Var3%
Return

Status:
   MsgBox, 0, Status, Aktuell vorhandene Variablen:`n%Var1%, %Var2%, %Var3%
Return

Also Laufbursche.ahk ist nur eine kurze Sache, läuft pro Auftrag 1x durch und fertig.
Soll aber bis zu 4 Parameter handeln können, wie oben bei Auftraggeber schon angedeutet.
Und "Edit" muß dann in der 1-Zeiler-GUI entsprechend 4 Parameter annehmen können.
Der Rest geht klar, kann ich dann selber machen.

Was ich nicht wirklich verstehe, ist bei Chef.ahk der Aktionsteil nach dem GUI-Part. Aber in der Laufbursche.ahk fällt das eh weg. Aber weil ich es nicht verstehe, war ich wohl noch nicht in der Lage, den Laufburschen funktionsfähig zu formulieren, oder auch das Eingabemodul "Edit" entsprechend anzupassen, weil ich dort mit 3x GuiControl nicht klarkomme.

Bitte nochmal helfen.
Danke!

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Variablen bei Parameter-Übergabe erhalten

Post by BoBo » 09 Jul 2022, 02:21

Für mich bleibt der Knackpunkt die zeitgleiche Übergabe von mehreren Variablen über eine einzelne Eingabezeile. Resultierend daraus wäre eine strikte Vorgabe (Spezifikation) der Übergabeparameter, oder überbordende Validierung notwendig. AFAICS, hat das @just me über statische Werte/Buttons eingeschränkt.

Chef.ahk gibt (statische) Anweisungen via Button.
Arbeiter.ahk, übernimmt diese in einer 'hidden'-Gui über das Eingabefeld/-Control 'Edit1' (das AHK-Gui agiert gemäß Windows-Standard als gewöhnliches Fenster und wird hier über die Variable "Arbeiterfenster" deklariert. In der Send()-function wird gegen dieses Fenster validiert). Die unsichtbare/"nicht existente" GUI dient lediglich der Kommunikation zwischen den scripten. Soweit ich erinnere wolltest du genau dies umsetzen?! :think:
Während der Übergabe wird der Sprungbefehl "gNeuerBefehl" sukzessive mittels GuiControl, -g, Eingabe bzw. GuiControl, +gNeuerBefehl, Eingabe (für das GUI-Edit mit der Benennung 'Eingabe') getoogled (aus-/angeschaltet) vermutlich um Überschneidungen durch "zu dicht aufeinanderfolgende Chef-Tastendrücke" zu unterbinden.

Soweit macht @just me's Ansatz für mich Sinn. :thumbup:

Was für mich weniger Sinn macht, während einer Kommunikation die Benennung von Bestandteilen des Dialogs ständig zu wechseln, was IMHO nur Verwirrung stiftet. Chef/Arbeiter/Laufbursche/Landessprache/Nation/Übergabeprotokol/Parameter/Auftragsannahme/Verarbeitungszentrum/... AKA "Bahnhof" :crazy:

Aus reichlich Text interpretiere ich: ein switchboard, welches Zuordnungen vornimmt, z.B. Übernahme einer Kommmandozeile, welche eine Anzahl von switches/parameters enthält, wird abhängig von den "örtlichen Gegebenheiten" (Laufzeitumgebung) unterschiedlich ausgeführt?

just me
Posts: 9407
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Variablen bei Parameter-Übergabe erhalten

Post by just me » 09 Jul 2022, 04:40

Moin,

das mein Chef.ahk nicht der von Dir gewünschte Chef ist, war mir klar. Es handelt sich ja nur um ein Beispiel dafür, wie die 'Anweisungen' an den Arbeiter übergeben werden. Ob das der Chef selbst tut oder damit einen Laufburschen beauftragt, ist letztlich egal.

Wie auch immer, damit die Anweisung übergeben werden kann, muss man den richtigen Arbeiter erst einmal finden. Dafür ist es hilfreich, wenn die Arbeiter Namensschilder tragen. Als Namensschild dient im Beispiel der Fenstertitel.

Der Titeltext ist hier Verarbeitungs-Zentrum. Um das noch eindeutiger zu machen wird dem Titel die Fensterklasse (ahk_class) hinzugefügt. Alle AHK Guifenster haben die Klasse AutoHotkeyGUI. Der komplette Name ist deshalb

Code: Select all

Global Arbeiterfenster := "Verarbeitungs-Zentrum ahk_class AutoHotkeyGUI"
Global habe ich gewählt, weil mein Chef die Anweisungen mit einer Funktion erteilt: Send(). Außerhalb einer Funktion definierte Variablen müssen innerhalb oder außerhalb der Funktion als Global erklärt werden, damit die Funktion sie sehen kann.

Innerhalb von Send() wird versucht, über den Namen (Titel) das Handle des Fensters (HGUI)zu ermitteln. Wenn das fehlschlägt, gibt es eine Fehlermeldung. Ansonsten wird die Anweisung an das Verarbeitungs-Zentrum übergeben.

Wenn Du das ohne Funktion machen willst, wäre eine Alternative:

Code: Select all

ControlSetText, Edit1, %1%, Verarbeitungs-Zentrum ahk_class AutoHotkeyGUI
If (ErrorLevel)
    MsgBox, 16, Der Bote meldet, Fehler: Das Verarbeitungsfenster konnte nicht gefunden werden
In jedem Fall brauchst Du die Anweisung

Code: Select all

DetectHiddenWindows, On
weil das Verarbeitungsfenster versteckt ist.

Wenn Du mehrere Parameter an ein Edit übergeben willst, brauchst Du ein Trennzeichen, das in keiner Anweisung vorkommt. Beliebt sich Sonderzeichen wie |. Im Verarbeitungsskript kannst Du die Parameter dann per StrSplit() isolieren.

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

Re: Variablen bei Parameter-Übergabe erhalten

Post by Stroker-007 » 10 Jul 2022, 00:48

@BoBo

Stimme Dir zu, daß der Namens-Wirrwar verwirrend ist. Ist normalerweise auch nicht meine Art.
Vermutlich wollte ich nur meine Absichten etwas plastischer zeigen, denn diese "Chef"-Geschichte hatte es nicht getroffen.
Aber ich verstehe jetzt, daß just me das eher als grundlegende Demo gedacht hat, was für mich sicher zusätzlich nützlich ist.

Danke für die Erklärungen zu den "GuiControl´s":
Während der Übergabe wird der Sprungbefehl "gNeuerBefehl" sukzessive mittels GuiControl, -g, Eingabe bzw. GuiControl, +gNeuerBefehl, Eingabe (für das GUI-Edit mit
der Benennung 'Eingabe') getoogled (aus-/angeschaltet) vermutlich um Überschneidungen durch "zu dicht aufeinanderfolgende Chef-Tastendrücke" zu unterbinden.

Es wird für mich etwas plausibler, aber immer noch nicht recht greifbar, so daß ich genau wüßte, was Sache ist.
Ich hab es mal genau an die Stellen reingeschrieben, wie ich es jetzt verstehe:

Code: Select all

#NoEnv
Var1 := Var2 := Var3 := ""

Gui, Add, Edit, w600 r1 vEingabe gNeuerBefehl
Gui, Add, Button, gVarTest, VarTest 
Gui, Show, Hide, RemoteKeys-ButtonBar-Worker-Skript
Return

NeuerBefehl:

; Doku: GuiControl, Unterbefehl, SteuerelementID 
; Frage zu nachfolgender Verwendung: Ich dachte, "vEingabe" ist eine Variable. Ist "Eingabe" nun eine Variable oder ein SteuerelementID ?

   GuiControl, -g, Eingabe
; schaltet "gNeuerBefehl" aus, damit - lt. Bobo - der nachfolgende Leseprozeß durch möglicherweise schnellfolgende weitere Befehle nicht gestört wird. 
; "-g" ist eine Sparschreibweise von gradso "-gNeuerBefehl" - richtig? Das "-" heißt ausschalten, weiß ich, hoff ich doch.

   GuiControlGet, Eingabe ;  macht die GUI-Variable "vEingabe" zu einer normalen, skriptweiten Variable namens "Eingabe" - richtig?
   Switch Eingabe {
      Case "Rot":
         Gosub Rot
      Case "Gelb":
         Gosub Gelb
      Case "Blau":
         Gosub Blau
      Case "Status":
         Gosub VarTest
      Case "Ende":
         Gosub Beenden
   }

; Doku: GuiControl Unterbefehle: (Leer): Fügt neue Inhalte in das Steuerelement ein.
; Ich dachte - siehe oben -, daß lediglich "gNeuerBefehl" ausgeschaltet wurde?
; Hat "GuiControl, -g, Eingabe" möglicherweise v"Eingabe" sogar entfernt? 
; Dann würde für mich lt. Doku nachfolgender Befehl Sinn machen: ist weg - muß wieder her:

   GuiControl, , Eingabe ;

; und was - bitte ganz genau - mach dann das noch: 
  
   GuiControl, +gNeuerBefehl, Eingabe ;  "+" schaltet wieder ein - ja- aber was jetzt genau?
 
 ; kann es sein, daß bei der ganzen Prozedur 2 Sachen gemacht wurden:  
 ; "vEingabe" wurde entfernt und wieder eingefügt UND "gNeuerBefehl" wurde AUS und wieder EIN-geschaltet?
   
Return
...

Wo ich daneben liege, erklär mit bitte in normaler "ToDo"-Sprache, was exakt passiert und warum. So richtig für Dumme: Da ist das, dann kommt das weg und dahin, weil sonst..., und danach wird dann dieses dorthin, damit wieder...etc. Nichts auslassen oder voraussetzen. Damit ich es richtig verstehe und in Zukunft auch selbständig benutzen kann. Danke!

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

Re: Variablen bei Parameter-Übergabe erhalten

Post by Stroker-007 » 10 Jul 2022, 00:51

@just me
1000 Dank! Das hat es genau getroffen, damit läuft es jetzt:

Code: Select all

#NoEnv
Global Arbeiterfenster := "RemoteKeys-ButtonBar-Worker-Skript ahk_class AutoHotkeyGUI"
DetectHiddenWindows, On

ControlSetText, Edit1, %1%, RemoteKeys-ButtonBar-Worker-Skript ahk_class AutoHotkeyGUI
If (ErrorLevel)
    MsgBox, 16, Der Bote meldet, Fehler: Das Verarbeitungsfenster konnte nicht gefunden werden

Das mit den Parametern muß ich erst noch untersuchen.

just me
Posts: 9407
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Variablen bei Parameter-Übergabe erhalten

Post by just me » 10 Jul 2022, 05:37

Moin,

wenn Du die Variante mit direkter Titelangabe im 3. Parameter von ControlSetText nutzt, kannst Du auf die globale Variable Arbeiterfenster verzichten. Die Alternative wäre

Code: Select all

ControlSetText, Edit1, %1%, %Arbeiterfenster%
Der 2. Parameter übergibt den neuen Text. Der 1. Parameter identifiziert das Steuerelement.

AHK bietet die Möglichkeit, ein Steuerelement über eine sogenannte ClassNN zu identifizieren. Das ist die (Windows-)Klasse des Elements (Class) und die laufende Nummer bei mehreren Elementen mit derselben Klasse in einem Elternfenster (NN). Editelemente haben immer die Klasse Edit. Und weil das Verarbeitungsfenster nur ein Editelement enthält, braucht man über die laufende Nummer nicht lange nachzudenken: Es ist die 1. Daraus ergibt sich die eindeutige ClassNN Edit1.

Zu den GuiControl Anweisungen:
Das Verfahren mit der Option -g/+g... wird genutzt, um unerwünschte Unterbrechungen einer laufenden Subprozedur zu verhindern. Außerdem wird verhindert, dass die Subprozedur erneut aufgerufen wird, wenn sie selbst Ereignisse auslöst, die zu ihrem Aufruf führen. In diesem Fall würde das abschließende Löschen des Edits mit

Code: Select all

  GuiControl, , Eingabe
das g-Label erneut aufrufen.

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

Re: Variablen bei Parameter-Übergabe erhalten

Post by Stroker-007 » 11 Jul 2022, 00:15

Danke!

Das %Arbeiterfenster% muß aber dann ohne die Prozentigen sein ;-)

Code: Select all

ControlSetText, Edit1, %1%, Fenstername

Die GuiControl-Anweisungen sind jetzt auch klar soweit.

Was ist jetzt vom Nutzen her der Unterschied zwischen "mit Global" und "ohne", also mit Fenstertitel direkt? Schätze, es sind (für meinen Fall) nur Formulierungs-Alternativen. Insofern nehm ich die direkt-Variante, weil warum mehr machen, wenn´s einfacher genauso geht.

Werde das Ganze jetzt erstmal in meine Peripherie einbauen und dabei sehen, ob das evtl. mit einem 2. etc. Parameter nötig wird oder auch nicht.
Melde mich dann womöglich nochmal hier - oder auch nicht :-)

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

Re: Variablen bei Parameter-Übergabe erhalten

Post by Stroker-007 » 12 Jul 2022, 23:50

@just me

Das mit einem 2. Parameter (und dann weiteren) war/ist kein großes Problem: Für jeden gibt´s hüben wie drüben eine extra Zeile.
Außerdem habe ich die ganze Sache vereinfacht.

Die Schalter (eingangs Parameter), die Bote.ahk übergibt, haben inhaltlich ja nichts mit den Variablen (z.B. "V4_ID") zu tun, die im Verlauf der Sitzung erarbeitet und auch geändert werden, und die während der ganzen Sitzung erhalten bleiben sollen.

Nachfolgend ein Beispiel.
Funktioniert perfekt.

Code: Select all

; Bote

#NoEnv
DetectHiddenWindows, On

start:
ControlSetText, Edit1, %1%, Arbeit
ControlSetText, Edit2, %2%, Arbeit

if (ErrorLevel)
{
   run Arbeit.ahk
   sleep 200
   goto start
}
else
   Exit

Code: Select all

; Arbeit.ahk

#SingleInstance Force
#NoEnv
SendMode input

Gui, Font, s10 
Gui, +AlwaysOnTop

Gui, Add, Edit, vS1              ;  S1 = Schalter1, ehemals Parameter 1
Gui, Add, Edit, vS2 gEinlesen    ;  S2 = Schalter2, ehemals Parameter 2 

Gui, Add, Button, gEXIT, EXIT

Gui, Show, Hide, Arbeit
;Gui, Show, , Arbeit ;  nur zum testen

Return

Einlesen:
  GuiControlGet, S1  
  GuiControlGet, S2
  ;MsgBox %S1% - %S2% ;  nur zum testen
  goto JobCenter

EXIT:
  ExitApp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
JobCenter:          ; ein paar Beispiele:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; ...

if S1 = aV1
{
   WinActivate ahk_id %V1_ID%
   Return
}

; ...

if S1 = pV4
{
   WinActivate ahk_id %V4_ID%
       WinWait ahk_id %V4_ID%
   send {space} 
   Run AutoArrange.ahk
   Return
}

; ...

if S1 = zV6
{
   WinGet, V6_ID, ID, A
   WinMove, ahk_id %V6_ID%, , -2130, 1300
   send !{enter}
   if S2 = Spez 
      Run Spezify.ahk
   Return
}

; ...

; and the story go on and on and so on...

just me
Posts: 9407
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Variablen bei Parameter-Übergabe erhalten

Post by just me » 13 Jul 2022, 04:03

Stroker-007 wrote:
11 Jul 2022, 00:15
Danke!
Das %Arbeiterfenster% muß aber dann ohne die Prozentigen sein ;-)
Moin,
wenn der Name des Fensters in der Variablen Arbeiterfenster steht, muss der Variablenname in der Anweisung ControlSetText sehr wohl in %-Zeichen eingeschlossen werden (oder es muss mit einem einzelnen %-Zeichen ein Ausdruck 'erzwungen' werden).

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

Re: Variablen bei Parameter-Übergabe erhalten

Post by Stroker-007 » 13 Jul 2022, 11:45

Ja klar, aber in der Variable vom Bote.ahk steht ja nur ein Schalter, keine Variable. Ist deshalb nach dem Schaltereignis auch nicht weiter erhaltenswert.
Und ControlSetText ... "Fenstertitel" muß keine Variable sein, wenn er nicht will. Also so versteh ich das.

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Variablen bei Parameter-Übergabe erhalten

Post by BoBo » 13 Jul 2022, 12:55

Und ControlSetText ... "Fenstertitel" muß keine Variable sein, wenn er nicht will. Also so versteh ich das.
Die Zeiten als ich @just me's Erklärungen angezweifelt habe sind gefühlte 10000 Jahre her. Nichts gegen gesunden Zweifel,… doch der Saat der Erkenntnis ein bis’chen Zeit lassen - kann schon mal helfen. Mir hilft's meistens. Eigentlich immer. OK. Oft. :mrgreen:

Post Reply

Return to “Ich brauche Hilfe”