1

Тема: AHK: SkriptKiller

Нужен скрипт, который убьёт все запущенные ахк-процессы в системе.

2

Re: AHK: SkriptKiller

yellow Поиск что показал?

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

3 (изменено: yellow, 2023-01-28 11:06:09)

Re: AHK: SkriptKiller

__Михаил__
поиск?

+ открыть спойлер

Показал что есть кнопка создания новой темы.

4 (изменено: yellow, 2023-01-28 11:40:14)

Re: AHK: SkriptKiller

Process, Cmd, PID-or-Name [, Param3]
PID := DllCall("GetCurrentProcessId")
WinClose/Close
WaitClose: ждёт, пока не будут закрыты ВСЕ отвечающие параметру PID-or-Name процессы.

Вот что-то из этого.

Так вот как узнать PID процесса? Что объединяет все ахк скрипты?

5

Re: AHK: SkriptKiller

Все AHK скрипты объединяет наличие скрытого окна с классом AutoHotkey и путём к скрипту в заголовке. Это окно появляется, если сделать двойной клик по иконке скрипта в трее.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6 (изменено: yellow, 2023-01-28 23:36:36)

Re: AHK: SkriptKiller

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 надо?

7

Re: AHK: SkriptKiller


F1::
DetectHiddenWindows On
WinClose ahk_class AutoHotkey
return

8

Re: AHK: SkriptKiller

Taveron
Этот скрипт, скорее всего, закроет сам себя.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9 (изменено: yellow, 2023-01-28 17:57:15)

Re: AHK: SkriptKiller

teadrinker пишет:

Этот скрипт, скорее всего, закроет сам себя.

Да, так и есть.
Время жизни всех скриптов в системе ограниченно. Каждый из них так или иначе прекращается рано или поздно по тем или иным причинам. Что позволяет завершить их досрочно?

Вобще не в этом даже проблема, а в том что иногда деректива

#SingleInstance force

перестаёт работать и скрипт открывает сам себя 1000 раз.

10

Re: AHK: SkriptKiller

yellow пишет:

Время жизни всех скриптов в системе ограниченно.

Что вы имеете в виду? Любой процесс скрипта, если не закроется сам, или его что-то не закроет специально, будет существовать до завершения сессии.

yellow пишет:

скрипт открывает сам себя 1000 раз

А что за сценарий? Зачем скрипту открывать самому себя?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11 (изменено: yellow, 2023-01-28 20:32:44)

Re: AHK: SkriptKiller

teadrinker пишет:

до завершения сессии.

Я об этом и говорю - в него уже заложен алгоритм прекращения, и он в прекращающейся природе создателя.

teadrinker пишет:

Зачем скрипту открывать самому себя?

Это я у него тоже спросил.

12

Re: AHK: SkriptKiller

yellow пишет:

Это я у него тоже спросил

У кого, у него-то? У скрипта?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: SkriptKiller

yellow Вы специально игнорите правила? Странно что teadrinker ни разу не заметил это.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

14

Re: AHK: SkriptKiller

;[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
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

15

Re: AHK: SkriptKiller

__Михаил__
Проще перечислить окна, узнать их процессы и закрыть их. WMI лучше избегать, оно довольно накладно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16 (изменено: yellow, 2023-01-28 20:33:18)

Re: AHK: SkriptKiller

teadrinker пишет:

У кого, у него-то? У скрипта?

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

17

Re: AHK: SkriptKiller

yellow
Старайтесь не использовать вложенные цитаты, это запрещено правилами. Я отредактировал ваш пост.
Скрипт-то ваш или чужой?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

18 (изменено: yellow, 2023-01-28 20:45:36)

Re: AHK: SkriptKiller

__Михаил__ пишет:
+ открыть спойлер
;[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
teadrinker пишет:

WMI лучше избегать, оно довольно накладно.

Ну да, он как-то не сразу закрывает. Там какой-то промежуток есть.

teadrinker пишет:

Старайтесь не использовать вложенные цитаты, это запрещено правилами

А, цитата в цитате...

teadrinker пишет:

Скрипт-то ваш

Да он мне уже как свой...

+ открыть спойлер

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
  }
}

Ну вот здесь же перечисляется, но как-то он не очень помогает.

В любом случае это хоть что-то. А я думал не существует скрипта, способного закрыть остальные, не закрывая вперёд себя.

19

Re: AHK: SkriptKiller

Скрипт, который я предлагал, можно скомпилировать и тогда он не должен закрываться.


F1::
DetectHiddenWindows On
WinClose ahk_class AutoHotkey
return

20

Re: AHK: SkriptKiller

yellow От админа запустить, затем выполнить функцию 'AHKPanic(1)'. В чём проблема?

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

21 (изменено: yellow, 2023-01-28 21:20:31)

Re: AHK: SkriptKiller

Taveron пишет:

Скрипт, который я предлагал, можно скомпилировать и тогда он

__Михаил__ пишет:

От админа запустить, затем выполнить функцию 'AHKPanic(1)

Сколько сразу новых способов появилось)
Ну он должен быть уже запущен, чтобы нажав горячую клавишу выполнился сценарий. На момент когда запустятся 20 экземпляров уже невозможно будет открыть что-то еще.

Так стоп. А скомпилированный скрипт будет уже иметь другой подзаголовок? Там не отображается просто.
Тогда и для скомпилированных закрывать тоже надо, т.к. теоретически они могут быть скомпилированные.

