Aktuell sind 350 Gäste und keine Mitglieder online

 

Scripts, Zusatzprogramme und Batchdateien

 

 

Dokumentenversion 1.1

Stand vom 02.04.2024

Erstellt vom Moster / www.flippermarkt.de

Veröffentlichung mit Genehmigung

 

Hinweise zur Doku

Um manche Unhandlichkeitenkeiten und fehlende Optionen in der Handhabung der Vpin-Programme auszugleichen, wurden eine Reihe von Scripts und Zusatzprogrammen geschrieben.
Diese sind zum größten Teil in Autohotkey geschrieben, aber auch in vbscript oder als cmd-Batchdatei, je nachdem was am praktikabelsten war.
Die Scripte wurden eingeteilt in interne und externe Scripte:

  • Interne Scripte werden im Zusammenspiel mit vPin-Programmen genutzt. Diese sind also nur innerhalb von vpin-Programmen eingebunden.
  • Externe Scripte sind „Standalone“ und dienen der Verwaltung bzw. Konfiguration der Programme oder Tische.

Die komplexeren Autohotkey-programme sind mit ausführlichen Kommentaren versehen. Fast alle in AutoHotkey geschriebenen Programme haben die Möglichkeit ausführliche Log-Dateien zu schreiben oder auch Debug-Informationen anzuzeigen.
Hierzu dient das extern eingebundene Modul „logging.ahk“. Das logging kann in einer zugehörigen INI-Datei konfiguriert werden. (kein logging, kumulativ loggen oder bei jedem Start neues log beginnen.)

Versionshistorie

Hinweis:
Versionen mit x.xx sind interne Zwischenversionen, die nicht veröffentlicht werden. Wegen des Arbeitsaufwands werden daher nur Versionen mit x.x, in denen die bisher angefallenen Änderungen zusammengefasst sind, veröffentlicht.

Datum Ver. Änderung Thema
31.03.2024 1.0 - Erste Version
02.04.2024 1.1 Ergänzt Versionshistorie

1. Interne Scripts und Zusatzprogramme

Übersicht der programminternen Scripts

Verzeichnis Beschreibung Hinweise
B2S-TableConfig scripts Enable / Disable B2S-DMD über Operatormenü
Funktion ist von B2S- und Win.version abhängig
Die int. Windows-ID der B2S-
Felder unterscheiden sich von
Version zu Version
BAM-KeyHook Ermöglicht dieTisch-Konfiguration im BAM-Menü über die Flippertasten 2 Programme, wird mit FP im Launchscript gestartet
Map-FP-Closekey Wenn FP standalone ohne PUP gestartet wird, wird der Standardkey “Esc” zum beenden von FP auf einen anderen key (Q) umgemappt. So entspricht der close-key dem in PUP, und der FP-player kann mit dem Exit-button beendet werden.
PinMAME-DMD-scripts Über das Operatormenü können PinMAME-DMD, ExtDMD, colored DMD konfiguriert werden Die Einstellungen können jeweils aktiviert /deaktiviert werden.
Prozessüberwachung
FP für PopperAutoQA
Bei Erstellung von table-videos kann es vorkommen dass FP abstürzt. Dann wird FP mehrfachgestartet. Script prüft. Ob FP 2mal aufgerufen ist, dann wird der ältere Prozess beeendet.
PUP_Launch_scripts Scripts von zus. Punkten im Operatormenü Diese steuern den Aufruf der Zusatzprogramme und gehören ins Launch-verzeichnis
Steam_FX3_FX ein Script zum Beenden von Steam, eins für den Aufruf der FX-Tische  
Switch-Anaglyph-3D Aktiviert /deaktiviert 3D-mode über das Operatormenü für VPX 10.8 Konfig für Anaglyphen-3D mit Red/cyan-Brille

Die in fett hervorgehobenen Programme sind notwendig bei der hier beschriebenen Konfiguration.

1.1 Die beiden B2S-TableConfig scripts

Hier sind es zwei Scripts, die über das Operatormenü genutzt werden:

  • DisableB2SDMD: öffnet das B2S-configmenü und deaktiviert das B2S-DMD
  • EnableB2SDMD: öffnet das B2S-configmenü und aktiviert das B2S-DMD


Es müssen 2 Programme verwendet werden, da es nicht gelang mit AutoHotkey den Inhalt der Eingabefelder auszulesen.

1.1.1 Der Inhalt der INI-Datei „B2SConfigValues.ini“

Inhalt der INI-Datei „B2SConfigValues.ini“, diese gilt für beide Scripts:
; config values
[config]
; config for Dev-pc or vpin-pc, other Windows-ID for B2S-objects
vPinPC=0
DevPC=1
; milliseconds to wait between send commands for remote b2s-control
waittime=200

1.1.2 Konfiguration der B2S-TableConfig-Scripts

In den Flags „vPinPC“ und „DevPC“ sind die unterschiedlichen Windows-IDs der Felder und Button berücksichtigt. Diese unterscheiden sich bei der B2S-Version und der Windows-Version. Im Code erfolgt dann eine entsprechende Abfrage auf die jeweilig aktivierte Version.
Leider lassen sich in AutoHotkey die Bezeichner der Windows-IDs nicht als Variablen verarbeiten, sondern nur direkt als Angabe im Befehl.

Daher muss man bei anderer B2S- oder Windowsversion die aktuellen Windows-IDs der genutzten Forms-Objekte mit dem Spy Tool von AutoHotkey ermitteln und im Programmcode anpassen (an 2 Stellen)

Links die markierte Windows-ID des Auswahlfelds „B2S DMD“ auf der rechten Seite.
Beide Scripts sind bis auf die Zeile zum Aktivieren bzw. Deaktivieren gleich.

1.2 Die Scripts BAMKeyHook und BAMKeyhook-Start für Future Pinball


Die beiden Programme dienen dazu, die Konfiguration im BAM-menü eines Tischs für Future Pinball über die 4 Flippertasten Flippertaste rechts / links, MagnaSave rechts / links vornehmen zu können ohne eine Tastatur benutzen zu müssen.
Aus programmiertechnischen Gründen musste das Ganze in 2 Programme aufgeteilt werden.

„BAMkeyhookstart“ wird im Launchscript von Popper zusammen mit FP gestartet. Dieses achtet nur darauf, ob FP noch läuft und ob der Hotkey für das BAM-menü betätigt wurde. Dann lädt dieses das eigentliche Programm „BAMKeyHook“ nach. Wenn dieses direkt mit FP gestartet würde, wären die Flippertasten doppelt belegt. Aber solange das BAM-menü offen ist, bedienen die Flippertasten nur das BAM-menü.

1.2.1 Einrichtung der BAMKeyHook-Programme

Zu den Programmen gehört eine INI-Datei BAMkeyhook.ini. In dieser sind in der Section „config“ eingetragen auf welchen Prozess gelauscht werden soll, hier steht der Prozessname, wie im Taskmanager zu sehen. Es reicht da der Anfang des Namens, es muss nicht der komplette Namen sein, zumal sich bei FP der Name ändert, wenn ein Tisch geladen wurde. Der Tischname wird dann an den Prozessnamen angehängt.

