1 (изменено: D@rkSIDeR008, 2015-11-19 06:30:37)

Тема: AHK: Скрипт который перезапускает процесс который был завершен

Пытаюсь создать скрипт который перезапускает процесс который был завершен, например: "я выхожу со Skype а он сразу открывается опять "

loop 9999999999999999999999999999999999
Process, WaitClose, Skupe.exe *32, 5
Run, C:\Program Files (x86)\Skype\Skupe.exe
return

2

Re: AHK: Скрипт который перезапускает процесс который был завершен

D@rkSIDeR008, ознакомьтесь с этой темой, отредактируйте свой пост.

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

3

Re: AHK: Скрипт который перезапускает процесс который был завершен

Patch := "C:\Program Files (x86)\Skype\Skype.exe"
loop {
Process, WaitClose, skype.exe
Run, % Patch
Process, Wait, skype.exe
}
return

Для Loop не обязательно узывать количество повторов.
Цикл у вас повторяет только, Process, WaitClose, и до запуска никогда не дойдёт.

4

Re: AHK: Скрипт который перезапускает процесс который был завершен

Спасибо, большое.

5 (изменено: D@rkSIDeR008, 2015-11-19 16:12:24)

Re: AHK: Скрипт который перезапускает процесс который был завершен

А есть ли такая возможность чтобы проверять в одном скрипте сразу 2 процесса. Например:
Вот этот код запускает скайп если он закрыт.

Patch := "C:\Program Files (x86)\Skype\Skype.exe"
loop {
Process, WaitClose, skype.exe
Run, % Patch
Process, Wait, skype.exe
}
return

А можно ли сделать так чтобы 1 скрипт запускал и скайп (когда его закрывают) и стим (когда его закрывают).

6

Re: AHK: Скрипт который перезапускает процесс который был завершен

D@rkSIDeR008, у нас принято использовать точки в конце предложений.

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

7

Re: AHK: Скрипт который перезапускает процесс который был завершен

Patches := ["C:\Program Files (x86)\Skype\Phone\Skype.exe","C:\Program Files\Steam\Steam.exe"]
    
