Auf verschiedene Tastendrücke warten

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Autohotkey1962
Posts: 54
Joined: 02 Jan 2020, 04:21

Auf verschiedene Tastendrücke warten

Post by Autohotkey1962 » 10 Oct 2020, 15:46

Ich würde gern einen Loop programmieren, der, bevor der Loop fortgesetzt wird, auf einen Tastendruck warten soll.
Ich möchte es allerdings so haben, dass ich alternativ diverse Tasten drücken kann, damit der Loop fortgesetzt wird.
Mein Loop sieht derweil so aus:

Code: Select all

Loop
{
If(F = s1) { 
  PushButton(pb) ; Diesen definierten Button drücken 
s1 :=s1+1
pb :=pb+1
}    

KeyWait, Return, D
    }
Es sollen aber auch die Tasten H und M den Loop fortsetzen können und nicht nur die Enter-Taste.
Alternativ kann auch auf eine x beliebige Taste und/oder Button gewartet werden.

Wie kann ich das anstellen?

Herzlichen Dank für Eure Hilfe.


Autohotkey1962
Posts: 54
Joined: 02 Jan 2020, 04:21

Re: Auf verschiedene Tastendrücke warten

Post by Autohotkey1962 » 11 Oct 2020, 03:37

Ja, da habe ich auch dran gedacht. Aber dann müsste ich doch sicher erst einmal den Loop mit "break" unterbrechen, dann den GetKeyState Befehl setzen und bei einem abgefragten und bestimmten Status des Befehls ein "continue" geben.

Kann ich denn mit If Befehlen die GetKeyState Befehle "stapeln"?
Ich benötige da doch mehrere Abfragen, also
wenn GetKeyState H dann continue
oder wenn GetKeyState M dann continue

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

Re: Auf verschiedene Tastendrücke warten

Post by BoBo » 11 Oct 2020, 13:56

Kann ich denn mit If Befehlen die GetKeyState Befehle "stapeln"?
Sollte gehen. Gibts denn schon weiteren Code?

aifritz
Posts: 301
Joined: 29 Jul 2018, 11:30
Location: Germany

Re: Auf verschiedene Tastendrücke warten

Post by aifritz » 11 Oct 2020, 14:18

verstehe zwar nicht, was Dein Code genau bewirken soll, aber so vielleicht...

Code: Select all

Loop {
    If(F = s1) { 
      PushButton(pb) ; Diesen definierten Button drücken... -> das wäre dann eine Funktion? 
      s1++,  pb++
    }    
    Sleep 100
    Loop {
        if (GetKeyState("Enter") || GetKeyState("H") || GetKeyState("M"))
            break 
        sleep 100
    }
}

Autohotkey1962
Posts: 54
Joined: 02 Jan 2020, 04:21

Re: Auf verschiedene Tastendrücke warten

Post by Autohotkey1962 » 11 Oct 2020, 16:05

Also, erst einmal vielen dank für die Hilfe:
@aifritz: Der Code soll folgendes tun:

Er soll bei einer Software aus der Ferne über eine Fernbedienung, die über eine Einstellungssoftware jede beliebige Taste simulieren kann, verschiedene Button drücken. Da jedoch die Button nicht per Taste, sondern nur per Mausklick bedient werden können, muss ich mir was einfallen lassen, dass es doch über einen Umweg geht. Das funktioniert auch schon prima. Bisher habe ich es jedoch in der Testphase so gemacht, dass ich über eine If Anweisung die Button gedrückt habe.

Code: Select all

If(Setting = 1) {  PushButton(1) 
 }
 Else If(Setting = 2) { PushButton(2) 
}
Das will ich aber nicht beispielsweise für 30 Button niederschreiben und würde den Code auch unnötig aufblähen. Daher möchte ich das ganze mit einem Loop angehen. Es soll also zunächst der erste Button gedrückt werden, dann muss festgestellt werden, ob eine der drei Fernbedienungstasten gedrückt wurde, bevor der nächste Button gedrückt wird etc.

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

Re: Auf verschiedene Tastendrücke warten

Post by BoBo » 12 Oct 2020, 01:13

Welche Software erlaubt denn die Bedienung von Buttons nur per Mausklick??

Autohotkey1962
Posts: 54
Joined: 02 Jan 2020, 04:21

Re: Auf verschiedene Tastendrücke warten

Post by Autohotkey1962 » 12 Oct 2020, 01:34

Das ist eine ältere Lichtsteuersoftware, die normalerweise eben von einem Lichttechniker bedient wird, sodass eine Tastatursteuerung nicht notwendig war. Diese Software ist jedoch für meine Zwecke am Besten geeignet, weil ich sie seit fast 20 Jahren nutze und daher in und auswendig kenne, was die Programmierung der Szenen und Lichteffekte betrifft. Und es ist für mich und meine Bedürfnisse Unsinn, da etwas zu ändern. Never change a running system ist da mein Credo. Das letzte Update der Software liegt schon 5 Jahre zurück. Sie wird auch nicht mehr weiterentwickelt.
Das halt zur Beantwortung Deiner Frage.
Da ich mittlerweile viel allein unterwegs bin, will ich das Licht nun auch allein steuern. Wie gesagt, es klappt eigentlich sehr gut. Aber wenn ich eine Lichtszene hinzugeben will, muss ich jedes mal in das Script und Zeilen hinzufügen. Das möchte ich mir ersparen, indem ich diese Loopschleife einbauen möchte. Dann kann ich sämtliche IF Else Abfragen bzgl. der Button löschen und der Code wird nicht weiter aufgebläht.

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

Re: Auf verschiedene Tastendrücke warten

Post by BoBo » 12 Oct 2020, 02:51

Never change a running system ist da mein Credo.
Da möchte ich mal ein
Don't beat a dead horse!
dagegenhalten. ;)
Mir fehlt für weitergehenden Support jedoch der Code. Codeschnipsel, mit z.B. Funktionsaufruf, ohne jedoch sehen zu können was die Funktion (das Herzstück deines Prozesses) eigentlich macht, ist IMHO nur bedingt hilfreich.

Code: Select all

Global buttons := {1:[10,10],2:[20,10],3:[30,10]}   ; {button:[xChoord,yChoord], ...}
PushButton(Setting)

PushButton(bNo) {
	bNo != 0
		MouseClick, Left, buttons[bNo][1], buttons[bNo][2], 2
	}

Autohotkey1962
Posts: 54
Joined: 02 Jan 2020, 04:21

Re: Auf verschiedene Tastendrücke warten

Post by Autohotkey1962 » 12 Oct 2020, 03:02

Ich habe jetzt mal den Gesamtcode eingestellt. Vielleicht hilft das, alles besser zu verstehen. Wobei beim Loop der "LastSetting" Wert wegfallen kann. Dieser wurde von mir nur willkürlich gewählt, damit das Script nach der Show selbst beendet. Ist so zu sagen nur ein "Nice to have".

Der Teil, wo die Abfragen stattfinden und die Button gedrückt werden Beginnt dort, wo der Kommentar "Definitionen der einzelnen Settings" steht, muss durch die Loopfunktion ersetzt werden.

Code: Select all

;************************************************************** 
;   BENUTZER-VORGABEN 
;************************************************************** 
    FirstSetting := 1   ; Erster Wert
    LastSetting  := 42   ; letzter Wert, der möglich sein soll
;************************************************************** 


;************************************************************** 
;   Admin-Modus sicherstellen 
;************************************************************** 
    If(!A_IsAdmin) {                    ; Wenn Script nicht als Admin ausgeführt wird... 
        Run *RunAs "%A_ScriptFullPath%" ; ...dann erneut starten, aber als Admin. 
        ExitApp                         ; Diese Instanz des Scriptes beenden 
    } 


;************************************************************** 
;   Hintergrundfenster in den Vordergrund holen 
;************************************************************** 
If !WinExist("Lightsoftware") { 
        MsgBox, 4112, ERROR, Lightsoftware wurde nicht gefunden!Das Script wird beendet... 
        ExitApp 
    } Else WinActivate, Lightsoftware   


    If !WinExist("Buttonbox") { 
        MsgBox, 4112, ERROR, Buttonbox wurde nicht gefunden!`nDas Script wird beendet... 
        ExitApp 
    } Else WinActivate, Buttonbox




;************************************************************** 
;   farbige Rahmen für Buttons erstellen. Die Button sollen farbig gekennzeichnet werden, 
    damit gesehen werden kann, welcher Buton aktiv ist und welcher aktiv werden wird.
;************************************************************** 
    Gosub BuildButtonFrames 

;*********************************************************************************************** 
    Return  ; Ende des AutoExec-Teils 
            ; Ab hier folgen HotKeys, HotStrings, Funktionen usw. 
;*********************************************************************************************** 


;=============================================================================================== 
;   HotKey Enter -> Vor / Z -> Zurück 
;=============================================================================================== 
 
        z::   
        x::
        y::
    Enter::
   
    ;--------------------------------------------------------------------------------------- 
    ;Zwischen den Settings mit hin und her schalten. Wird benötigt, falls man sich beim Drücken vertan
     hat und man ggf. vor oder zurückspringen muss.
    ;--------------------------------------------------------------------------------------- 
    
    If( A_ThisHotkey = "z" ) { ; Wenn Z gedrückt wurde 
         Setting := ( Setting <= FirstSetting ) ? LastSetting : Setting - 1 ; ein Setting zurück 
    } Else If( A_ThisHotkey = "Enter" ) { ; anderenfalls, wenn Enter gedrückt wurde 
        Setting := ( Setting >= LastSetting || Setting < FirstSetting ) ? FirstSetting : Setting + 1 ; ein Setting vor 
    } Else If( A_ThisHotkey = "x" ) { ; Wenn X gedrückt wurde 1 vorspringen
        Setting := ( Setting + 1 > LastSetting ) ? Setting + 1 - LastSetting : ( Setting < FirstSetting ? 1 : Setting + 1 )
    } Else If( A_ThisHotkey = "y" ) { ; Wenn y gedrückt wurde 3 vor 
        Setting := ( Setting + 3 > LastSetting ) ? Setting + 3 - LastSetting : ( Setting < FirstSetting ? 3 : Setting + 3 )
    } 

 
If( A_ThisHotkey = "z" )  
        WinActivate, Buttonbox
  If( A_ThisHotkey = "x" )
        WinActivate, Buttonbox
If( A_ThisHotkey = "y" )
        WinActivate, Buttonbox

    

    ;--------------------------------------------------------------------------------------- 
    ;Definition der einzelnen Settings 
    ;--------------------------------------------------------------------------------------- 
if(Setting = 0) {

 }If(Setting = 1) { 
        ;Alle Aktionen die zum Setting #1 gehe 
  
        PushButton(1) ; Diesen Button in der Buttonbox drücken 
 
 
        



    } Else If(Setting = 2) { 
        ;Alle Aktionen die zum Setting #2 gehe 
        PushButton(2) ; Diesen Button in der Buttonbox drücken 
     

       
        

    } Else If(Setting = 3) { 
        ;Alle Aktionen die zum Setting #3 gehe
        PushButton(3) ; Diesen Button in der Buttonbox drücken 
      
        

    } Else If(Setting = 4) { 
        ;Alle Aktionen die zum Setting #4 gehe 
        PushButton(4) ; Diesen Button in der Buttonbox drücken 
      
        
      

        
  
    } Else If(Setting = 5) { 
        ;Alle Aktionen die zum Setting #5 gehe 
        PushButton(5)
       
        
       

    } Else If(Setting = 6) { 
        ;Alle Aktionen die zum Setting #6 gehe 
        PushButton(6)
        
      

    } Else If(Setting = 7) { 
        ;Alle Aktionen die zum Setting #7 gehe 
        PushButton(7) 
        
  ; Diese If Else Anweisungen können bis 42 Schritte fortgeführt werden.

    Return  ; ENDE HotKeys
;=============================================================================================== 



;=============================================================================================== 
;#  FUNKTION    PushButton(x) 
;#              x ist die Ziffer, die dem Button in der Buttonbox entspricht. Zählung beginnt 
;#              oben links. 
;#              Als Funktion ausgelagert, um innerhalb der Settings weniger Code und damit mehr 
;#              üersicht zu haben. Zwischen Klicken und Loslassen befindet sich eine Pause, 
;#              damit der Klick auf den Button deutlich sichtbar wird. 
;=============================================================================================== 
    PushButton(N) { 
        If !WinActive("Buttonbox") 
            WinActivate, Buttonbox
        WinGetPos, wX, wY,,, Buttonbox
        ControlClick, ThunderRT6UserControlDC%N%, Buttonbox,,,, D ; Button drücken 
        Sleep, 300 ; kurze Pause, um die Tastenbewegung sichtbar zu machen 
        ControlClick, ThunderRT6UserControlDC%N%, Buttonbox,,,, U ; ; Button loslassen 
        ControlGetPos, X, Y,,, ThunderRT6UserControlDC%N%, Buttonbox 
        WinMove, GreenFrame,, wX+X , wY+Y 
        ;TrayTip, Button #%N%,%A_Space%  ; Bubble im Tray anzeigen 
    } 
;=============================================================================================== 

BuildButtonFrames: 
    ControlGetPos,,, W, H, ThunderRT6UserControlDC1, Buttonbox 
    FW := 5 
    IFW := W 
    IFH := H 
    OFW := W + FW 
    OFH := H + FW 

    Gui,GreenFrame: New, +AlwaysOnTop -Caption +Owner 
    Gui,GreenFrame: Color, Red ; Lime 
    Gui,GreenFrame: Show, x%A_ScreenWidth% y%A_ScreenHeight% w%OFW% h%OFH%, GreenFrame 
    WinSet, Region, 0-0 %OFW%-0 %OFW%-%OFH% 0-%OFH% 0-0 %FW%-%FW% %IFW%-%FW% %IFW%-%IFH% %FW%-%IFH% %FW%-%FW%, GreenFrame 

    Gui,BlueFrame: New, +AlwaysOnTop -Caption +Owner 
    Gui,BlueFrame: Color, Blue 
    Gui,BlueFrame: Show, x%A_ScreenWidth% y%A_ScreenHeight% w%OFW% h%OFH%, BlueFrame 
    WinSet, Region, 0-0 %OFW%-0 %OFW%-%OFH% 0-%OFH% 0-0 %FW%-%FW% %IFW%-%FW% %IFW%-%IFH% %FW%-%IFH% %FW%-%FW%, BlueFrame 
Return 

;** Beenden mit Escape 
    Escape:: 
        ExitApp


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

Re: Auf verschiedene Tastendrücke warten

Post by BoBo » 12 Oct 2020, 03:29

Sollte auch ohne Loop gehen. Siehe meinen Code oben.

Autohotkey1962
Posts: 54
Joined: 02 Jan 2020, 04:21

Re: Auf verschiedene Tastendrücke warten

Post by Autohotkey1962 » 12 Oct 2020, 04:06

Welcher Code???
Bin ich blind?

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

Re: Auf verschiedene Tastendrücke warten

Post by just me » 12 Oct 2020, 05:56

aifritz wrote:
11 Oct 2020, 14:18
verstehe zwar nicht, was Dein Code genau bewirken soll, aber so vielleicht...
oder so ähnlich:

Code: Select all

#NoEnv
; ...
Btn := 1
MaxBtn := 30
Loop {
   PushButton(Btn)
   Btn++
   If (Btn > MaxBtn)
      Break
   Sleep, 100
   While !Weitermachen()
      Sleep, 100
}
; ...

Weitermachen() {
   Return (GetKeyState("Enter") || GetKeyState("H") || GetKeyState("M"))
}

Autohotkey1962
Posts: 54
Joined: 02 Jan 2020, 04:21

Re: Auf verschiedene Tastendrücke warten

Post by Autohotkey1962 » 20 Oct 2020, 16:15

Ich habe mich erst einmal von der Schleife verabschiedet. Irgendwie bekomme ich das nicht hin. Ich muss erst einmal in mich gehen und mir das Ganze nochmals genauer ansehen. Vielen Dank für Eure Hilfe. Ich habe jetzt allerdings ein sehr merkwürdiges Problem, welches ich in einem anderen Thread beschreibe, weil es ja nicht zu diesem Problem gehört.
Erst einmal nochmals Vielen Dank.

Autohotkey1962
Posts: 54
Joined: 02 Jan 2020, 04:21

Re: Auf verschiedene Tastendrücke warten

Post by Autohotkey1962 » 22 Oct 2020, 03:38

So, da mein anderes Problem (Script reagierte auf verschiedenen Rechnern anders; die Lösung lag aber in der Fernbedienungssoftware) erledigt hat, kann ich wieder zu diesem Problem kommen.

Ich habe mich offenbar nur sehr blöde ausgedrückt, was ich nun genau wollte.
Also hier noch einmal eine Beschreibung dessen, was ich nun möchte, in der Hoffnung, dass ihr das nun besser versteht:

1. Ich möchte mit einer Fernbedienung Tastendrücke per AHK Script an eine Lichtsoftware übertragen.
2. Die Fernbedienung sendet also von in der dazugehörigen Software definierte Tasten, in diesem Fall Enter, z, v, p, und f. Dabei spielt es keine Rolle, ob die Buchstaben, die gesendet werden, groß oder klein sind.
3. Da die Lichtsoftware über Button bedient wird, soll also bei der Taste "Enter" der Button X gedrückt werden, beginnend beim ersten Button, dann soll ein Zähler hochgezählt werden und wenn Enter gedrückt wird, der nächste Button in der Reihe. etc. etc. Dabei werden die Button durch farbige Rahmen gekennzeichnet, damit man sieht, welcher Button aktiv ist und welcher als nächstes aktiv werden wird.
4. Da man sich auch mal vertun kann, soll der Zähler auch entweder vor oder zurück gestellt werden können, verbunden damit, dass auch der entsprechende Button wieder angesteuert oder auch übersprungen werden kann. Das passiert mit den Tasten z für zurück und v für vor.
5. Die Tasten p und f stehen für "Powerpoint" und "Film", denn sie sollen zwei Button über eine Subroutine direkt ansteuern können. Die in der Lichtsoftware dazugehörigen Button starten also Powerpoint und/oder einen Film. Es muss dafür auch kein Zähler verändert werden, da sie jederzeit aufgerufen werden können müssen und nicht der Lichtreihenfolge unterliegen. Das ist aber auch aus dem Code ersichtlich.

Mein Problem, was ich ja schon angedeutet habe ist, dass ich derzeit jedes einzelne Setting über eine Else-If Funktion abfrage, was dazu führt, dass, wenn ich viele Button habe, viele Zeilen schreiben muss. Momentan sind es 48 Button. Ich will aber nicht 48 mal diesen Code schreiben. Und wenn ich mal die Lichtshow erweitere, kämen ja noch mehr Zeilen hinzu. Im Code ist zwar noch eine Grenze nach oben bzgl. der Variable "Setting" gegeben, aber eigentlich nicht notwendig ist. Nur nach unten dar sie nicht kleiner als 0 sein.

Im angehängten kompletten Code muss der Teil ersetzt werden, der unter der Überschrift "Definition der einzelnen Settings" zu finden ist, also der Teil, wo sich die Zeilen immer wiederholen (zur Zeit habe ich nur ein paar geschrieben), nur mit anderen Werten für die zu drückenden Button.
Der Code lässt erkennen, was passiert, nämlich, wenn Setting = 1 ist, dann soll der Button 1 gedrückt werden, anschließend wandert der Mauszeiger zum nächsten Button (diese Mauswanderung dient nur zur Orientierung für einen eventuellen Helfer, falls mal was schiefgehen soll, damit der nicht lange rumsuchen muss und einfach klicken kann). Dann geht es weiter mit dem Button 2 etc.

Der dortige Code muss durch einen ersetzt werden, der die Variable Setting ausliest, diesen dann so einsetzt, dass der entsprechende Button gedrückt wird und der so zu sagen immer wieder auf den Tastendruck "Enter" wartet, bevor es weitergeht.

Vielleicht muss es ja auch kein Loop sein, sondern kann einfach als Subroutine über Gosub abgehandelt werden.
Ich komme also nicht klar damit, wie ich das nun anstellen kann und bitte da um Hilfe in Form des richtigen Codes, der als Ersatz für den sich bildenden "Spaghetticode" dient.

Hier also erst einmal der komplette Code, wie ich ihn zur Zeit nutze und der auch einwandfrei funktioniert, aber eben immer mit der Folge, dass ich ihn erweitern muss, wenn ich auch nur einen weiteren Lichtbutton definiere. :-(

Code: Select all

;   System.......:  Windows 10

    #NoEnv                      ; Nicht nachsehen, ob leere Varibalen evtl. Umgebungsvariablen sind 
    #SingleInstance Ignore      ; Bei Neustart die alte Instanz NICHT ersetzen und auch nicht nachfragen 
    SendMode Input              ; Send permanent auf SendInput setzen, da zuverl�iger und schneller 
    SetWorkingDir %A_ScriptDir% ; Dateioperationen standardm�g im Scriptverzeichnis vornehmen 
    SetBatchLines -1            ; Script nicht ausbremsem (Default: "sleep, 10" alle 10 ms) 
    SetControlDelay, -1         ; Wartezeit beim Zugriff auf langsame Controls abschalten 
    SetWinDelay, -1             ; Verz�ung bei allen Fensteroperationen abschalten 
    ;SoundPlay, *48             ; Kontroll-Sound, wenn das Script startet 

;************************************************************** 
;   BENUTZER-VORGABEN 
;************************************************************** 
    FirstSetting := 1   ; �erschlagsgrenze nach unten f�r Z 
    LastSetting  := 48   ; �erschlagsgrenze nach oben f�r Enter 
;************************************************************** 


;************************************************************** 
;   Admin-Modus sicherstellen 
;************************************************************** 
    If(!A_IsAdmin) {                    ; Wenn Script nicht als Admin ausgef�hrt wird... 
        Run *RunAs "%A_ScriptFullPath%" ; ...dann erneut starten, aber als Admin. 
        ExitApp                         ; Diese Instanz des Scriptes beenden 
    } 


;************************************************************** 
;   Hintergrundfenster �en und DMXControl sowie die KommandoBox in den Vordergrund holen 
;************************************************************** 
If !WinExist("DMXControl") { 
        MsgBox, 4112, ERROR, DMXControl wurde nicht gefunden!`nDas Script wird beendet... 
        ExitApp 
    } Else WinActivate, DMXControl   


    If !WinExist("KommandoBox") { 
        MsgBox, 4112, ERROR, KommandoBox wurde nicht gefunden!`nDas Script wird beendet... 
        ExitApp 
    } Else WinActivate, KommandoBox 




;************************************************************** 
;   Blauen und roten Rahmen f�r Buttons erstellen 
;************************************************************** 
    Gosub BuildButtonFrames 
    MouseMoveToButton(1) ; Nur mit Maus ZEIGEN - nichts tun 

;*********************************************************************************************** 
    Return  ; Ende des AutoExec-Teils 
            ; Ab hier folgen HotKeys, HotStrings, Funktionen usw. 
;*********************************************************************************************** 


;=============================================================================================== 
;   HotKeys
;=============================================================================================== 
 
        z::    
        x::
        p::
        f::
    Enter::
   
    ;--------------------------------------------------------------------------------------- 
    ;Zwischen den Settings mit �erschlag hin und her schalten. 
    ;--------------------------------------------------------------------------------------- 
    
    If( A_ThisHotkey = "z" ) { ; Wenn Z gedr�ckt wurde 
         Setting := ( Setting <= FirstSetting ) ? LastSetting : Setting - 1 ; ein Setting zur�ck 
    } Else If( A_ThisHotkey = "Enter" ) { ; anderenfalls, wenn Enter gedr�ckt wurde 
        Setting := ( Setting >= LastSetting || Setting < FirstSetting ) ? FirstSetting : Setting + 1 ; ein Setting vor 
    } Else If( A_ThisHotkey = "x" ) { ; Wenn X gedr�ckt wurde 1 vorspringen
        Setting := ( Setting + 1 > LastSetting ) ? Setting + 1 - LastSetting : ( Setting < FirstSetting ? 1 : Setting + 1 )
    
    } 

 If( A_ThisHotkey = "p" )  
Gosub Effectbutton49
  If( A_ThisHotkey = "f" )  
Gosub Effectbutton50

    ;--------------------------------------------------------------------------------------- 
    ;Definition der einzelnen Settings 
    ;--------------------------------------------------------------------------------------- 
if(Setting = 0) {

 }If(Setting = 1) { 
        ;Alle Aktionen die zum Setting #1 geh� 
  
        PushButton(1) ; Diesen Button in der Kommandobox dr�cken 
 MouseMoveToButton(2) ; Nur mit Maus ZEIGEN - nichts tun
 
        



    } Else If(Setting = 2) { 
        ;Alle Aktionen die zum Setting #2 geh� 
        PushButton(2) 
        MouseMoveToButton(3)

       
        

    } Else If(Setting = 3) { 
        ;Alle Aktionen die zum Setting #3 geh� 
        PushButton(3)
        MouseMoveToButton(4) 
        

    } Else If(Setting = 4) { 
        ;Alle Aktionen die zum Setting #4 geh� 
        PushButton(4) 
      
        
        MouseMoveToButton(5)

        
  
    } Else If(Setting = 5) { 
        ;Alle Aktionen die zum Setting #5 geh� 
        PushButton(5)
       
        
        MouseMoveToButton(6) 

    } Else If(Setting = 6) { 
        ;Alle Aktionen die zum Setting #6 geh� 
        PushButton(6)
        
        MouseMoveToButton(7)       

    } Else If(Setting = 7) { 
        ;Alle Aktionen die zum Setting #7 geh� 
        PushButton(7) 
        
    
    }


    Return  ; ENDE HotKeys Enter / Z 
;=============================================================================================== 



;=============================================================================================== 
;#  FUNKTION    PushButton(x) 
;#              x ist die Ziffer, die dem Button in der Kommando-Box entspricht. Z�ung beginnt 
;#              oben links. 
;#              Als Funktion ausgelagert, um innerhalb der Settings weniger Code und damit mehr 
;#              �ersicht zu haben. Zwischen Klicken und Loslassen befindet sich eine Pause, 
;#              damit der Klick auf den Button deutlich sichtbar wird. 
;=============================================================================================== 
    PushButton(N) { 
        If !WinActive("KommandoBox") 
            WinActivate, KommandoBox 
        WinGetPos, wX, wY,,, KommandoBox 
        ControlClick, ThunderRT6UserControlDC%N%, KommandoBox,,,, D ; Button dr�cken 
        Sleep, 300 ; kurze Pause, um die Tastenbewegung sichtbar zu machen 
        ControlClick, ThunderRT6UserControlDC%N%, KommandoBox,,,, U ; ; Button loslassen 
        ControlGetPos, X, Y,,, ThunderRT6UserControlDC%N%, KommandoBox 
        WinMove, GreenFrame,, wX+X , wY+Y 
        ;TrayTip, Button #%N%,%A_Space%  ; Bubble im Tray anzeigen 
    } 
;=============================================================================================== 
;#  FUNKTION    MouseMoveToButton(x) 
;#              x ist die Ziffer, die dem Button in der Kommando-Box entspricht. Z�ung beginnt 
;#              oben links. Die Funktion ermittelt die Koordinaten des angegebenen Buttons x und 
;#              bewegt die Maus dorthin. 
;=============================================================================================== 
    MouseMoveToButton(N){ 
        If !WinActive("KommandoBox") 
            WinActivate, KommandoBox 
        WinGetPos, wX, wY,,, KommandoBox 
        ControlGetPos, X, Y, W, H, ThunderRT6UserControlDC%N%, KommandoBox 
        MouseMove, X+W/9 , Y+H/9 , 5 
        WinMove, BlueFrame,, wX+X , wY+Y 
        ; zuletzt gefundenes Fenster verwenden
    } 

;===============================================================================================
;#   FUNKTION Orientierung der Buttons auf dem Bildschirm durch Buttonframes
;===============================================================================================

BuildButtonFrames: 
    ControlGetPos,,, W, H, ThunderRT6UserControlDC1, KommandoBox 
    FW := 5 
    IFW := W 
    IFH := H 
    OFW := W + FW 
    OFH := H + FW 

    Gui,GreenFrame: New, +AlwaysOnTop -Caption +Owner 
    Gui,GreenFrame: Color, Red ; Lime 
    Gui,GreenFrame: Show, x%A_ScreenWidth% y%A_ScreenHeight% w%OFW% h%OFH%, GreenFrame 
    WinSet, Region, 0-0 %OFW%-0 %OFW%-%OFH% 0-%OFH% 0-0 %FW%-%FW% %IFW%-%FW% %IFW%-%IFH% %FW%-%IFH% %FW%-%FW%, GreenFrame 

    Gui,BlueFrame: New, +AlwaysOnTop -Caption +Owner 
    Gui,BlueFrame: Color, Blue 
    Gui,BlueFrame: Show, x%A_ScreenWidth% y%A_ScreenHeight% w%OFW% h%OFH%, BlueFrame 
    WinSet, Region, 0-0 %OFW%-0 %OFW%-%OFH% 0-%OFH% 0-0 %FW%-%FW% %IFW%-%FW% %IFW%-%IFH% %FW%-%IFH% %FW%-%FW%, BlueFrame 
Return 

=====================================================================================================
;# Effektbutton Unterroutinen
=====================================================================================================

Effectbutton49:


PushButton(49)

return

Effectbutton50:
PushButton(50)

return

;** Beenden mit Escape 
    Escape:: 
    ExitSub: 
        ; Schnittstelle schlie�n und Ressourcen freigeben 

        DllCall("FreeLibrary", "ptr", DllCall("GetModuleHandle", "str", "winmm", "ptr")) 
       
        ExitApp

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

Re: Auf verschiedene Tastendrücke warten

Post by just me » 22 Oct 2020, 04:46

Moin!
Autohotkey1962 wrote:4. Da man sich auch mal vertun kann, soll der Zähler auch entweder vor oder zurück gestellt werden können, verbunden damit, dass auch der entsprechende Button wieder angesteuert oder auch übersprungen werden kann. Das passiert mit den Tasten z für zurück und v für vor.
In Deinem Code passiert das mit den Tasten z (zurück) und x (vor). Außerdem wird bei z und x nach Korrektur auch wieder sofort die zugehörige Buttonfunktion ausgelöst. Soll das so sein?
Autohotkey1962 wrote: 5. Die Tasten p und f stehen für "Powerpoint" und "Film", denn sie sollen zwei Button über eine Subroutine direkt ansteuern können. Die in der Lichtsoftware dazugehörigen Button starten also Powerpoint und/oder einen Film. Es muss dafür auch kein Zähler verändert werden, da sie jederzeit aufgerufen werden können müssen und nicht der Lichtreihenfolge unterliegen. Das ist aber auch aus dem Code ersichtlich.
In Deinem Code wird anschließend auch die aktuelle Buttonfunktion ausgelöst. Soll das so sein?

Autohotkey1962
Posts: 54
Joined: 02 Jan 2020, 04:21

Re: Auf verschiedene Tastendrücke warten

Post by Autohotkey1962 » 22 Oct 2020, 05:03

Ich habe vergessen, das X mit dem V als Hotkey zu ersetzen. Ist also erst mal nicht schlimm. Das kann ja im Script verbessert werden.
Ja, die Buttonfunktion soll sofort nach der Korrektur ausgelöst werden, denn wenn ich mich in der Show vertun sollte, muss ja in die vorherige Szene zurückgesprungen werden und diese Szene auch laufen, weil ansonsten die falsch angewählte Szene weiterlaufen würde. Das ist ja nicht gewollt.
Zum letzten Punkt: Das ist auch so richtig. Die Button, die über p und f angesteuert werden sind in der Software als so genannte Effektbutton definiert, die gegenüber alle anderen laufenden Lichtfunktionen "dominieren" und nach dem Beenden wieder die vorherigen Einstellungen weiterlaufen lässt. So lässt es sich z.B. machen, dass man, während eines Applauses über den Effektbutton ein Strobolicht initiiert und wenn der Applaus abgeebt ist, wird der Effektbutton wieder ausgestellt und das Normallicht des letzten Programmpunktes läuft weiter, ohne dass es neu gestartet werden müsste.

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

Re: Auf verschiedene Tastendrücke warten

Post by just me » 22 Oct 2020, 05:59

Ok, dann probier mal:

Code: Select all

    ;---------------------------------------------------------------------------------------
    ;Definition der einzelnen Settings
    ;---------------------------------------------------------------------------------------
    If (Setting <> 0) {
        PushButton(Setting)      ; Diesen Button in der Kommandobox drücken
        Next := (Setting = LastSetting) ? FirstSetting : (Setting + 1)
        MouseMoveToButton(Next)  ; Nur mit Maus ZEIGEN - nichts tun
    }
    ; Das war's (möglicherweise) auch schon!

Autohotkey1962
Posts: 54
Joined: 02 Jan 2020, 04:21

Re: Auf verschiedene Tastendrücke warten

Post by Autohotkey1962 » 22 Oct 2020, 06:18

DANKE!!! Das war es offenbar. Jetzt funktioniert es bisher einwandfrei, ohne dass ich Spaghetticode produziere. Schade, dass ich nicht so viel Zeit habe, um mich mit AHK intensivst zu beschäftigen. Das ist schon ein verdammt nützliches Tool.

Autohotkey1962
Posts: 54
Joined: 02 Jan 2020, 04:21

Re: Auf verschiedene Tastendrücke warten

Post by Autohotkey1962 » 22 Oct 2020, 08:41

Ich habe eine Fehlinfo gegeben, was die Funktion des "Nach vorn Springens" betrifft. Im Gegensatz zum Rückwärtssprung darf beim Schritt vorwärts der jeweilige Button noch nicht, sondern erst wieder nach der Entertaste gedrückt werden. Ich bitte um Entschuldigung. das war mein Fehler.

Beim Vor- oder mehrfachen Überspringen von Button geht es ja darum, dass, wenn man z.B. im Programm einen mehrere Programmpunkte überspringen möchte, diese auch komplett überspringen werden können, ohne dass die vorherigen Lichtszenen, die ja auch übersprungen werden müssen, einfach mit anlaufen. Das würde ja erst mal ein sinnloses Lichtwirrwar erzeugen.
So wie das Script nun geändert ist, passiert das leider, dass bis zum Zielbutton alle davor liegenden Button auch gedrückt werden und die dazugehörigen Lichtszenen auslösen.
Es muss also beim Drücken der Taste x nur ein entsprechender Sprung stattfinden, bevor ich dann die Entertaste drücken muss, damit es weitergeht.

Beim Zurückgehen mit z ist es ja egal, weil ja nur dann zurückgegangen wird, wenn man versehentlich einmal zu viel auf die Fernbedienung gedrückt hätte. Da müssen ja entsprechende Lichtszenen sofort anlaufen.

Interessant wäre aber in jedem Fall auch die Möglichkeit, dass nicht beim Zurückspringen über die Taste z vor den ersten Button gesprungen werden kann, so dass man sich, beispielsweise im Eifer des Gefechts, statt bei Button 1, irgendwo bei Button 48 oder 47 etc. wiederfindet, weil der Überschlag in diesem Fall bei 48 liegt.
So zusagen eine Sperre nach unten. Irgendwie "Wenn z gedrückt wird und das Setting kleiner als 1 wird, dann bleibt das Setting auch 1.

Post Reply

Return to “Ich brauche Hilfe”