In der Section „mappings“ ist die Mappingzuordung hinterlegt, welche Button-Keys (linke Seite) auf welche Tastenkeys für BAM (rechte Seite) umgebogen werden sollen. Diese Keys sind vorgegeben. Nur der Hotkey kann in BAM umkonfiguriert werden. Hier wurde „B“ gewählt.
Die übrigen config-Werte sind in der INI-Datei bezeichnet.
Die beiden EXE-dateien und die ini-datei liegen im Launchverzeichnis von PinUpsystem.

1.2.2 Zu den Einträgen in der „BAMkeyHook.ini“

FastModeEditTime“ aktiviert die schnelle Änderung von Werten (z.B.: bei Positionierung des BackGlass). Wenn eine dieser Keys (also Buttons) länger als die dort angegebene Zeit gedrückt wird, werden die Zehnerwerte rauf- bzw. runter geändert.
Mit „FastBAMEditMode=0 kann dieses Feature deaktiviert werden.
In der section „Mappings“ ist definiert, auf welche Keys die fest vorgegebenen FP-Keys umgemappt werden sollen. Die Syntax muss der Keydefinition in AutoHotkey entsprechen.
In BAMhotkey ist der Key definiert um das BAMmenü aufzurufen.

1.2.3 Der Inhalt der INI-Datei „BAMkeyhook.ini“

[config]
; Exe name of Future Pinball to check if its running
exeToWatchFP="Future Pinball.exe"
; name of key-hook program
keyHookProg=BAMkeyHook.exe
; Hotkey for entering BAM-menu
BAMhotkey=b
; When PUP starts a table, time to wait until FP has started
WaitForFP=20
; time in msec. Right shift-key must be pressed until quick mode in BAM-menu is activated
FastModeEditTime=3500
; debug modes, 0:no Messagebox, 1:Infos in messagebox
debug=0
; 0: no logging, 1: logging added, 2: logging in new file
Logging=2
; TestMode=1: no running Future Pinball needed, 0: FP must be started
TestMode=0
; deactivates fast editing of values in BAM-menu, faulty code !! set=0
FastBAMEditMode=1
[Mappings]
; key-mapping for BAM, left side: from, right side: to. values in AutoHotkey syntax
; + means special handling key of shift-key for fast editing of BAM-values
RShift=Up
LShift=Down
RCtrl+=Right
LCtrl+=Left

1.3 Das Script MapFPCloseKey

Wenn FP Standalone gestartet wird, mappt das Script den festen Exit-key „ESC“ von FP um auf den, der in Popper definiert ist (Q).
Dieser Key ist in der zugehörigen „MapFPCloseKey.ini“ einstellbar.


1.3.1 Einrichtung von MapFPClosekey

Der Aufruf von FP erfolgt über eine cmd-datei:
fploader.exe
start MapFPCloseKey.exe
exit

Praktischerweise wird der Aufruf dieser Batchdatei über einen Link, Icon auf dem Desktop vereinfacht.


1.3.2 Die INI-Datei „MapFPClosekey.ini“

In der INI-Datei sind beiden Prozesse definiert, die vom Programm geprüft werden, ob diese vorhanden sind.
„QuitFPkey“ enthält den key, der im Controller-setup definiert ist um FP zu verlassen. FP selbst kennt ja nur „Esc“ zum Programm-Verlassen.


1.3.3 Inhalt der „MapFPCloseky.ini“

[config]
; Exe name of Future Pinball to check if its running
exeToWatchFP="Future Pinball.exe"
; Exe name of PUP-Prog to check if its running
exeToWatchPUP="PinUpDisplay.exe"
; debug modes, 0:no Messagebox, 1:Infos in messagebox
debug=0
; 0: no logging, 1: logging added, 2: logging in new file
Logging=2
; ReMap this key to Esc to close FP, if PUP is not running (ony for tests to run FP without PUP)
QuitFPkey=Q

1.4 Dateien für das Operatormenü

Wenn im Operatormenü nicht interne Befehle, die PUP kennt, verwendet werden, müssen die Befehle in eine Batchdatei gepackt werden, welche dann über das Operatormenü aufrufen werden.
Die genaue Beschreibung des Operatormenüs ist in der Hauptdoku zu finden.

Batchdatei Beschreibung
1.POPGAME_EnableColorDMD.cmd Aktiviert Colored DMD in PinMAME
2.POPGAME_DisableDMDWindow.cmd Deaktiviert das PinMAME-DMD
3.POPGAME_noExtDMD.cmd Deaktiviert DMDext in PinMAME
4.POPGAME_EnableB2SDMD.cmd Aktiviert das B2S DMD
5.POPGAME_DisableB2SDMD.cmd Deaktiviert das B2S DMD
6.POPGAME_SwitchAnaglyph3D.cmd Aktiviert /deaktiviert 3D-mode in VPX10.8
7.POPGAME_VPXPOV Edit.cmd Lädt VPX-table z.Anpassen der Dimensionen
8.POPMENU_PopperAutoRec.cmd Startet Recordingtool PopperAutoRecord
9.POPMENU_PopperAutoTesting.cmd Startet Table-Screenshot tool PopperAutoQA
  • Die Scripts 1-3 gehören zu PinMAME-Konfiguration.
  • Die Scripts 4-5 gehören zu B2S-Konfiguration.
  • Script 6 stellt VPX 10.8 auf Anaglyphen 3D Mode um.
  • Script 7 startet den Tisch neu im POV-Edit Mode.
  • Script 8-9 autom. Recording und Screenshots von Tischen.

Die Namensgebung der Dateien orientiert sich an dem Schema in Popper.

1.4.1 Einrichtung Batchdateien Operatormenü

Alle POPGAME- und POPMENU-dateien gehören ins Launch-Verzeichnis von PinUpSystem.


1.4.2 Die PUP-Datei des Operatormenüs

Die Konfiguration des Operatormenüs befindet sich in der Datei „PopperOperatorMenu.pup“ und kann recht komfortabel bearbeitet werden mit dem Programm „PopperOperatorEdit.exe“.

1.5 Prozessüberwachung „CheckForPopperAutoQA“ für PopperAutoQA

Das Zusatz-Programm beobachtet die beiden Prozesse VPX und Future Pinball, wenn automatische Screenshots von Tischen mittels PopperAutoQA erfolgen. Wenn es bei Tischen zu Problemen, Fehlern kommt, kann das PopperAutoQA nicht feststellen und ruft folglich VPX
oder FP mehrfach auf.
Das Script achtet daraus, dass jeweils nur ein Prozess von FP oder VPX gestartet ist. Sobald ein zweiter Prozess festgestellt wird, wird der ältere beendet (der ja dann einen Fehler hatte).


1.5.1 Konfiguration von CheckForPopperAutoQA

Zu dem Programm gehört eine „CheckForPopperAutoQA.ini“, in der Prozessnamen der beiden zu prüfenden Programme und das Verzeichnis zu PopperAutoQA eingetragen sind.


1.5.2 Inhalt der „CheckForPopperAutoQA.ini“

