1

Тема: AHK: Реакция на закрытие окна taskmrg.exe

Добрый вечер.
Помогите решить проблему.

Как скриптом AHK автоматически заново запустить процесс taskmrg.exe (окно диспетчера задач), если этот диспетчер задач будет кем-то случайно закрыт или будет закрыт по таймеру другой программой.
То есть если процесс taskmrg.exe - исчезнет, то как его автоматически запустить вновь - скриптом AHK, сидящим в трее ?

2

Re: AHK: Реакция на закрытие окна taskmrg.exe

Можно проверять периодически командой WinExist() / IfWin[Not]Exist.

3

Re: AHK: Реакция на закрытие окна taskmrg.exe

А как это скриптом сделать ?

4

Re: AHK: Реакция на закрытие окна taskmrg.exe

Это такое условие, проверяющее существование окна. Окно можно идентифицировать разными способами. Почитайте в документации.

5

Re: AHK: Реакция на закрытие окна taskmrg.exe

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

#Persistent
PM := new ProcessMonitoring(, Func("OnTaskmgrClose"), "taskmgr.exe")

OnTaskmgrClose(name, PID, cmd) {
   Run, taskmgr.exe
}

class ProcessMonitoring
{
   __New(UserFuncOnCreate := "", UserFuncOnDelete := "", singleProcess := "") {
      command := "Within 1 Where TargetInstance ISA 'Win32_Process'"
               . (singleProcess ? " And TargetInstance.Name = '" . singleProcess . "'" : "")
      this.WMI := ComObjGet("winmgmts:")
      if UserFuncOnCreate {
         this.createSink := ComObjCreate("WbemScripting.SWbemSink")
         ComObjConnect( this.createSink, new this.EventSink(UserFuncOnCreate) )
         this.WMI.ExecNotificationQueryAsync(this.createSink, "select * from __InstanceCreationEvent " . command)
      }
      if UserFuncOnDelete {
         this.deleteSink := ComObjCreate("WbemScripting.SWbemSink")
         ComObjConnect( this.deleteSink, new this.EventSink(UserFuncOnDelete) )
         this.WMI.ExecNotificationQueryAsync(this.deleteSink, "select * from __InstanceDeletionEvent " . command)
      }
   }
   
   class EventSink
   {
      __New(UserFunc) {
         this.UserFunc := UserFunc
      }
      
      OnObjectReady(params*) {
         Process := params[1].TargetInstance
         name := Process.Name
         PID := Process.ProcessID
         cmd := Process.CommandLine
         timer := this.UserFunc.Bind(name, PID, cmd)
         SetTimer, % timer, -10
      }
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Реакция на закрытие окна taskmrg.exe

teadrinker, ясно.
Спасибо.

7 (изменено: Malcev, 2020-01-16 07:03:31)

Re: AHK: Реакция на закрытие окна taskmrg.exe

Не проще ли?

WinWaitClose, ahk_exe taskmgr.exe
loop
   RunWait, taskmgr.exe

teadrinker, У меня на Win-10 твой код не работает.
Если при открытии сразу же окно закрывать, то первые 3-5 раз запускает заново, потом перестает.
Висит на

005: Run,taskmgr.exe
006: } (124.97)

8

Re: AHK: Реакция на закрытие окна taskmrg.exe

Да, лучше ждать закрытия окна, я просто хотел вспомнить мониторинг процессов. Если перестаёт, можно период проверки уменьшить здесь: Within 1, можно .5 поставить.

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

9

Re: AHK: Реакция на закрытие окна taskmrg.exe

С 0.5 работает.