1

Тема: AHK: Самозакрытие при повторном запуске

В справке имеется такой пример.

#Persistent
#SingleInstance, Force
;DetectHiddenWindows, On

OnExit, ExitSub
Return

ExitSub:
If A_ExitReason not in Logoff,Shutdown
ExitApp
;Process, Close, DllCall("GetCurrentProcessId")
;WinKill, ahk_pid DllCall("GetCurrentProcessId")
;WinClose, ahk_pid DllCall("GetCurrentProcessId")

---------------------------
CloseSelf.ahk
---------------------------
Could not close the previous instance of this script.  Keep waiting?
---------------------------
Да   Нет   
---------------------------

Как же проще заставить (в т.ч. по Reload или Single) самозакрываться?

2

Re: AHK: Самозакрытие при повторном запуске

Надо убить процесс копии этого скрипта, он появляется перед завершением работы текущего экземпляра.

По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.24.05 (Unicode 32-bit).

3

Re: AHK: Самозакрытие при повторном запуске

Да, замечал. Но кроме WMI и поиска по комстроке в голову ничего не приходит. Есть получше предложение?

4

Re: AHK: Самозакрытие при повторном запуске

http://forum.script-coding.com/viewtopi … 400#p85400

5

Re: AHK: Самозакрытие при повторном запуске

#Persistent
#SingleInstance, Force
DetectHiddenWindows, On
CurPID := DllCall("GetCurrentProcessId")

OnExit, ExitSub
Return

ExitSub:
#If A_ExitReason not in Logoff,Shutdown
  WinGet, List, List, %A_ScriptFullPath% ahk_class AutoHotkey
  Loop % List { 
      WinGet, PID, PID, % "ahk_id" List%A_Index%
      If (PID != CurPID)
          Process, Close, %PID% 
  }
  ExitApp
#If

По нулям.

6

Re: AHK: Самозакрытие при повторном запуске

При повторном запуске предыдущий экземпляр убивается.
Разве это не то, что вы хотели?

#SingleInstance Off  
DetectHiddenWindows, On
CurPID := DllCall("GetCurrentProcessId")
WinGet, List, List, %A_ScriptFullPath% ahk_class AutoHotkey
Loop % List
{ 
    WinGet, PID, PID, % "ahk_id" List%A_Index%
    If (PID != CurPID)
        Process, Close, %PID% 
}
msgbox

7 (изменено: Flasher, 2017-01-06 05:42:26)

Re: AHK: Самозакрытие при повторном запуске

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

#SingleInstance, Off не даст отследить состояние, при котором эта часть должна выполняться.

8 (изменено: teadrinker, 2017-01-06 17:39:36)

Re: AHK: Самозакрытие при повторном запуске

Так:

#Persistent
#SingleInstance, Off
if CloseCopy() || RegExMatch(StrGet(DllCall("GetCommandLine", Ptr)), "i)\s/(restart|r|force|f)\s")
   ExitApp

CloseCopy()  {
   DHW_Prev := A_DetectHiddenWindows
   DetectHiddenWindows, On
   WinGet, List, List, % A_ScriptFullPath " ahk_class AutoHotkey"
   Loop % List
      if WinExist("ahk_id" List%A_Index%) != A_ScriptHwnd && res := true
         WinClose
   DetectHiddenWindows, % DHW_Prev
   Return res
}

или так:

#SingleInstance, Off
if CloseCopy() || RegExMatch(StrGet(DllCall("GetCommandLine", Ptr)), "i)\s/(restart|r|force|f)\s")
   ExitApp

OnMessage(0x111, "WM_COMMAND")

CloseCopy()  {
   DHW_Prev := A_DetectHiddenWindows
   DetectHiddenWindows, On
   WinGet, List, List, % A_ScriptFullPath " ahk_class AutoHotkey"
   Loop % List
      if WinExist("ahk_id" List%A_Index%) != A_ScriptHwnd && res := true
         WinClose
   DetectHiddenWindows, % DHW_Prev
   Return res
}