[config]
; debug modes, 0:no Messagebox, 1:Infos with values in messagebox
debug=0
; 0: no logging, 1: logging added to file, 2: logging in new file
Logging=2
[system]
ProgToWatchFP="Future Pinball.exe"
ProgToWatchVPX="VPinballX.exe"
ProgToRun="c:\VPinball\PinUPSystem\PopperAutoQA.exe"

1.6 Scripte für Steam FX3

Für Steam FX3 werden 2 Scripts benötigt:

  • SteamShutdown zum Beenden von Steam, nachdem der FX3-Tisch beendet wurde
  • SendFXNewGame zum Betätigen des new-gamebuttons, wenn ein spiel nicht zu Ende war.

Beide Programem liegen im Launchverzeichnis von PinUpSystem.


1.6.1 Das Script SteamShutdown

Das Script triggert auf den Hotkey zum Verlassen des Tischs (Q) und beendet dann Steam:
Q::
WinClose, ahk_exe Pinball FX3.exe
;at first close FX3
Sleep,1000
;needs some time to avoid
shutdown message
WinClose, ahk_exe steam.exe
;processanme of steam, send close, but steam
stays in traybar
Sleep,2000
;needs some time to avoid
shutdown message
Run, C:\vPinball\FX3\steam.exe -Shutdown
;parameter to exit steam
ExitApp


1.6.2 Das Script „SendFXNewGame“

Dieses Script gehört zu PUP und kann auch hier heruntergeladen werden:
https://www.nailbuster.com/pup/SendFXNewGame.zip
Der Quellcode hierzu ist nicht verfügbar.
Das Script betätigt den Button „new game“ in dem Abfrage-Fenster, wenn ein nicht zu Ende gespieltes Spiel neu gestartet wird.

1.7 Script für Pinball-FX

Die Umsetzung für Steam / Pinball FX ist komplizierter.
FX ist auch nicht offline nutzbar, da man sich den dem notwendigen Steamaccount nicht offline anmelden kann.


1.7.1 Konfiguration der INI-Datei zu Pinball-FX

Hier sind unter den 3 Wait-Variablen die Zeiten eingetragen, die Pinball-FX zu den einzelnen 3 Abschnitten benötigt, die FX beim Start durchläuft. Diese Zeiten müssen ggf. an den jeweiligen PC angepasst werden.
„DoCabinetMode“ setzt den Cab-mode, Do PlayBeeps erzeugt zu jedem der 3 Ladeabschnitte einen Beep, so dass man zu Testzwecken weiß, in welchem Part FX gerade ist.


1.7.2 Die INI-Datei „LaunchPinballFX.ini

[Configuration]
WaitBeforeActivate=9000
WaitBeforeGameLoad=10000
WaitBeforeMenu=14000
KeyDelay=50
DoCabinetMode=True
DoPlayBeeps=true
DoActivateWindow=true
RotatePlayfield=0
TimeToRotateDisp=14800
[PinUpPopper]
UseWithPUP=true

2. Externe Scripts / Zusatzprogramme

Die externen Scripte sind Standalone aufrufbar und werden nicht innerhalb von Popper-Programmen genutzt, sondern umgekehrt.
Alle diese externen Zusatzprogramme können aus ihrem Verzeichnis aufgerufen werden.

Übersicht externe Standalone-Scripte und Programme:

Verzeichnis Beschreibung Hinweise
AutoplayTables Während des Recordings mit PopperAutoQA werden Plunger und Flippertasten zufällig getriggert um etwas Bewegung ins Video zu bringen. Kleine Spielerei
DMDdevice.ini sortieren Sortiert die Table-Einträge nach Alphabet  
DOFLinx-switch debug Aktiviert /deaktiviert Debug-Flag in der DOFLinX.ini  
Export Table-scripts Exportiert alle Table-scripts von VPX- und FP-tables Erleichtert z.B. den Vergleich von Tisch-versionen
PUP-Consitency-check Überprüft die PUP-Datenbank, ob Tables und vorhanden sind, deren Files fehlen und auf Media-Files zu denen Tabels in der DB fehlen Recht komplexes Programm
BackupRegKeys Exportiert die Registryzweige zu den vPin-Programmen  
Sort-Textfile VPMAlias Sortiert die Einträge in der VPMAlias.txt alphabetisch PinMAME fügt die ROM-namen immer ans Ende ein
xml-Sort Sortiert die Tischeinträge in der B2STable-Settings.xml nach Alphabet B2S fügt die Tische immer am Ende ein

 

2.1 Das Script “Autoplay Tables“

Dieses Zusatzprogramm ermöglicht eine zufällig gesteuerte Betätigung der Flippertasten und des Plungers, während über „PopperAutoRecord“ automatisch Videos von den Tischen aufgenommen werden. Dadurch ist da etwas mehr Action in der Aufnahme, als wenn nur das starre Playfield aufgenommen wird. Sonst muss man die ganze Zeit danebenstehen, um im
richtigen Moment den Tisch zu spielen, bei 100 Tischen können die Aufnahmen schon eine Nacht dauern.
Bei den manuellen Einzelaufnahmen über das PUP-menü ist dies ja möglich.
In der zugehörigen INI-datei „Autoplay.ini“ können die zufallsgesteuerten Zeitwerte geändert werden.


2.1.1 Inhalt der INI-Datei „AutoplayTables.ini

[Settings]
; wait time in ms before start autoplay
WaitTilStart=4000
; Random Timer for EnterKey
TimerForEnter=4000
; Random Timer for LShiftKey
TimerForLShift=3000
; Random Timer for RShiftKey
TimerForRShift=3000
; 0: no logging, 1: logging added, 2: logging in new file
Logging=2

2.2 Das Script sort-DMDdevice.ini

Das Script ermöglicht die Sortierung der Table-konfiguration in der DMDdevice.ini.
Das Script ist in VBScript geschrieben und hat die Parameter:
Cscript sort-DMDdevice_ini.vbs <DMDdevice.ini> <Dateiname-sortiert.ini>

In der vbs-Datei muss noch in Zeile 14 die Zeilennummer angepasst werden, ab wann die Sortierung beginnen soll, da der obere Teil globale Einstellungen enthält und die Tische weiter unten anfangen.


2.3 Das Script „DOFLinx-switch-debug“

Das Script ist in VBscript geschrieben und aktiviert /deaktiviert im Wechsel das debug-flag in der Datei DOFLinX.ini.
Dazu gehört eine Batchdatei „DOFLinx-switch-debug.cmd“ zum Aufruf, deren Link auf dem Desktop abgelegt wird:
start cscript DOFLinx-switch-debug.vbs
exit

2.3.1 Inhalt der INI-Datei “DOFLinx-switch-debug.ini“

[config]
; Directory for DOFLinx.ini
DOFLinxDir="c:\VPinball\DirectOutput-x86"

2.4 Autom. Export der Table-scripts für VPX und FP

