Тема: AHK: SkriptKiller
Нужен скрипт, который убьёт все запущенные ахк-процессы в системе.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Нужен скрипт, который убьёт все запущенные ахк-процессы в системе.
yellow Поиск что показал?
__Михаил__
поиск?
Показал что есть кнопка создания новой темы.
Process, Cmd, PID-or-Name [, Param3]
PID := DllCall("GetCurrentProcessId")
WinClose/Close
WaitClose: ждёт, пока не будут закрыты ВСЕ отвечающие параметру PID-or-Name процессы.
Вот что-то из этого.
Так вот как узнать PID процесса? Что объединяет все ахк скрипты?
Все AHK скрипты объединяет наличие скрытого окна с классом AutoHotkey и путём к скрипту в заголовке. Это окно появляется, если сделать двойной клик по иконке скрипта в трее.
DetectHiddenWindows, On
WinGetTitle, ATitle, ahk_id
ahk_class AutoHotkey
WinClose, ahk_id %ID%
;;;;;;;;;
AHKPanic(Kill=0, Pause=0, Suspend=0, SelfToo=0) {
DetectHiddenWindows, On
WinGet, IDList ,List, ahk_class AutoHotkey
Loop %IDList%
{
ID:=IDList%A_Index%
WinGetTitle, ATitle, ahk_id %ID%
IfNotInString, ATitle, %A_ScriptFullPath%
{
If Suspend
PostMessage, 0x111, 65305,,, ahk_id %ID% ; Suspend.
If Pause
PostMessage, 0x111, 65306,,, ahk_id %ID% ; Pause.
If Kill
WinClose, ahk_id %ID% ;kill
}
}
If SelfToo
{
If Suspend
Suspend, Toggle ; Suspend.
If Pause
Pause, Toggle, 1 ; Pause.
If Kill
ExitApp
}
}
Нашёл вот такой скрипт, но чё-то он нерабоатет. Может WaitClose надо?
F1::
DetectHiddenWindows On
WinClose ahk_class AutoHotkey
return
Taveron
Этот скрипт, скорее всего, закроет сам себя.
Этот скрипт, скорее всего, закроет сам себя.
Да, так и есть.
Время жизни всех скриптов в системе ограниченно. Каждый из них так или иначе прекращается рано или поздно по тем или иным причинам. Что позволяет завершить их досрочно?
Вобще не в этом даже проблема, а в том что иногда деректива
#SingleInstance force
перестаёт работать и скрипт открывает сам себя 1000 раз.
Время жизни всех скриптов в системе ограниченно.
Что вы имеете в виду? Любой процесс скрипта, если не закроется сам, или его что-то не закроет специально, будет существовать до завершения сессии.
скрипт открывает сам себя 1000 раз
А что за сценарий? Зачем скрипту открывать самому себя?
до завершения сессии.
Я об этом и говорю - в него уже заложен алгоритм прекращения, и он в прекращающейся природе создателя.
Зачем скрипту открывать самому себя?
Это я у него тоже спросил.
Это я у него тоже спросил
У кого, у него-то? У скрипта?
yellow Вы специально игнорите правила? Странно что teadrinker ни разу не заметил это.
;[svoboden] Закрывает все скрипты, кроме запускаемого:
#Persistent
PID := DllCall("GetCurrentProcessId")
query := "SELECT Handle FROM Win32_Process WHERE Caption='AutoHotkey.exe'"
If (oWMI := ComObjGet("winmgmts:").ExecQuery(query)).Count > 1
For colItem In oWMI
If colItem.Handle != PID
colItem.Terminate()
PID := query := oWMI := ""
Return
__Михаил__
Проще перечислить окна, узнать их процессы и закрыть их. WMI лучше избегать, оно довольно накладно.
У кого, у него-то? У скрипта?
В том смысле что мне тоже интересно. Но похоже в этом и заложен сам смысл его выполнения. Он продолжает создавать неуникальные копии самого себя, несмотря на обратную дерективу. Это восстание машин в какой-то степени.
yellow
Старайтесь не использовать вложенные цитаты, это запрещено правилами. Я отредактировал ваш пост.
Скрипт-то ваш или чужой?
+ открыть спойлер;[svoboden] Закрывает все скрипты, кроме запускаемого: #Persistent PID := DllCall("GetCurrentProcessId") query := "SELECT Handle FROM Win32_Process WHERE Caption='AutoHotkey.exe'" If (oWMI := ComObjGet("winmgmts:").ExecQuery(query)).Count > 1 For colItem In oWMI If colItem.Handle != PID colItem.Terminate() PID := query := oWMI := "" Return
WMI лучше избегать, оно довольно накладно.
Ну да, он как-то не сразу закрывает. Там какой-то промежуток есть.
Старайтесь не использовать вложенные цитаты, это запрещено правилами
А, цитата в цитате...
Скрипт-то ваш
Да он мне уже как свой...
AHKPanic(Kill=0, Pause=0, Suspend=0, SelfToo=0) {
DetectHiddenWindows, On
WinGet, IDList ,List, ahk_class AutoHotkey
Loop %IDList%
{
ID:=IDList%A_Index%
WinGetTitle, ATitle, ahk_id %ID%
IfNotInString, ATitle, %A_ScriptFullPath%
{
If Suspend
PostMessage, 0x111, 65305,,, ahk_id %ID% ; Suspend.
If Pause
PostMessage, 0x111, 65306,,, ahk_id %ID% ; Pause.
If Kill
WinClose, ahk_id %ID% ;kill
}
}
If SelfToo
{
If Suspend
Suspend, Toggle ; Suspend.
If Pause
Pause, Toggle, 1 ; Pause.
If Kill
ExitApp
}
}
Ну вот здесь же перечисляется, но как-то он не очень помогает.
В любом случае это хоть что-то. А я думал не существует скрипта, способного закрыть остальные, не закрывая вперёд себя.
Скрипт, который я предлагал, можно скомпилировать и тогда он не должен закрываться.
F1::
DetectHiddenWindows On
WinClose ahk_class AutoHotkey
return
yellow От админа запустить, затем выполнить функцию 'AHKPanic(1)'. В чём проблема?
Скрипт, который я предлагал, можно скомпилировать и тогда он
От админа запустить, затем выполнить функцию 'AHKPanic(1)
Сколько сразу новых способов появилось)
Ну он должен быть уже запущен, чтобы нажав горячую клавишу выполнился сценарий. На момент когда запустятся 20 экземпляров уже невозможно будет открыть что-то еще.
Так стоп. А скомпилированный скрипт будет уже иметь другой подзаголовок? Там не отображается просто.
Тогда и для скомпилированных закрывать тоже надо, т.к. теоретически они могут быть скомпилированные.
yellow Что мешает добавить запрет на запуск повторов скрипта?
#SingleInstance force перестаёт работать и скрипт открывает сам себя 1000 раз.
Покажите код этого скрипта.
yellow Что мешает добавить запрет на запуск повторов скрипта?
он есть
Покажите код этого скрипта.
Он сильно объёмный чтобы в нём копались еще несколько человек. мне самоу интересно почему недостаточно одной дерективы в начале скрипта чтобы предотвратить повторный многократный запуск.
#Persistent
DEL::
PID := DllCall("GetCurrentProcessId")
query := "SELECT Handle FROM Win32_Process WHERE Caption='AutoHotkey.exe'"
If (oWMI := ComObjGet("winmgmts:").ExecQuery(query)).Count > 1
For colItem In oWMI
If colItem.Handle != PID
colItem.Terminate()
PID := query := oWMI := ""
Return
Впринципе вот такой скрипт их закрывает, вопрос только что медленно. Если бы можно было его как-то ускорить?
И + добавить закрытие скомпилированных скриптов.
Я же вроде сказал, какой алгоритм должен быть. Никому не судьба реализовать?
Я же вроде сказал, какой алгоритм
Я ничего не понял из сказанного. Где там слово WMI?
И вот это
WinGet, IDList ,List, ahk_class AutoHotkey
Loop %IDList%
Разве не перебор всех открытых процессов?
Окей:
-Перечисляем окна
-Узнаём их процесс
-Закрываем их
Где там слово WMI?
А зачем вам это слово?
Разве не перебор всех открытых процессов?
Нет, это список окон. Окно и процесс — разные вещи. Но если вы перечислите все AHK окна, вы сможете узнать и ID их процессов.
Но если вы перечислите все AHK окна
По какому параметру перечислять и ahk и exe?
DetectHiddenWindows, On
WinGet, id, list,,, Program Manager
Loop, %id%
{
this_id := id%A_Index%
WinActivate, ahk_id %this_id%
WinGetClass, this_class, ahk_id %this_id%
WinGetTitle, this_title, ahk_id %this_id%
MsgBox, 4,
, Обход всех окон`n`n%a_index% из %id%`nahk_id %this_id%`nahk_class %this_class%`n%this_title%`n`nПродолжить?
IfMsgBox, NO, break
WinClose, %WinGetClass%
}
По классу окна.
yellow, вы лучше бы лечили причину недуга, а не симптомы. А причина у вас скорее всего в скрипте.
yellow, вы лучше бы лечили причину недуга, а не симптомы. А причина у вас скорее всего в скрипте.
Ясен пень, но уже слишком много написано чтобы что-то менять всё равно баги так или иначе и в самом ахк есть даже если они на первый взгляд не видны.
yellow, если скрипт дублирует сам себя, то это не баги AHK, а ошибка в коде этого скрипта. Тестируйте код кусками в чистом файле ahk.
yellow, не нужно цитировать предыдущий пост.
Вот пример неправильного кода:
#SingleInstance, Force
F1::
loop 10
Reload
return
Скрипт начинает дублировать себя, даже при наличии директивы #SingleInstance, Force.
Я по привычке в чате где большой поток сообщений не успеваешь написать сразу после нужного поста и выходит несуразица.
Вот видите что получилось - пока писал - между моим постом кто-то оставил ответ, и текст получился глупым.
Вот пример неправильного кода:
#SingleInstance, Force F1:: loop 10 Reload return
Скрипт начинает дублировать себя, даже при наличии директивы #SingleInstance, Force.
Да, там есть релоад. А что он как ведёт себя? Что нужно добавиь к релоад чтобы учитывало эту директиву? Вроде бы просто должен перезагружаться и всё. Но при "некоторых обстоятельствах" открывается несколько копий.
Там стоит ~Capslock::Reload и всё, он уже больше ничем не закрывается.
Если выполнять 'Reload' неправильно, то будет запуск несколько копий. Как минимум ожидание отпуска клавиши добавить нужно. Это самое простое что придёт в голову любому при подобной проблеме. В теле скрипта обязательно задержку использовать после шапки автозапуска. Так может помочь при резком запуске скрипта от повторов.
Попробуйте сделать так:
~CapsLock up::Reload
Здесь Reload будет срабатывать при отпускании CapsLock.
В вашем же варианте, Reload срабатывает постоянно с маленькой задержкой, когда удерживается CapsLock, и директива не успевает срабатывать.
В теле скрипта обязательно задержку использовать после шапки автозапуска
В каком именно месте? Что такое шапка автозапуска?
~CapsLock up::Reload
Не особо помогает. Всё также может открыть ни с того не с сего 50 копий.
Может задержку добавить? пару мс...
~Capslock up::
Sleep 1
Reload
*End::
ExitApp
return
В этом месте кода проблем не должно быть.
Тестируйте горячие клавиши по одной в новом файле. Пробуйте многократно активировать, а также удерживать горячую клавишу.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться