-
-
Save sl5net/11204801 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#NoEnv | |
#SingleInstance off ; sonst kriegen wir (zumindest bei kurzen Skripten) die AHK-Meldung | |
/* | |
registriere Nachrichten | |
=========================== | |
Wir könnten hier irgendwelche festen Zahlen verwenden, aber wenn wir Pech haben, führt das zu Konflikten mit anderen Programmen, | |
die dieselbe Zahl für was Anderes nutzen. | |
Also registrieren wir die Nachricht offiziell bei Windows und kriegen den Zahlenwert dafür geliefert. | |
*/ | |
WM_JustStarted := DllCall("RegisterWindowMessage", "Str", "WM_JustStarted") | |
WM_AlreadyRunning := DllCall("RegisterWindowMessage", "Str", "WM_AlreadyRunning") | |
HWND_BROADCAST := 0xFFFF ; sendet an ALLE | |
; "lausche" auf WM_AlreadyRunning - Nachrichten und rufe ExitScript() auf, wenn das Skript WM_AlreadyRunning empfängt | |
OnMessage(WM_AlreadyRunning, "ExitScript") | |
detect_win := A_DetectHiddenWindows ; speichere Status | |
DetectHiddenWindows On ; da das Hauptfenster des Skripts i.d. Regel unsichtbar ist (falls sichtbare GUIs vorhanden nicht nötig) | |
; teile allen Prozessen mit, dass eine Instanz gestartet wurde | |
; Als ersten Parameter geben wir den Prozessen unseren Fensterhandle mit, sodass sie uns antworten können | |
SendMessage WM_JustStarted, A_ScriptHwnd, 0,, ahk_id %HWND_BROADCAST% | |
SetTimer, SwitchListeners, 3000 ; gebe allen Prozessen 3 s Zeit zu antworten (die Zeit kann evtl. verändert und feinjustiert werden) | |
; "lausche" auf WM_JustStarted - Nachrichten und rufe AlreadyRunning() auf, wenn eine neue Instanz gestartet wird | |
OnMessage(WM_JustStarted, "AlreadyRunning") | |
DetectHiddenWindows %detect_win% ; setze zurück auf den Standard-Wert | |
Loop | |
{ | |
ToolTip Anwendungs-Instanz %A_ScriptHWND% läuft... (%A_Index%) ; Beispiel-Anwendung (am Handle erkennen wir, welche Instanz gerade läuft) | |
sleep 1000 | |
} | |
return | |
SwitchListeners: | |
; die anderen Prozesse hatten ihre Chance, jetzt "lauschen" wir nicht mehr | |
OnMessage(WM_AlreadyRunning, "") | |
return | |
ExitScript() ; aufgerufen, wenn das Skript WM_AlreadyRunning empfängt | |
{ | |
TrayTip Beende Instanz, test | |
ExitApp ; die neue Instanz wird beendet | |
} | |
; aufgerufen, wenn das Skript WM_JustStarted empfängt | |
; "sender" ist der mitgegebene Parameter - also, siehe oben, der Fensterhandle des sendenden Skripts | |
AlreadyRunning(sender) | |
{ | |
global WM_AlreadyRunning | |
TrayTip Instanz läuft bereits!, test | |
PostMessage WM_AlreadyRunning, 0, 0,, ahk_id %sender% ; antworte: es läuft bereits eine Instanz | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment