Тема: AHK: Остановка одного скрипта из тела другого
Есть несколько способов программно завершить работу одного скрипта AutoHotkey из другого.
1. Можно использовать команду ExitApp, повесив её на какое-либо сочетание клавиш. В другом скрипте можно это сочетание клавиш послать командой Send. В первом скрипте пишем, например:
; CTRL+ALT+SHIFT+WIN+F12 (не руками же нажимать будем) - выйти из скрипта
^!+#F12::ExitApp
Во втором скрипте ("управляющем"):
Send, ^!+#{F12} ; CTRL+ALT+SHIFT+WIN+F12
Запускаем второй скрипт - первый закрывается.
Однако, при этом будут работать не все сочетания клавиш. Не будут работать те сочетания клавиш, которые используют для своей реализации keyboard hook, например, клавиши с префиксом $ или клавиши, назначенные скан-кодами. Чтобы определить, используется ли keyboard hook в каких-либо горячих клавишах вашего скрипта, откройте окно запущенного скрипта с помощью двойного щелчка по его иконке в трее и выполните команду меню "View" - "Hotkeys and their methods". В колонке "Type" будет содержаться необходимая вам информация.
2. Если заранее известно имя закрываемого скрипта, тогда закрыть его из другого скрипта можно, например, так:
SetTitleMatchMode, 2 ; сравнивать с любой частью заголовка окна
DetectHiddenWindows, On ; искать в скрытых окнах
WinClose, Script2Close.ahk - AutoHotkey v ; останавливаем скрипт ("выходим" его)
В данном примере закрывается скрипт "Script2Close.ahk".
3. И третий, возможно, самый лучший способ. В первом скрипте пишем:
OnMessage(CloseMyScript, "CloseScriptMonitor") ; мониторим наше сообщение
CloseScriptMonitor()
{
ExitApp
}
Во втором:
DetectHiddenWindows, On ; искать в скрытых окнах
; получить в массив список всех окон класса AutoHotkey:
WinGet, Array_id, list, ahk_class AutoHotkey
Loop, %Array_id% ; просмотреть массив окон
; выслать всем найденным окнам своё сообщение:
PostMessage, CloseMyScript,,,, % "ahk_id" Array_id%A_Index%
Информацию опубликовал Androgen.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.