Das Script exportiert die Table-Scripts unter ihrem Tablenamen als vbs-datei jeweils in ein Unterverzeichnis des Table-Verzeichnisses.
Es gibt zwei Scripts:

  • „Run-all-FP_ExtractVBS“ zum Export der Scripts aus Future Pinball
  • „Run-all-vpx_ExtractVBS“ zum Export aus VPX

2.4.1 Konfiguration des Table-script Exports

Zur Konfiguration gehören zwei INI-Dateien:

  • eine „ConfigValuesFP.ini“ für Future Pinball und
  • eine „ConfigValuesVPX.ini“ für VPX

In beiden Dateien ist anzugeben, wo das jeweilige Programm liegt und welcher Modus beim Exportieren verwendet werden soll.
Es gibt dazu 3 Einstellungen in dem Wert „OverwriteVBS“:

  • 0: existierende Table-scripts werden nicht überschrieben
  • 1: alle vorhandenen werden überschrieben
  • 2: schon vorhandenen werden in ein Backup-Verz. Verschoben, bevor das neue File exportiert wird.
  • 3: nur bei neuen Tischen wird das Table-script exportiert

In der INI-Datei wird das Table-verzeichnis angegeben und mit welchem Programm die Tische gestartet werden sollen.
Bei mehreren Table-Verzeichnissen muss das Verzeichnis dann jeweils angepasst werden.


2.4.2 Inhalt der INI-Datei „ConfigValuesVPX.ini“

[config]
debug=0
logging=2
; general config values
[general]
; milliseconds to wait until table is loaded
wait=8000
; overwrite existing table-script files: 0: no overwrite, 1:overwrite, 2: backup existing files, 3: only for new tables
OverwriteVBS=3
; directory of Visual Pinball exe-file
VPXdir=c:\VPinball\VisualPinball
; Exe file to run, 32bit-version
ExeFileToRun=VPinballX32.exe
; Table directories
[TableDirs]
C:\VPinball\VisualPinball\Tables


2.4.3 Die INI-Datei “ConfigValuesFP.ini”

[config]
debug=0
logging=2
; general config values
[general]
; milliseconds to wait until table is loaded
waitTime=10000
; overwrite existing table-script files: 0: no overwrite, 1:overwrite, 2: backup existing files, 3: only for new tables
OverwriteVBS=3
; BAM dir for Future Pinball
FPdir=c:\VPinball\FuturePinball\BAM
; Table directory
TableDir=C:\VPinball\FuturePinball\Tables-temp
; Exe file to run (fploader.exe)
ExeFileToRun=fploader.exe

2.5 Überprüfen der PUP-DB Konsistenz zu den Table- u. Media-Files

Dieses Testprogramm dient dazu die Übereinstimmung der in der Datenbank eingetragenen Tables mit den wirklich vorhandenen Dateien zu prüfen. Und zwar in der Richtung, dass geprüft wird, ob zu den Tischen in der Datenbank auch die Tablefiles im jeweiligen Table-Verzeichnis existieren.
Umgekehrt kann das ja der Games Manager über seine „Add new games“-funktion.

Das Programm hat 3 Modi der Konsistenzprüfung, die aufeinander aufbauen, so dass am Ende die Datenbank mit dem Filebestand übereinstimmt, also keine DB-Einträge verwaist sind.

  • Modus 1: Prüfen der Datenbankeinträge gegen die Table-files
  • Modus 2: Table-Files gegen die Datenbankeinträge
  • Modus 3: Prüfen auf verwaiste Mediadateien im PUPMedia-Verzeichnis
2.5.1 Bedienung des Programms

Nach erstem Aufruf des Programms ist die gängige Einstellung schon vorgegeben.

„Table-Dateien löschen“, „Media-Dateien löschen“: Table-Files und deren Mediadateien, die in der DB nicht vorhanden sind werden gelöscht, wenn in der rechten Checkbox nicht angehakt ist, diese vorher zu sichern.

Die Sprache kann von Deutsch auf Englisch umgestellt werde, erfordert dann einen Programmneustart.

Das Logging=2 besagt, dass bei jedem Programmstart das log wieder neu beginnt.

2.5.2 Modus 1 (check-db):Datenbankeinträge gegen Tisch-Dateien prüfen

Nach Klick auf „prüfen“ wird für alle Tische in der DB geprüft, ob dazu Tisch-Dateien vorhanden sind, die den gleichen Namen haben.

Dann wird angezeigt, wie viele Tische als Datei fehlen.

Bei „Abbrechen“ wird das Programm verlassen und eine Liste aller Tische erstellt. Zusätzlich eine Liste der fehlenden Tische.

Es werden dabei schon die unten genannten 2 Listen erstellt.

Bei „Bereinigen“ werden die DB-Einträge gelöscht, deren Tische fehlen.

Jetzt sind die Datenbankeinträge der Tische konsistent zu den Table-Files.

Dann wird noch eine Datei „DeletedFiles.log“ erstellt, welche Dateien gelöscht wurden. Diese List ist kumulativ.

Es wird dabei eine Liste erstellt aller Tische der DB: (es handelt sich hier um eine Demo-Datenbank mit wenigen Tischen).

eine Liste fehlender Tisch-Dateien:

eine Liste der gelöschten Dateien:

Da in der Konfiguration „Table- und Mediadateien vorher sichern“ angehakt ist, werden alle diese Dateien jeweils in einem Unterverzeichnis „_Media-Backup“ bzw. „Table-Backup“ im zugehörigen Emulator- oder Mediaverzeichnis gesichert.

Hier das Beispiel für das Playfield Video des gelöschten Eintrags

2.5.3 Modus 2 (checkFiles): Table-files gegen Datenbank-Inhalt prüfen

Hier ist jetzt der zweite Punkt ausgewählt.

Nach Klick auf „Prüfen“ wird die Anzahl der fehlenden Table-Einträge in der DB ausgegeben.

Hier in der Demodatenbank fehlen 10 Tische, die als Files vorhanden sind aber nicht in die DB importiert wurden.

Abbrechen“ und „Bereinigen“ ist wie oben beschrieben.

Dies stimmt überein mit der Anzeige bei „Add new Games“ im Gamemanager

Bei Klick auf „Bereinigen“ sind ähnlich wie im Modus 1 sind die gelöschten Dateien im Verzeichnis „_Table-Backup“ gesichert worden.

2.5.4 Die Konfiguration mit der INI-Datei „PUP-FileConsistency-check.ini“

Es werden die Verzeichnisse für PinUpsystem, das cfg-Verzeichnis für BAM angegeben, sowie der Dateiname der PUP-Datenbank.
Es sind nur die beiden Verzeichnisse zu prüfen und ggf. anzupassen, die übrigen Flags werden über die Programmoberfläche über die Checkboxen gesetzt.
Eine Änderung dort wird nach Klick auf „Prüfen“ übernommen und die Einstellung in der INI-Datei gespeichert.


2.5.5 Der Inhalt der INI-Datei „PUP-FileConsistency-check.ini”

[Settings]
; Directory for PinUpSystem
PinUpSystemDir="c:\VPinball\PinUPSystem"
; Directory cfg-files of BAM
BAMcfgDir="c:\VPinball\FuturePinball\BAM\cfg"
; Save deleted files
Backup=1
; Delete Table-Files
DeleteTables=1
; Delete Media-Files
DelMediaFiles=1
; also check files in popmedia-Wheel-directory, alot of files need alot of time
CheckWheelFiles=0
; display-language of Dialog window, DE:german, EN:english
language=DE
[system]
; Name of PUP-database
DBname=PUPDatabase.db
; debug modes, 0:no Messagebox, 1:Infos with values in messagebox
debug=0
; 0: no logging, 1: logging added to file, 2: logging in new file
Logging=2
; Measure time in Subs for performance measurement
PerfMeasure=0
; create a list of all tables on cancel program
ListTables=1


2.5.6 Modus 3: Auf verwaiste Mediadateien prüfen

Hier werden alle Mediafiles im POPmedia-Verzeichnis zu den Emulatoren geprüft, ob entsprechend Table-files dazu vorhanden sind.
Je nach Anzahl der Dateien kann der Vorgang sehr lange dauern, da jede media-datei geben jede Tisch-datei geprüft werden muss.
Gegen die DB wird nicht mehr geprüft, da dies in den oberen beiden Punkten schon stattgefunden hat.

2.6 Die Batchdatei „Backup-RegKeys.cmd“

Diese Batchdatei exportiert die Registrykeys der vPin-programme in ein eigenes Verzeichnis.
Bei jedem Export wird ein neues Verzeichnis mit Datum, Uhrzeit erstellt.

2.7 Sortieren der VPMAlias-Einträge mit “sort-Textfile“

Das Skript ist in VBScript geschrieben
Aufrufsyntax: „cscript Sort-textfile.vbs <input.txt> <output.txt>”
Das Script kann für beliebige text-listen genutzt werden, die nach Alphabet sortiert werden sollen.

2.8 Das Script “Sort-B2STableSettings-xml“

Das Skript ist in VBScript geschrieben und sortiert die xml-Kategorien der einzelnen Tische nach Alphabet, da der Backglass-Server diese einfach nur an das Ende der „B2SSettings.xml“ schreibt.
Zur Vereinfachung des Aufrufs sollte die xml-Datei in das Scriptverzeichnis kopiert werden.


2.8.1 Konfiguration des Scripts:

In der Zeile 27 muss die Startzeile, ab der sortiert werden soll, angepasst werden. Der globale Kopfteil soll ja nicht sortiert werden.
Aufruf: „cscript „B2SSettings.xml” <Name der sortierten Datei>

3. Listings der Scripts und Zusatz-Programme

Alle Listings können in der cloud als ZIP-File heruntergeladen werden.
Dort liegt auch die jeweils aktuelle Version:

Link zu den Dateien in der cloud

Im Verzeichnis "Scripts and Programs" liegen die Scripte
Im Verzeichnis "Installation vPin Software with Baller Installer" sind Doku und Dateien zu der Installation zu finden.

3.1 Listings zu B2S-TableConfig scripts


3.1.1 Das Script DisableB2SDMD


; DisableB2SDMD.ahk V1.3 02-26-2024
;=========================================================
; the configuration is saved in "B2STableSettings.xml"
; instead of simple hopping thru the config-fields using TAB-commands, its important to use the window-ID of
the field to be changed
; the reason for that is that the active fields depend on the uses backglass.
; Windows-ID depends on Windows-version and B2S-version
;
;----------- Windows-IDs of B2S-Fields of B2S-Version 2.1.0-4e23218 (can be different in other versions) -----------
;values were determined by using the "Window spy", integrated in AutoHotkey, here Windows W10_22H2
; input field Windows-ID (NOT Win-hwnd)of the form
;Grill: WindowsForms10.COMBOBOX.app.0.13965fa_r8_ad110
;DMD: WindowsForms10.COMBOBOX.app.0.13965fa_r8_ad19
;B2S DMD: WindowsForms10.COMBOBOX.app.0.13965fa_r8_ad18
;Bring Forms: WindowsForms10.COMBOBOX.app.0.13965fa_r8_ad16
;save settings: WindowsForms10.BUTTON.app.0.13965fa_r8_ad12
#SingleInstance force
SetTitleMatchMode, 2 ; Damit der Fenstertitel Teil des gesuchten Textes sein kann
INIFileName := "B2SConfigValues.ini"
;check if INI-File exists
if !FileExist(INIFileName)
{
MsgBox,16, Error,INI-File is missing
ExitApp
}
IniRead WaitTime, %INIFileName%, Config, WaitTime
IniRead vPinPC, %INIFileName%, Config, vPinPC
IniRead DevPC, %INIFileName%, Config, DevPC
if (vPinPC = 1) and (DevPC = 1)
{
MsgBox, 16, Error, Wrong values in INI-file, vPinPC=1 and DevPC=1
ExitApp
}
if (vPinPC = 0) and (DevPC = 0)
{
MsgBox, 16, Error, Wrong values in INI-file, vPinPC=0 and DevPC=0
ExitApp
}
B2SDMD := "H" ; Hidden
; open B2S-config window
Sleep, 100
; set focus on B2S window
WinActivate, ahk_exe B2SBackglassServerEXE.exe
Sleep, 100
Send S ; activate config window of B2S sending Key "S"
Sleep, %WaitTime%
; set focus to the field for "B2S DMD", B2S window has the Title "Settings.." Win-
dowsForms10.COMBOBOX.app.0.1ca0192_r6_ad18
if (DevPC = 1)
ControlFocus, WindowsForms10.COMBOBOX.app.0.13965fa_r11_ad18, Settings ; DEV-PC
if (vPinPC = 1)
ControlFocus, WindowsForms10.COMBOBOX.app.0.13965fa_r8_ad18, Settings ; vpin-PC
sleep, 200
Send %B2SDMD% ; value of field "B2S DMD:"
Sleep, %WaitTime%
; set focus on save settings button, only send key "S" goes the wrong way, if a field has focus which has a
value with "s"
if (DevPC = 1)
ControlFocus, WindowsForms10.BUTTON.app.0.13965fa_r11_ad12, Settings ;DEV-PC
if (vPinPC = 1)
ControlFocus, WindowsForms10.BUTTON.app.0.13965fa_r8_ad12, Settings ; vpin-PC
Sleep, %WaitTime%
; send again ok for the popping-up Confirmation window
Send {Enter}
Sleep, 100
Send {Tab}
Sleep, %WaitTime%
Send {Enter}
sleep %WaitTime%
send !{F4} ; send Alt+F4
WinActivate, Visual Pinball Player
; focus back to VPX-player
ExitApp

3.1.2 Das Script EnableB2SDMD