Loop 
{
	For k, v in Patches
	{
		Name := SubStr(v, InStr(v, "\", 0, 0) + 1)
		Process, Exist, % Name
		If ErrorLevel
			Continue
		Try Run, % v
		Process, Wait, % Name, 3
	}
	Sleep 100
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8 (изменено: D@rkSIDeR008, 2015-11-19 17:20:36)

Re: AHK: Скрипт который перезапускает процесс который был завершен

Patches := ["C:\Program Files (x86)\Skype\Phone\Skype.exe","C:\Program Files\Steam\Steam.exe"]
    
Loop 
{
	For k, v in Patches
	{
		Name := SubStr(v, InStr(v, "\", 0, 0) + 1)
		Process, Exist, % Name
		If ErrorLevel
			Continue
		Try Run, % v
		Process, Wait, % Name, 3
	}
	Sleep 100
}

Почему то, ваш скрипт выдает ошибку:

Error at line 1.

The following variable name constains an illegal character:
"["C"

The program will exit.

9

Re: AHK: Скрипт который перезапускает процесс который был завершен

а, если Skype не завершается, а просто сворачивается в трей, как его открыть на весь экран?

10 (изменено: Nikva, 2016-01-12 21:02:23)

Re: AHK: Скрипт который перезапускает процесс который был завершен

Если нужно постоянное слежение за наличием окна:

SetTitleMatchMode, 2 ; ищет по части названия.
loop {
DetectHiddenWindows, Off ; отключает поиск скрытых окон.
WinWaitClose, Skype ; ждет пока не закроется окно скайпа.
DetectHiddenWindows, On ; включает поиск скрытых окон.
WinShow, Skype ; показывает  окно скайпа.
WinRestore, Skype ; восстанавливает размер свёрнутого окна
}
return

А если по горячей клавише:

F1::
SetTitleMatchMode, 2
DetectHiddenWindows, On
WinShow, Skype
WinRestore, Skype
Return

11

Re: AHK: Скрипт который перезапускает процесс который был завершен

Nikva
Зря WinRestore убрали. Его правильно бы прямиком под WinShow прописать.

12 (изменено: Nikva, 2016-01-12 21:21:43)

Re: AHK: Скрипт который перезапускает процесс который был завершен

Flasher
Вернул WinRestore.

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

SetTitleMatchMode, 2 ; ищет по части названия.
loop {
DetectHiddenWindows, Off ; отключает поиск скрытых окон.
WinWaitClose, Skype ; ждет пока не закроется окно скайпа.
DetectHiddenWindows, On ; включает поиск скрытых окон.
PostMessage2TrayIconProcName("skype.exe", WM_LBUTTONDBLCLK := 0x203) ; дважды кликает по иконке в трее
}
Return

; http://forum.script-coding.com/viewtopic.php?id=10144#pc88239
PostMessage2TrayIconProcName(ProcessName, messages*)
{
/*
Структура TRAYDATA
typedef TRAYDATA
{
IntPtr hwnd;
uint uID;
uint uCallbackMessage;
uint Reserved;
uint Reserved2;
IntPtr hIcon;
}
*/
   static WM_USER := 0x400, TB_BUTTONCOUNT := WM_USER + 24, TB_GETBUTTON := WM_USER + 23
      , PtrSize := A_Is64bitOS ? 8 : 4, SizeOfTBBUTTON := 8 + PtrSize*3, SizeOfTRAYDATA := 16 + PtrSize*2
   oWMI := ComObjGet("winmgmts:")
   DHW_Prev := A_DetectHiddenWindows
   DetectHiddenWindows, On
   
   Loop 2
   {
      ControlGet, hWnd, hwnd,, ToolbarWindow321, % "ahk_class " . (A_Index = 1 ? "Shell_TrayWnd" : "NotifyIconOverflowWindow")
      WinExist("ahk_id" hWnd)
      WinGet, PID, PID

      if (A_Index = 1 && !IsObject(RemoteBuff := New RemoteBuffer(PID, SizeOfTRAYDATA))) {
         DetectHiddenWindows, %DHW_Prev%
         Return, 0, DllCall("MessageBox", Ptr, 0, Str, "Не удалось создать удалённый буфер`nОшибка " A_LastError, Str, "", UInt, 0)
      }
      
      SendMessage, TB_BUTTONCOUNT
      Loop % ErrorLevel
      {
         SendMessage, TB_GETBUTTON, A_Index - 1, RemoteBuff.ptr
         if ! ( pTBBUTTON := RemoteBuff.Read(SizeOfTBBUTTON) )
            || !pTRAYDATA := RemoteBuff.Read(SizeOfTRAYDATA, NumGet(pTBBUTTON + 8 + PtrSize) - RemoteBuff.ptr) {
            DetectHiddenWindows, %DHW_Prev%
            Return
         }

         WinGet, PID, PID, % "ahk_id" hWnd := NumGet(pTRAYDATA+0)
         CurrentProcessName := oWMI.Get("Win32_Process.Handle=" PID).Name
         if (CurrentProcessName = "AutoHotkey.exe")
         {
            WinGetTitle, Title, % "ahk_id" hWnd
            CurrentProcessName := RegExReplace(Title, "i).*\\(.*) - autohotkey v[\.\d]+", "$1")
         }
         if (CurrentProcessName = ProcessName)
         {
            uID := NumGet(pTRAYDATA + PtrSize, "UInt")
            uCallbackMessage := NumGet(pTRAYDATA + PtrSize + 4, "UInt")

            for i, message in messages
               PostMessage, uCallbackMessage, uID, message,, % "ahk_id" hWnd
            DetectHiddenWindows, %DHW_Prev%
            Return
         }
      }
   }
   DetectHiddenWindows, %DHW_Prev%
   MsgBox, % "Иконка процесса " . ProcessName . " не найдена"
}

Class RemoteBuffer
{
   __New(PID, size)
   {
      static PROCESS_VM_OPERATION := 0x8, PROCESS_VM_WRITE := 0x20, PROCESS_VM_READ := 0x10
         , MEM_COMMIT := 0x1000, PAGE_READWRITE := 0x4
         
      if !(this.hProc := DllCall("OpenProcess", UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, Int, 0, UInt, PID, Ptr))
         Return
      
      if !(this.ptr := DllCall("VirtualAllocEx", UInt, this.hProc, UInt, 0, UInt, size, UInt, MEM_COMMIT, UInt, PAGE_READWRITE, Ptr))
         Return, "", DllCall("CloseHandle", Ptr, this.hProc)
   }
   
   __Delete()
   {
      DllCall("VirtualFreeEx", Ptr, this.hProc, Ptr, this.ptr, UInt, 0, UInt, MEM_RELEASE := 0x8000)
      DllCall("CloseHandle", Ptr, this.hProc)
   }
   
   Read(size, offset = 0)
   {
      static LocalBuff
      VarSetCapacity(LocalBuff, size, 0)
      if !DllCall("ReadProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, &LocalBuff, UInt, size, UInt, 0)
         Return, 0, DllCall("MessageBox", Ptr, 0, Str, "Не удалось прочитать данные`nОшибка " A_LastError, Str, "", UInt, 0)
      
      VarSetCapacity(LocalBuff, -1)
      Return &LocalBuff
   }
   
   Write(pLocalBuff, size, offset = 0)
   {
      res := DllCall("WriteProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, pLocalBuff, UInt, size, UInt, 0)
      Return res ? res : 0, (!res) ? DllCall("MessageBox", Ptr, 0, Str, "Не удалось записать данные`nОшибка " A_LastError, Str, "", UInt, 0)
   }
}

И по кнопке:

F1::
SetTitleMatchMode, 2
DetectHiddenWindows, On
PostMessage2TrayIconProcName("skype.exe", WM_LBUTTONDBLCLK := 0x203)
Return

; http://forum.script-coding.com/viewtopic.php?id=10144#pc88239
PostMessage2TrayIconProcName(ProcessName, messages*)
{
/*
Структура TRAYDATA
typedef TRAYDATA
{
IntPtr hwnd;
uint uID;
uint uCallbackMessage;
uint Reserved;
uint Reserved2;
IntPtr hIcon;
}
*/
   static WM_USER := 0x400, TB_BUTTONCOUNT := WM_USER + 24, TB_GETBUTTON := WM_USER + 23
      , PtrSize := A_Is64bitOS ? 8 : 4, SizeOfTBBUTTON := 8 + PtrSize*3, SizeOfTRAYDATA := 16 + PtrSize*2
   oWMI := ComObjGet("winmgmts:")
   DHW_Prev := A_DetectHiddenWindows
   DetectHiddenWindows, On
   
   Loop 2
   {
      ControlGet, hWnd, hwnd,, ToolbarWindow321, % "ahk_class " . (A_Index = 1 ? "Shell_TrayWnd" : "NotifyIconOverflowWindow")
      WinExist("ahk_id" hWnd)
      WinGet, PID, PID

      if (A_Index = 1 && !IsObject(RemoteBuff := New RemoteBuffer(PID, SizeOfTRAYDATA))) {
         DetectHiddenWindows, %DHW_Prev%
         Return, 0, DllCall("MessageBox", Ptr, 0, Str, "Не удалось создать удалённый буфер`nОшибка " A_LastError, Str, "", UInt, 0)
      }
      
      SendMessage, TB_BUTTONCOUNT
      Loop % ErrorLevel
      {
         SendMessage, TB_GETBUTTON, A_Index - 1, RemoteBuff.ptr
         if ! ( pTBBUTTON := RemoteBuff.Read(SizeOfTBBUTTON) )
            || !pTRAYDATA := RemoteBuff.Read(SizeOfTRAYDATA, NumGet(pTBBUTTON + 8 + PtrSize) - RemoteBuff.ptr) {
            DetectHiddenWindows, %DHW_Prev%
            Return
         }

         WinGet, PID, PID, % "ahk_id" hWnd := NumGet(pTRAYDATA+0)
         CurrentProcessName := oWMI.Get("Win32_Process.Handle=" PID).Name
         if (CurrentProcessName = "AutoHotkey.exe")
         {
            WinGetTitle, Title, % "ahk_id" hWnd
            CurrentProcessName := RegExReplace(Title, "i).*\\(.*) - autohotkey v[\.\d]+", "$1")
         }
         if (CurrentProcessName = ProcessName)
         {
            uID := NumGet(pTRAYDATA + PtrSize, "UInt")
            uCallbackMessage := NumGet(pTRAYDATA + PtrSize + 4, "UInt")

            for i, message in messages
               PostMessage, uCallbackMessage, uID, message,, % "ahk_id" hWnd
            DetectHiddenWindows, %DHW_Prev%
            Return
         }
      }
   }
   DetectHiddenWindows, %DHW_Prev%
   MsgBox, % "Иконка процесса " . ProcessName . " не найдена"
}

Class RemoteBuffer
{
   __New(PID, size)
   {
      static PROCESS_VM_OPERATION := 0x8, PROCESS_VM_WRITE := 0x20, PROCESS_VM_READ := 0x10
         , MEM_COMMIT := 0x1000, PAGE_READWRITE := 0x4
         
      if !(this.hProc := DllCall("OpenProcess", UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, Int, 0, UInt, PID, Ptr))
         Return
      
      if !(this.ptr := DllCall("VirtualAllocEx", UInt, this.hProc, UInt, 0, UInt, size, UInt, MEM_COMMIT, UInt, PAGE_READWRITE, Ptr))
         Return, "", DllCall("CloseHandle", Ptr, this.hProc)
   }
   
   __Delete()
   {
      DllCall("VirtualFreeEx", Ptr, this.hProc, Ptr, this.ptr, UInt, 0, UInt, MEM_RELEASE := 0x8000)
      DllCall("CloseHandle", Ptr, this.hProc)
   }
   
   Read(size, offset = 0)
   {
      static LocalBuff
      VarSetCapacity(LocalBuff, size, 0)
      if !DllCall("ReadProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, &LocalBuff, UInt, size, UInt, 0)
         Return, 0, DllCall("MessageBox", Ptr, 0, Str, "Не удалось прочитать данные`nОшибка " A_LastError, Str, "", UInt, 0)
      
      VarSetCapacity(LocalBuff, -1)
      Return &LocalBuff
   }
   
   Write(pLocalBuff, size, offset = 0)
   {
      res := DllCall("WriteProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, pLocalBuff, UInt, size, UInt, 0)
      Return res ? res : 0, (!res) ? DllCall("MessageBox", Ptr, 0, Str, "Не удалось записать данные`nОшибка " A_LastError, Str, "", UInt, 0)
   }
}

13

Re: AHK: Скрипт который перезапускает процесс который был завершен

завершаю Проводник:
F2::
Process, Close, explorer.exe
Все хорошо - все закрывается, а через секунду опять запускается

Как исправить, пожалуйста, подскажите!

14

Re: AHK: Скрипт который перезапускает процесс который был завершен

mbrost
Тут есть правило: "один вопрос - одна тема", но в данном случае лучше было воспользоваться поиском, тк ответ есть в коллекции.
AHK: Завершение процесса explorer.exe (без перезапуска Проводника)

15

Re: AHK: Скрипт который перезапускает процесс который был завершен

спасибо большое, простите!!!