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