OnMessage отслеживает только сообщения, посланные своему приложению.
Смену активного окна, наверное, правильно отслеживать с помощью хука SetWindowsHookEx, но в AHK он не сработает.
Можно выйти из положения, установив SetWinEventHook и отслеживая событие смены клавиатурного фокуса EVENT_OBJECT_FOCUS. Но оно будет происходить даже при получении фокуса разными контролами внутри одного окна, поэтому нужно определять окно верхнего уровня, которому принадлежит контрол. Если его хэндл сменился — произошла смена активного окна.
Примерно так:
#Persistent
EVENT_OBJECT_FOCUS := 0x8005
global WS_CHILD := 0x40000000, hPrevActive
WinGet, hPrevActive,, A
HWINEVENTHOOK := SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_FOCUS, 0
, RegisterCallback("WatchingActivateWindow", "F"), 0, 0, 0)
OnExit, Exit
return
Exit:
DllCall("UnhookWinEvent", Ptr, HWINEVENTHOOK)
ExitApp
WatchingActivateWindow(hWinEventHook, event, hwnd)
{
h := hwnd
While !toplevel
{
WinGet, Style, Style, ahk_id %h%
if (Style & WS_CHILD)
h := DllCall("GetParent", Ptr, h, Ptr)
else
toplevel := 1
}
if (h != hPrevActive)
ToolTip % hPrevActive := h ; хэндл активного в данный момент окна
}
SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)
{
return DllCall("SetWinEventHook" , UInt, eventMin, UInt, eventMax
, Ptr, hmodWinEventProc, Ptr, lpfnWinEventProc
, UInt, idProcess, UInt, idThread
, UInt, dwFlags, Ptr)
}
Разработка AHK-скриптов:
e-mail
dfiveg@mail.ruTelegram
jollycoder