1

Тема: 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.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.