На самом деле тот пример отслеживает события создания или активации определенных окон. В этом ключе я его с тех пор и гоняю.
OnWindowCreated("ahk_class Notepad", "Notepad_Created") ; первый параметр — window title в стандартном формате ahk, второй параметр — имя процедуры, которая должна выполнятся при создании окна с заданными первым параметром характеристиками
OnWindowActivated("ahk_class Notepad", "Notepad_Activated") ; первый параметр — window title в стандартном формате ahk, второй параметр — имя процедуры, которая должна выполнятся при активации окна с заданными первым параметром характеристиками
;!!return ; конец секции автовыполнения. не обязателен, но приемлем.
Notepad_Created(hWnd) ; эта процедура будет выполнятся при каждом создании окна
{
SplashImage,, M C11 ZH0 ZW0 ZX1 ZY1 B1 CTffffff CW8B0000 FM11 FS6 WM600 WS400,, Окно СОЗДАНО`nТеоретически его можно закрыть)))
Sleep, 2000
SplashImage, OFF
/*
; КОД ДЛЯ ЗАКРЫТИЯ ОКНА
ActiveWinID := WinExist("A")
WinClose, ahk_id %ActiveWinID%
*/
}
Notepad_Activated(hWnd) ; активация
{
SplashImage,, M C11 ZH0 ZW0 ZX1 ZY1 B1 CTffffff CW8B0000 FM11 FS6 WM600 WS400,, Окно АКТИВИРОВАНО`nТеоретически его можно закрыть)))
Sleep, 2000
SplashImage, OFF
/*
; КОД ДЛЯ ЗАКРЫТИЯ ОКНА
ActiveWinID := WinExist("A")
WinClose, ahk_id %ActiveWinID%
*/
}
OnWindowCreated(winTitle, procName = "", maxThreads = 1)
{
global ShellHookActionList
IsObject(ShellHookActionList) || ShellHookActionList := Object()
IsObject(ShellHookActionList[1]) || ShellHookActionList[1] := Object()
if procName
ShellHookActionList[1][winTitle] := procName
else
return ShellHookActionList[1][winTitle]
if !OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK")) {
DllCall("RegisterShellHookWindow", "UInt", A_ScriptHwnd)
OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK"), "ShellProc", maxThreads)
}
}
OnWindowActivated(winTitle, procName = "", maxThreads = 1)
{
global ShellHookActionList
IsObject(ShellHookActionList) || ShellHookActionList := Object()
IsObject(ShellHookActionList[4]) || ShellHookActionList[4] := Object()
if procName
ShellHookActionList[4][winTitle] := procName
else
return ShellHookActionList[4][winTitle]
if !OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK")) {
DllCall("RegisterShellHookWindow", "UInt", A_ScriptHwnd)
OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK"), "ShellProc", maxThreads)
}
}
ShellProc(wParam, lParam)
{
global ShellHookActionList
if ShellHookActionList.HasKey(wParam) {
for winTitle, procName in ShellHookActionList[wParam] {
WinGet, hWndList, List, %winTitle%
loop %hWndList%
continue
until hWndList%A_Index% = lParam && found := true
if (found)
%procName%(lParam), found := false
}
}
return
}
Только неудобно, что приходится для каждого окна прописывать свою функцию.