#Include OnWindow.ahk
; при запуске скрипта начинаем ждать факт создания окна проводника
OnWindowCreated("ahk_class CabinetWClass", "WaitForExplorerWindowCreated")
; при запуске скрипта начинаем ждать факт активации окна проводника
OnWindowActivated("ahk_class CabinetWClass", "WaitForExplorerWindowActivated")
; при нажатии F2 переключаем ожидание активации окна проводника
F2::OnWindowActivated("ahk_class CabinetWClass", OnWindowActivated("ahk_class CabinetWClass")? "":"WaitForExplorerWindowActivated")
WaitForExplorerWindowCreated(hWnd) {
MsgBox,, %A_ThisFunc%:`n hWnd = %hWnd%, Действие 1
}
WaitForExplorerWindowActivated(hWnd) {
MsgBox,, %A_ThisFunc%:`n hWnd = %hWnd%, Действие 2
}
Содержимое файла OnWindow.ahk:
OnWindowCreated(winTitle, procName = -1, maxThreads = 1) {
return ManageShellHookEventListeners("HSHELL_WINDOWCREATED", winTitle, procName, maxThreads)
}
OnWindowActivated(winTitle, procName = -1, maxThreads = 1) {
return ManageShellHookEventListeners("HSHELL_WINDOWACTIVATED", winTitle, procName, maxThreads)
}
ManageShellHookEventListeners(hookCode, ByRef winTitle, ByRef procName, ByRef maxThreads) {
static ShellHookEventList
static HookCodeList := {HSHELL_WINDOWCREATED: 1, HSHELL_WINDOWACTIVATED: 4}
if !hookCode := HookCodeList[hookCode]
return false
IsObject(ShellHookEventList) || ShellHookEventList := ShellProc(-1, 0) ; здесь копируем ссылку
IsObject(ShellHookEventList[hookCode]) || ShellHookEventList[hookCode] := Object()
if (procName = -1)
return ShellHookEventList[hookCode][winTitle].Name
else if (procName = "")
return ShellHookEventList[hookCode].Remove(winTitle).Name
else if IsFunc(procName) {
shellhookWM := DllCall("RegisterWindowMessage", "Str", "SHELLHOOK", "UInt")
if !OnMessage(shellhookWM) {
DllCall("RegisterShellHookWindow", "Ptr", A_ScriptHwnd, "Int")
OnMessage(shellhookWM, "ShellProc", maxThreads)
}
if !priorProcName := ShellHookEventList[hookCode].Remove(winTitle).Name
priorProcName := procName
ShellHookEventList[hookCode][winTitle] := Func(procName)
return priorProcName
}
else return false
}
ShellProc(wParam, lParam) {
static ShellHookEventList := {} ; здесь инициализируем
if ShellHookEventList.HasKey(wParam) {
for winTitle, Proc in ShellHookEventList[wParam]
if WinExist(winTitle . " ahk_id" . lParam)
%Proc%(lParam)
}
else if (wParam = -1)
return ShellHookEventList
else Sleep 0
}