REV.2
- Very flexible but a new event handler timer is created for every consumer function.
Code: Select all
;Event Handler Prototype
EH.Subscribe("WinChangeEventHandlerExample", "CallbackExample", 5000) ;every 5sec
EH.Subscribe("WinChangeEventHandlerExample", "AnotherCallbackExample", 100) ;every 0.1sec
class EH{ ;EventHandler class to register event callbacks & enabled/disable registered event handlers
Subscribe(eventHandlerName, callbackFunc, eventHandlerPollFreq:=100){
#Persistent
Global
EH_%eventHandlerName%%callbackFunc% := callbackFunc
eventHandlerName%callbackFunc% := Func(eventHandlerName).Bind(callbackFunc)
SetTimer, % eventHandlerName%callbackFunc%, % eventHandlerPollFreq
}
Unsubscribe(eventHandlerName, callbackFunc){ ;alias for Disable()
Global
this.Disable(eventHandlerName, callbackFunc)
}
Disable(eventHandlerName, callbackFunc){
eventHandlerName%callbackFunc% := Func(eventHandlerName).Bind(callbackFunc)
SetTimer, % eventHandlerName%callbackFunc%, off
}
Enable(eventHandlerName, callbackFunc){
eventHandlerName%callbackFunc% := Func(eventHandlerName).Bind(callbackFunc)
SetTimer, % eventHandlerName%callbackFunc%, on
}
}
CallbackExample(eventArray){
For each, eventParam in eventArray
MsgBox(A_ThisFunc "`n`n" each "`n" eventParam)
}
AnotherCallbackExample(eventArray){
For each, eventParam in eventArray
params .= each " - " eventParam "`n"
MsgBox(A_ThisFunc "`n`n" params)
}
WinChangeEventHandlerExample(callback){
Global
callbacks := EH_%A_ThisFunc%%callback%
eventArray := []
;MsgBox % callbacks
;check if active window changed, exec callbacks when it does
static lastHwnd := lastHwnd ? lastHwnd : WinExist("A")
If ( WinExist("A") != lastHwnd ){
lastHwnd := WinExist("A")
WinGetActiveStats, activeTitle, activeW, activeH, activeX, activeY
eventArray := {id:lastHwnd, title:activeTitle, x:activeX, y:activeY, w:activeW, h:activeH}
IsFunc(callback) ? %callback%(eventArray) : MsgBox("Error: `n`n`t" A_ThisFunc "`n`nEventHandler attempted to call non existent callback function: " callback, A_ScriptName,"0x40010")
SoundBeep
}
}
MsgBox(Text:="", Title:="", Options:="0x40040", TimeOut:=""){ ;default is info
MsgBox, % Options, % Title, % Text, % TimeOut
IfMsgBox, Yes
Return Text
IfMsgBox, Ok
Return Text
}
REV.1
- Less flexible but all consumer functions bound to the same event handler are tied to a the same single timer,so more efficient where that matters & consumer functions are called in the same order with which they were subscribed to the event handler, a useful functional artifact.
Code: Select all
;Event Handler Prototype
EH.Subscribe("WinChangeEventHandlerExample", "CallbackExample", 500)
EH.Subscribe("WinChangeEventHandlerExample", "AnotherCallbackExample", 100) ;updating eventHandler poll freq here updates it for EH above as well.
class EH{ ;EventHandler class to register event callbacks & enabled/disable registered event handlers
Subscribe(eventHandlerName, callbackFunc, eventHandlerPollFreq:=100){
#Persistent
Global
EH_%eventHandlerName% .= callbackFunc ","
SetTimer, % eventHandlerName, % eventHandlerPollFreq
}
Unsubscribe(eventHandlerName, callbackFunc, eventHandlerPollFreq:=100){
Global
EH_%eventHandlerName% .= StrReplace(EH_%eventHandlerName%, callbackFunc ",", "")
}
Disable(eventHandlerName){
SetTimer, % eventHandlerName, off
}
Enable(eventHandlerName){
SetTimer, % eventHandlerName, on
}
}
CallbackExample(eventArray){
For each, eventParam in eventArray
MsgBox(A_ThisFunc "`n`n" each "`n" eventParam)
}
AnotherCallbackExample(eventArray){
For each, eventParam in eventArray
params .= each " - " eventParam "`n"
MsgBox(A_ThisFunc "`n`n" params)
}
WinChangeEventHandlerExample(){
Global
callbacks := StrSplit(EH_%A_ThisFunc%, ",")
eventArray := []
;MsgBox % callbacks
;check if active window changed, exec callbacks when it does
static lastHwnd := lastHwnd ? lastHwnd : WinExist("A")
If ( WinExist("A") != lastHwnd ){
lastHwnd := WinExist("A")
WinGetActiveStats, activeTitle, activeW, activeH, activeX, activeY
eventArray := {id:lastHwnd, title:activeTitle, x:activeX, y:activeY, w:activeW, h:activeH}
For each, callback in callbacks
If Trim(callback)
IsFunc(callback) ? %callback%(eventArray) : MsgBox("Error: `n`n`t" A_ThisFunc "`n`nEventHandler attempted to call non existent callback function: " callback, A_ScriptName,"0x40010")
SoundBeep
}
}
MsgBox(Text:="", Title:="", Options:="0x40040", TimeOut:=""){ ;default is info
MsgBox, % Options, % Title, % Text, % TimeOut
IfMsgBox, Yes
Return Text
IfMsgBox, Ok
Return Text
}