; EnableB2SDMD.ahk V1.3 02-26-2024
;=========================================================
; the configuration is saved in "B2STableSettings.xml"
; instead of simple hopping thru the config-fields using TAB-commands, its important instead to use the window-
ID of the field to be changed
; the reason for that is that the active fields depend on the uses backglass.
; Windows-ID depends on Windows-version and B2S-version
;
;----------- Windows-IDs of B2S-Fields of B2S-Version 2.1.0-4e23218 (can be different in other versions) -----------
;values were determined by using the "Window spy", integrated in AutoHotkey, here Windows W10_22H2
; input field Windows-ID (NOT Win-hwnd)of the form
;Grill: WindowsForms10.COMBOBOX.app.0.13965fa_r8_ad110
;DMD: WindowsForms10.COMBOBOX.app.0.13965fa_r8_ad19
;B2S DMD: WindowsForms10.COMBOBOX.app.0.13965fa_r8_ad18
;Bring Forms: WindowsForms10.COMBOBOX.app.0.13965fa_r8_ad16
;save settings: WindowsForms10.BUTTON.app.0.13965fa_r8_ad12
#SingleInstance force
SetTitleMatchMode, 2 ; Damit der Fenstertitel Teil des gesuchten Textes sein kann
INIFileName := "B2SConfigValues.ini"
;check if INI-File exists
if !FileExist(INIFileName)
{
MsgBox,16, Error,INI-File is missing
ExitApp
}
IniRead WaitTime, %INIFileName%, Config, WaitTime
IniRead vPinPC, %INIFileName%, Config, vPinPC
IniRead DevPC, %INIFileName%, Config, DevPC
if (vPinPC = 1) and (DevPC = 1)
{
MsgBox, 16, Error, Wrong values in INI-file, vPinPC=1 and DevPC=1
ExitApp
}
if (vPinPC = 0) and (DevPC = 0)
{
MsgBox, 16, Error, Wrong values in INI-file, vPinPC=0 and DevPC=0
ExitApp
}
B2SDMD := "V" ; Visible
; open B2S-config window
Sleep, 100
; set focus on B2S window
WinActivate, ahk_exe B2SBackglassServerEXE.exe
Sleep, 100
Send S ; activate config window of B2S sending Key "S"
Sleep, %WaitTime%
; set focus to the field for "B2S DMD", B2S window has the Title "Settings.." Win-
dowsForms10.COMBOBOX.app.0.1ca0192_r6_ad18
if (DevPC = 1)
ControlFocus, WindowsForms10.COMBOBOX.app.0.13965fa_r11_ad18, Settings ; DEV-PC
if (vPinPC = 1)
ControlFocus, WindowsForms10.COMBOBOX.app.0.13965fa_r8_ad18, Settings ; vpin-PC
sleep, 200
Send %B2SDMD% ; value of field "B2S DMD:"
Sleep, %WaitTime%
; set focus on save settings button, only send key "S" goes the wrong way, if a field has focus which has a
value with "s"
if (DevPC = 1)
ControlFocus, WindowsForms10.BUTTON.app.0.13965fa_r11_ad12, Settings ;DEV-PC
if (vPinPC = 1)
ControlFocus, WindowsForms10.BUTTON.app.0.13965fa_r8_ad12, Settings ; vpin-PC
Sleep, %WaitTime%
; send again ok for the popping-up Confirmation window
Send {Enter}
Sleep, 100
Send {Tab}
Sleep, %WaitTime%
Send {Enter}
sleep %WaitTime%
send !{F4} ; send Alt+F4
WinActivate, Visual Pinball Player
; focus back to VPX-player
ExitApp

3.2 Listings zu BAMKeyhook und BAMkeyhook-start

3.2.1 Der Sourcecode zu „BAMkeyhook-start“