WM_COMMAND(wp)  {
   if (wp = 65303)  ; reload
      ExitApp
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

9

Re: AHK: Самозакрытие при повторном запуске

Закрывает до кучи и блокнот со скриптом. Надо обработку ехе.

По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.24.05 (Unicode 32-bit).

10

Re: AHK: Самозакрытие при повторном запуске


#SingleInstance Off  
DetectHiddenWindows, On
OnExit, ExitSub

If Instr(StrGet(DllCall("GetCommandLine", Ptr)), "/restart")
{
	MsgBox, , , ExitApp Reload, 0.5
	ExitApp
}
WinGet, List, List, %A_ScriptFullPath% ahk_class AutoHotkey
Loop % List
{ 
	If (List%A_Index% = A_ScriptHwnd) 
		Continue
    WinGet, PID, PID, % "ahk_id" List%A_Index% + !(res := 1)
	Process, Close, %PID%  
}
If res
{
	MsgBox, , , Instance, 0.5
	ExitApp
}
MsgBox Reload?
Reload
Return

ExitSub:
	ExitApp
По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.24.05 (Unicode 32-bit).

11

Re: AHK: Самозакрытие при повторном запуске

serzh82saratov пишет:

Надо обработку ехе

Достаточно изменить

WinGet, List, List, % A_ScriptFullPath

на

WinGet, List, List, % A_ScriptFullPath "ahk_class AutoHotkey"

Отредактировал. А твой вариант чем отличается, не пойму?
OnExit там лишний, возможные ключи не перечислены, PID напрасно вычисляется.

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

12

Re: AHK: Самозакрытие при повторном запуске

Это была первая мысль, но в торопях незакавычил ahk_class.
Проверка ключей всё равно не верная, можно конечно для исходника добавить ехе - ключ - путь, у скомпилированного пробела в конце может не быть.
Но например ключ Reload мы же проверяем для запуска из вне, его именно так и запустят, мы же не страхуемся в своём коде от своей же Reload. Потому в ключах можно предположить всё что угодно.
С OnExit твой не работает.
PID для Process Close, думаю надежнее.

По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.24.05 (Unicode 32-bit).

13

Re: AHK: Самозакрытие при повторном запуске

serzh82saratov пишет:

Проверка ключей всё равно не верная

Не совсем понял, почему?

serzh82saratov пишет:

у скомпилированного пробела в конце может не быть.

Ну, у нас изначально об этом речи не было, а так можно добавить проверку на конец строки, в чём проблема.

serzh82saratov пишет:

С OnExit твой не работает.

Вроде работает:

#Persistent
#SingleInstance, Off
OnExit, Exit
if CloseCopy() || RegExMatch(StrGet(DllCall("GetCommandLine", Ptr)), "i)\s/(restart|r|force|f)\s")
   ExitApp
Return

Exit:
	ExitApp

CloseCopy()  {
   DHW_Prev := A_DetectHiddenWindows
   DetectHiddenWindows, On
   WinGet, List, List, % A_ScriptFullPath " ahk_class AutoHotkey"
   Loop % List
      if WinExist("ahk_id" List%A_Index%) != A_ScriptHwnd && res := true
         WinClose
   DetectHiddenWindows, % DHW_Prev
   Return res
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

14

Re: AHK: Самозакрытие при повторном запуске

OnExit работает, ошибся. Не работает если запустить с ключом /restart.

По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.24.05 (Unicode 32-bit).

15

Re: AHK: Самозакрытие при повторном запуске

teadrinker пишет:

Да работает же. Только что попробовал:

Run "%A_AhkPath%" "D:\AHK\Scripts\_Разработка\NewFile2.ahk" /restart

Закрываются оба.

Удалил, проверял ещё раз. Надо было

Run "%A_AhkPath%" /restart "D:\AHK\Scripts\_Разработка\NewFile2.ahk"

Всё работает.

serzh82saratov пишет:

А если первого при запуске нет?

В смысле?

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

16

Re: AHK: Самозакрытие при повторном запуске

С ком строки.

По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.24.05 (Unicode 32-bit).

17

Re: AHK: Самозакрытие при повторном запуске

Всё равно не понял. smile

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

18

Re: AHK: Самозакрытие при повторном запуске

Если скрипт не запущен, и выполнить в cmd

%AutoHotkeyPath% /restart %ScriptPath%

то ничего не запускается.

По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.24.05 (Unicode 32-bit).

19

Re: AHK: Самозакрытие при повторном запуске

Ну и не должно.

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

20

Re: AHK: Самозакрытие при повторном запуске

Так сабж - закрытие при повторном запуске.
А тут мы запуск не повторяем, запущенного скрипта ведь нет.

По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.24.05 (Unicode 32-bit).

21

Re: AHK: Самозакрытие при повторном запуске

Ну да. А кто заставляет /restart писать, если скрипт не запущен? Не понял твою мысль.

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

22

Re: AHK: Самозакрытие при повторном запуске

Так не сработает:

#Persistent
#SingleInstance, Off
OnExit, Exit
if CloseCopy() || RegExMatch(StrGet(DllCall("GetCommandLine", Ptr)), "i)\s/(restart|r|force|f)\s")
   ExitApp
Runwait, C:\Windows\System32\fsutil.exe file createnew D:\test.txt 10000000000
FileCopy D:\test.txt, D:\test1.txt, 1
Return

Exit:
	ExitApp

CloseCopy()  {
   DHW_Prev := A_DetectHiddenWindows
   DetectHiddenWindows, On
   WinGet, List, List, % A_ScriptFullPath " ahk_class AutoHotkey"
   Loop % List
      if WinExist("ahk_id" List%A_Index%) != A_ScriptHwnd && res := true
         WinClose
   DetectHiddenWindows, % DHW_Prev
   Return res
}

23

Re: AHK: Самозакрытие при повторном запуске

А откуда вообще тогда ключ /restart может появится?

По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.24.05 (Unicode 32-bit).

24

Re: AHK: Самозакрытие при повторном запуске

serzh82saratov пишет:

PID для Process Close, думаю надежнее.

По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.24.05 (Unicode 32-bit).

25

Re: AHK: Самозакрытие при повторном запуске

serzh82saratov пишет:

Но например ключ Reload мы же проверяем для запуска из вне, его именно так и запустят, мы же не страхуемся в своём коде от своей же Reload. Потому в ключах можно предположить всё что угодно.

По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.24.05 (Unicode 32-bit).