22

Re: AHK: SkriptKiller

yellow Что мешает добавить запрет на запуск повторов скрипта?

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

23

Re: AHK: SkriptKiller

yellow пишет:

#SingleInstance force перестаёт работать и скрипт открывает сам себя 1000 раз.

Покажите код этого скрипта.

24 (изменено: yellow, 2023-01-28 23:09:28)

Re: AHK: SkriptKiller

__Михаил__ пишет:

yellow Что мешает добавить запрет на запуск повторов скрипта?

он есть

Taveron пишет:

Покажите код этого скрипта.

Он сильно объёмный чтобы в нём копались еще несколько человек. мне самоу интересно почему недостаточно одной дерективы в начале скрипта чтобы предотвратить повторный многократный запуск.

#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

Впринципе вот такой скрипт их закрывает, вопрос только что медленно. Если бы можно было его как-то ускорить?
И + добавить закрытие скомпилированных скриптов.

25

Re: AHK: SkriptKiller

Я же вроде сказал, какой алгоритм должен быть. Никому не судьба реализовать?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

26 (изменено: yellow, 2023-01-28 23:35:03)

Re: AHK: SkriptKiller

teadrinker пишет:

Я же вроде сказал, какой алгоритм

Я ничего не понял из сказанного. Где там слово WMI?

И вот это

WinGet, IDList ,List, ahk_class AutoHotkey
Loop %IDList%

Разве не перебор всех открытых процессов?

Окей:
-Перечисляем окна
-Узнаём их процесс
-Закрываем их

27

Re: AHK: SkriptKiller

yellow пишет:

Где там слово WMI?

А зачем вам это слово?

yellow пишет:

Разве не перебор всех открытых процессов?

Нет, это список окон. Окно и процесс — разные вещи. Но если вы перечислите все AHK окна, вы сможете узнать и ID их процессов.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

28 (изменено: yellow, 2023-01-28 23:43:03)

Re: AHK: SkriptKiller

teadrinker пишет:

Но если вы перечислите все 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%
}

29

Re: AHK: SkriptKiller

По классу окна.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

30

Re: AHK: SkriptKiller

yellow, вы лучше бы лечили причину недуга, а не симптомы. А причина у вас скорее всего в скрипте.

31

Re: AHK: SkriptKiller

Taveron пишет:

yellow, вы лучше бы лечили причину недуга, а не симптомы. А причина у вас скорее всего в скрипте.

Ясен пень, но уже слишком много написано чтобы что-то менять всё равно баги так или иначе и в самом ахк есть даже если они на первый взгляд не видны.

32

Re: AHK: SkriptKiller

yellow, если скрипт дублирует сам себя, то это не баги AHK, а ошибка в коде этого скрипта. Тестируйте код кусками в чистом файле ahk.

33

Re: AHK: SkriptKiller

yellow, не нужно цитировать предыдущий пост.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

34

Re: AHK: SkriptKiller

Вот пример неправильного кода:


#SingleInstance, Force

F1::
loop 10
	Reload
return

Скрипт начинает дублировать себя, даже при наличии директивы #SingleInstance, Force.

35 (изменено: yellow, 2023-01-29 00:22:58)

Re: AHK: SkriptKiller

Я по привычке в чате где большой поток сообщений не успеваешь написать сразу после нужного поста и выходит несуразица.
Вот видите что получилось - пока писал - между моим постом кто-то оставил ответ, и текст получился глупым.

36 (изменено: yellow, 2023-01-29 00:26:02)

Re: AHK: SkriptKiller

Taveron пишет:

Вот пример неправильного кода:


#SingleInstance, Force

F1::
loop 10
	Reload
return

Скрипт начинает дублировать себя, даже при наличии директивы #SingleInstance, Force.

Да, там есть релоад. А что он как ведёт себя? Что нужно добавиь к релоад чтобы учитывало эту директиву? Вроде бы просто должен перезагружаться и всё. Но при "некоторых обстоятельствах" открывается несколько копий.

Там стоит ~Capslock::Reload и всё, он уже больше ничем не закрывается.

37

Re: AHK: SkriptKiller

Если выполнять 'Reload' неправильно, то будет запуск несколько копий. Как минимум ожидание отпуска клавиши добавить нужно. Это самое простое что придёт в голову любому при подобной проблеме. В теле скрипта обязательно задержку использовать после шапки автозапуска. Так может помочь при резком запуске скрипта от повторов.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

38 (изменено: Taveron, 2023-01-29 00:51:29)

Re: AHK: SkriptKiller

Попробуйте сделать так:


~CapsLock up::Reload

Здесь Reload будет срабатывать при отпускании CapsLock.
В вашем же варианте, Reload срабатывает постоянно с маленькой задержкой, когда удерживается CapsLock, и директива не успевает срабатывать.

39 (изменено: yellow, 2023-02-01 11:45:55)

Re: AHK: SkriptKiller

__Михаил__ пишет:

В теле скрипта обязательно задержку использовать после шапки автозапуска

В каком именно месте? Что такое шапка автозапуска?

Taveron пишет:

~CapsLock up::Reload

Не особо помогает. Всё также может открыть ни с того не с сего 50 копий.
Может задержку добавить? пару мс...

~Capslock up::
	Sleep 1
 	Reload
*End::
 	ExitApp
return

40

Re: AHK: SkriptKiller

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