Замечательные примеры. Добавлю свои пять копеек, дабы превентивно подсказать ТС «в каком направлении копать, если что-то непонятно».
Надо, чтобы при появлении в фокусе любого чата Skype […] скрипт [перечисление требуемых операций]
В сообщениях выше — два варианта исполнения условия задачи.
Первый подразумевает ожидание, когда активное окно перестанет быть таковым, второй — реагирование на событие изменения активного окна.
Ниже — упрощенный вариант второго примера, разбавленный комментариями.
DllCall("RegisterShellHookWindow", "uint", A_ScriptHwnd) ; 1) Регистрируем скрытое окно скрипта в качестве «получателя уведомления об изменении активного окна»
MsgNum := DllCall("RegisterWindowMessage", "str", "SHELLHOOK")
OnMessage(MsgNum, "WindowActivated") ; 2) При получении сообщения о событии будет выполняться функция с именем WindowActivated…
OnExit, Esc
return
WindowActivated(wParam, lParam) ; 3) …в которую будут переданы два параметра…
{
global activatedWindowHwnd ; Глобальная переменная сохраняющая значение id окна для отображения в TrayTip
if (wParam = 4) ; 4) …первый из них содержит «тип события»…
{
activatedWindowHwnd := lParam ; 5) …второй — Id окна, которое в данном случае (wParam=4) стало активным
SetTimer, TrayTip, -250 ; Таймер запускает действия выполняемые от метки до return в отдельном псевдопотоке.
}
}
TrayTip:
TrayTip,, %activatedWindowHwnd% ; traytip для демонстрации, что вариант всё-ещё работает
return
Esc::
DllCall("DeregisterShellHookWindow", "uint", A_ScriptHwnd) ; действие очевидно из имени функции.
ExitApp