; BAMkeyHook-Start.exe, first part of the scripts to implement the hotkey to enter BAM when table is running
;===================================================================================
; Description:
keyhook to configure Table-configuration within BAM, using Flipper-buttons.
; No need using an external keyboard
; for restrictions of Autohotkey the keyhook ha 2 scripts
;
; Author: MOster
; Date: 11-02-2023
; Version: 1.5.4
;===================================================================================
#Persistent
#Include logging.ahk ; lib for logging in text-file
SetTitleMatchMode, 2 ; 2: WindowTitle can be part of the text searched for
SetWorkingDir %A_ScriptDir%
bPressed := false ; preset hotkey state
HotkeySet := 0 ; flag if hotkey is set
OnExit, Cleanup
;SetKeyDelay, -1 ; shortest possible delay
INIFileName := "BAMkeyhook.ini" ; directory must
;MsgBox "%A_ScriptDir%\keyhook.ini"
;check if INI-File exists
if !FileExist(INIFileName)
{
MsgBox,16, Error,INI-File is missing
ExitApp
}
; Read the config values in keyhook.ini
IniRead, exeToWatchFP, %INIFileName%, config, exeToWatchFP ; check if Future Pinball is running
IniRead, keyHookProg, %INIFileName%, config, keyHookProg ; Prog.name of the second hotkey-prog with
navigating commands within BAM
IniRead, BAMhotkey, %INIFileName%, config, BAMhotkey ; Hotkey for BAM-menu when table is running
IniRead, WaitForFP, %INIFileName%, config, WaitForFP ; time to wait until FP is started, before start of
timer if FP is running
IniRead, debug, %INIFileName%, config, debug ; debug=1: activated, debug=0: deactivated. Shows
add. MsgBox with values
IniRead, logging, %INIFileName%, config, logging ; logging=0: deactivated, logging=1: append logging,
logging=2: log into new file
global logging, debug, FirstLog
; check if reading section was succesful
if ErrorLevel
{
MsgBox,16,Error, There was an error reading value in keyhook.ini.
ExitApp
}
DbgLog("INI-values: exeToWatchFP: " exeToWatchFP ", keyHookProg: " keyHookProg ", BAMhotkey: " BAM-
hotkey ", WaitForFP: " WaitForFP "sec. , debug: " debug ", logging: " logging)
; 1. step to recognize if FP is started, wait til vpxstarter.exe has loaded
; !!!!!!! IMPORTANT, wait until start of vpxstarter-process is finished, its necessary, because this process hinders
recognition in AutoHotkey
sleep, 10000
; !!!!!!!
; 2. step: loop to check that future pinball is running
Loop
{
if WinExist("ahk_exe" exeToWatchFP)
{
; FP has started
DbgLog("Info: " exeToWatchFP " is running")
Break ; exit loop
}
DbgLog("Loop-Index(WinExist), wait for FP: " A_Index)
Sleep, 1000 ; waittime 1 Sec. until check again if FP is running
if (A_Index > WaitForFP) ; counter waittime in seconds, to avoid endless loop, if FP never starts
{
DbgLog("Timeout Error: " exeToWatchFP " not started !")
msgbox, 48, Error, % exeToWatchFP " not started !"
break
}
} ; end of loop
DbgLog("Exit Loop 'Wait for FP is started'")
; timer to check every second, if Future pinball is running, when closed, also exit Program
SetTimer, CheckFPRunning, 1000
DbgLog("SetTimer with CheckFPRunning, 1000 ms")
return
; 3. step, checks if FP is still running or FP is closed
CheckFPRunning:
if not WinExist("ahk_exe" exeToWatchFP)
{
DbgLog("SUB:CheckFPRunning, FP not running, countFPRunning: " countFPRunning)
++countFPRunning
; Close program
if countFPRunning > 1
{
DbgLog("Info: " exeToWatchFP " is closed, exit prog")
ExitApp
}
}
else
{
DbgLog("SUB:CheckFPRunning, checked FP if running")
if (HotkeySet=0)
{
countFPRunning := 0
DbgLog("SUB:CheckFPRunning, FP is running, set Hotkey")
Hotkey, $*%BAMhotkey%, DynamicHotkey
HotkeySet:=1
}
}
return
; Dynamic Keymapping
DynamicHotkey:
{
; At each hotkey pressed, toggle state is saved in "bPressed"
; BAM within Future Pinball needs key_pressed and key_released event, simple sendkey does not work
if (bPressed)
{
bPressed := false
; send key-down event
SendEvent {%BAMhotkey% down}
Sleep 50 ; Delay betwen key_pressed and key_released (in ms)
; send key-up event
SendEvent {%BAMhotkey% up}
DbgLog("Info: Hotkey deactivated, bPressed false: " bPressed)
; at first the Process-ID must be found, the function returns the ID in Errorlevel
; then the program can be closed with this ID using the variable
DbgLog("Info: Check for prozess: " keyHookProg)
Process, Exist, %keyHookProg%
Process, close, %ErrorLevel%
DbgLog("Info: Process " keyHookProg " closed")
return
}
else
{
bPressed := true
; send key-down event
SendEvent {%BAMhotkey% down}
Sleep 50 ; Delay betwen key_pressed and key_released (in ms)
; send key-up event
SendEvent {%BAMhotkey% up}
DbgLog("DynamicHotkey: Hotkey activated, bPressed true: " bPressed)
DbgLog("DynamicHotkey: Run Program: " A_ScriptDir "\" keyHookProg)
Run, % A_ScriptDir . "\" . keyHookProg ; run second hotkey-prog. BAMkeyKook.exe
sleep 200
}
return
}
Cleanup:
SetKeyDelay, %A_KeyDelay%
ExitApp

3.2.2 Der Sourcecode zu BAMkeyHook

; BAMkeyHook.exe, second part of the scripts to implement the hotkey to enter BAM when table is running
;===================================================================================
; Description: keyhook to configure Table-configuration within BAM, using Flipper-buttons.
; No need using an external keyboard
; for restrictions of Autohotkey the keyhook has 2 scripts
;
; Author: MOster
; Date: 06-24-2023
; Version: 2.4
; toDo: fix code part for handling of shift-key in BAM.
;==================================================================================
;
#Persistent
SetBatchLines, 20
#SingleInstance
#Include logging.ahk ; lib for logging in text-file
SetTitleMatchMode, 2 ; 2: WindowTitle can be part of the window text searched for
SetWorkingDir %A_ScriptDir%
; Name of INI-file
IniFileName := "BAMkeyhook.ini"
;check if INI-File exists
if !FileExist(INIFileName)
{
MsgBox,16, Error,INI-File is missing
ExitApp
}
; Read Keymappings from INI-file
IniRead, exeToWatchFP, %INIFileName%, config, exeToWatchFP ; for check, if Future Pinball is running
IniRead, KeyMappings, %INIFileName%, Mappings ; read Kemappings from ini file
IniRead, FastModeEditTime, %INIFileName%, config, FastModeEditTime ; duration Right shift-key must be
pressed until quick edit-mode in BAM-menu is activated
IniRead, debug, %INIFileName%, config, debug ; debug=1: activated, debug=0: deactivated
IniRead, logging, %INIFileName%, config, logging ; logging=0: deactivated, logging=1: append logging, log-
ging=2: log into new file
IniRead, TestMode, %INIFileName%, config, TestMode ; TestMode=1: no running Future Pinball needed, 0: FP
must be started
IniRead, FastBAMEditMode, %INIFileName%, config, FastBAMEditMode ; 0: deactivates fast editing of values
in BAM-menu, faulty code !!
global logging, debug, FirstLog
RightPressed := false
LeftPressed := false
LShiftPressed := false
DbgLog("INI-values: KeyMappings: " KeyMappings ", exeToWatchFP: " exeToWatchFP ", debug: " debug ", log-
ging: " logging ", FastModeEditTime: " FastModeEditTime ", TestMode: " TestMode ", FastBAMEditMode: "
FastBAMEditMode)
DbgLog("--------------------------------------------------")
KeyArray := [] ; Array to save key values
if (TestMode = true) ; for testing: quit program when pressing Escape key
Hotkey, $*Esc, QuitProg
Loop, parse, KeyMappings, `n
{
DbgLog("Loop: Line number " A_Index " is: " A_LoopField)
KeyMap_array := StrSplit(A_LoopField, "=")
; check if right part of the keymap-value has "+" at the end. Thats a special treatment for up-key of the right
Shift-key
SpecialKeyPos := InStr(KeyMap_array[1], "+", , 0)
if (SpecialKeyPos > 0)
{
SpecialKeyCount++
; cut the last char (+) of special key sign and set this as resulting value for KeyMap
KeyMap_array[1] := SubStr(KeyMap_array[1], 1, SpecialKeyPos-1)
DbgLog("Loop: Special-key treatment(+): KeyMap_array[1]: " KeyMap_array[1])
HotkeyMap := "$*" . KeyMap_array[1] . " Up"
; create special Dynamic Hotkey
HotKeyLabel := "SpecialHotkeyUp" SpecialKeyCount
DbgLog("HotkeyLabel: " HotkeyLabel)
Hotkey, $*%HotkeyMap%, %HotkeyLabel%
DbgLog("Loop: Special key treatment(+): Hotkey created: " HotkeyMap " HotkeyLabel: " HotkeyLabel)
}
DbgLog("Loop: Key mapped parts: " KeyMap_array[1] " ---> " KeyMap_array[2])
HotkeyMap := "$*" . KeyMap_array[1]
DbgLog("Loop: Hotkey created: " HotkeyMap)
HotkeyLabel := "DynamicHotkey" . A_Index
DbgLog("Loop: HotkeyLabel: " HotkeyLabel)
DbgLog("--------------------------------------------------")
; create Dynamic Hotkeys
Hotkey, $*%HotkeyMap%, %HotkeyLabel%
; Add values to Array, 2-dim array
KeyArray[A_Index, 1] := KeyMap_array[1]
KeyArray[A_Index, 2] := KeyMap_array[2]
KeyArray_count := A_Index ; count max number for further use
} ; end of Loop
DbgLog("Main: Added values to 2-dim Array, KeyArray_count: " KeyArray_count " ,End of Loop")
; separate and save the 4 needed values, only the mapped keys [x,2] are used
Key1b := KeyArray[1,2] ; Up
Key2b := KeyArray[2,2] ; Down
Key3b := KeyArray[3,2] ; Right
Key4b := KeyArray[4,2] ; Left
DbgLog("Main: Down keys: Key1b: " Key1b ", Key2b: " Key2b)
; set Timer for check of Shift-keys
SetTimer, CheckShiftKeys, 100
DbgLog("Main: set Timer to check state of Shift-keys")
return
if (FastBAMEditMode = 1)
{
; Function to check Shift-keys
CheckShiftKeys:
DbgLog("CheckShiftKeys:")
; check if Right-key is pressed
if (RightPressed = true)
{
DbgLog("CheckShiftKeys:Right-key was set 'pressed'")
DbgLog("CheckShiftKeys:A_Tickcount - RightTime: " A_TickCount - RightTime)
; check if Right-key is pressed for more than FastModeEditTime in sec.
if (A_TickCount - RightTime >= FastModeEditTime)
{
DbgLog("CheckShiftKeys: check if Right-key is pressed for > "FastModeEditTime " ms.")
; activate Left Shift-key, if not already pressed
if (LShiftPressed = false)
{
LShiftPressed := true
Send, {LShift Down} ;sends add. Page-down key
; Here is the issue for the additinal send of "Page down" -key
DbgLog("CheckShiftKeys: activate Left Shift, if not already pressed. Send 'LShift Down'")
DbgLog("CheckShiftKeys: LShiftPressed: " LShiftPressed)
DbgLog("####### Left Shift-key locked ########")
}
}
else
{
; deactivate Left Shift-key, if already pressed
if (LShiftPressed = true)
{
LShiftPressed := false
Send, {LShift Up}
DbgLog("CheckShiftKeys: deactivate Left Sift-key, if pressed, Send 'LShift up'")
}
}
}
; check if Left-key is pressed
if (LeftPressed = true)
{
DbgLog("CheckShiftKeys:Left-key was set 'pressed'")
DbgLog("CheckShiftKeys:A_Tickcount - LeftTime: " A_TickCount - LeftTime)
; check if Right-key is pressed for more than FastModeEditTime in sec.
if (A_TickCount - LeftTime >= FastModeEditTime)
{
DbgLog("CheckShiftKeys: check if Left-key is pressed for > "FastModeEditTime " ms.")
; activate Left Shift-key, if not already pressed
if (LShiftPressed = false)
{
LShiftPressed := true
Send, {LShift Down} ;sends add. Page-up key
; Here is the issue for the additinal send of "Page-up" -key
DbgLog("CheckShiftKeys: activate Left Shift, if not already pressed. Send 'LShift Down'")
DbgLog("CheckShiftKeys: LShiftPressed: " LShiftPressed)
DbgLog("####### Left Shift-key locked ########")
}
}
else
{
; deactivate Left Shift-key, if already pressed
if (LShiftPressed = true)
{
LShiftPressed := false
Send, {LShift Up}
DbgLog("CheckShiftKeys: deactivate Left Sift-key, if pressed, Send 'LShift up'")
}
}
}
if (!WinExist("ahk_exe" exeToWatchFP) and (TestMode = 0))
{
DbgLog("CheckShiftKeys: FP is closed, ExitApp")
; Close program
DbgLog("Info: " exeToWatchFP " is closed, exit prog")
ExitApp
}
return
}
; Dynamic Hotkey-Function for RShift --> Up
DynamicHotkey1:
DbgLog("DynamicHotkey1: Hotkey1 '" Key1b "' pressed")
; send key-down event
SendEvent {%Key1b% down}
DbgLog("DynamicHotkey1: '" Key1b "' Down send")
Sleep 50 ; Delay betwen key_pressed and key_released (in ms)
; send key-up event
SendEvent {%Key1b% up}
DbgLog("DynamicHotkey1: '" Key1b "' Up send")
return
; Dynamic Hotkey-Function for LShift --> Down
DynamicHotkey2:
DbgLog("DynamicHotkey2: Hotkey2 '" Key2b "' pressed")
; send key-down event
SendEvent {%Key2b% down}
Sleep 50 ; Delay betwen key_pressed and key_released (in ms)
; send key-up event
SendEvent {%Key2b% up}
DbgLog("DynamicHotkey2: " Key2b "-Down + " Key2b "-Up send")
return
; Dynamic Hotkey-Function for RCtrl --> Right
DynamicHotkey3:
DbgLog("DynamicHotkey3: Hotkey3 '" Key3b "' pressed")
; Check, if Right-key already pressed
if (RightPressed = false) and (FastBAMEditMode = 1)
{
RightPressed := true
RightTime := A_TickCount
DbgLog("DynamicHotkey3: Set RightPressed true")
}
; send key-down event
SendEvent {%Key3b% down}
Sleep 50 ; Delay betwen key_pressed and key_released (in ms)
; send key-up event
SendEvent {%Key3b% up}
DbgLog("DynamicHotkey3: " Key3b "-Down + " Key3b "-Up send")
if (LShiftPressed)
sleep 500 ; wait 0.5sec between each key-send, if FastEditBAMmode is active
return
; Dynamic Hotkey-Function for LCtrl --> Left
DynamicHotkey4:
DbgLog("DynamicHotkey4: Hotkey4 '" Key4b "' pressed")
if (LeftPressed = false) and (FastBAMEditMode = 1)
{
LeftPressed := true
LeftTime := A_TickCount
DbgLog("DynamicHotkey4: Set LeftPressed true")
}
; send key-down event
SendEvent {%Key4b% down}
Sleep 50 ; Delay betwen key_pressed and key_released (in ms)
; send key-up event
SendEvent {%Key4b% up}
DbgLog("DynamicHotkey4: " Key4b "-Down + " Key4b "-Up send")
if (LShiftPressed)
sleep 500 ; wait 0.5sec between each key-send, if FastEditBAMmode is active
return
; special Hotkey for release of left shift-key, if in "fast edit" mode in BAM-menu
SpecialhotKeyUp1:
;~Right Up::
DbgLog("SpecialhotKeyUp1: RightPressed: " RightPressed " before, set false")
RightPressed := false
DbgLog("SpecialhotKeyUp1:RightPressed :" RightPressed " LeftPressed: " LeftPressed)
; Linke Shift-Taste deaktivieren, falls gedrückt
if (LShiftPressed = true) and (FastBAMEditMode = 1)
{
LShiftPressed := false
Send, {LShift Up}
DbgLog("SpecialhotKeyUp1: deactivate Left Shift-key, if pressed")
DbgLog("####### Left Shift key lock released ########")
}
Send, {Right Up}
DbgLog("SpecialhotKeyUp1:Send 'Right Up'")
return
; special Hotkey for release of left shift-key, if in "fast edit" mode in BAM-menu
SpecialhotKeyUp2:
DbgLog("SpecialhotKeyUp2: LeftPressed: " LeftPressed " before, set false")
LeftPressed := false
DbgLog("SpecialhotKeyUp2:LeftPressed :" LeftPressed " LShiftPressed: " LShiftPressed)
; Linke Shift-Taste deaktivieren, falls gedrückt
if (LShiftPressed = true) and (FastBAMEditMode = 1)
{
LShiftPressed := false
Send, {LShift Up}
DbgLog("SpecialhotKeyUp2: deactivate Left Shift-key, if pressed")
DbgLog("####### Left Shift key lock released ########")
}
Send, {Left Up}
DbgLog("SpecialhotKeyUp2:Send 'Left Up'")
return
QuitProg:
;~ESC::
DbgLog("'ESC' pressed, exit Prog")
ExitApp
; add additional hotkey functions, if necessary....

Login Form