Skip to content

Instantly share code, notes, and snippets.

@maul-esel
Created November 18, 2012 14:59
Show Gist options
  • Save maul-esel/4105682 to your computer and use it in GitHub Desktop.
Save maul-esel/4105682 to your computer and use it in GitHub Desktop.
A custom implementation of a SingleInstance script (e.g. for custom messages to be displayed)
#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