; 多进程热键——快速响应随时中止 v2.1  By FeiYue
;
; 1、一般的多进程热键,每次按热键都会重新启动一个进程
;    这会造成热键响应延迟,和频繁启动、退出进程。
;    这个库利用线程叠加和双进程交替重启的设计解决了上述问题
;
; 2、Go.Go("标签名或函数名", 序号可省略)  启动子进程
;    Go.Go("清理标签或为空", 序号可省略)  停止子进程

Class Go {  ;// 类开始

init() {
  static h:=Go.init()
  #NoEnv
  #NoTrayIcon
  #SingleInstance force
  #MaxThreads 255
  if (A_Args.Length()>0)
  {
    Suspend, On
    flag:="Ahk_Sub"
    s:=RegExReplace(A_Args[1], "\s")
    this.WinKill(flag "[" s "]")
    r:=this.Menu_Go.Bind(this)
    Menu, MyMenu, Add, Run, % r
    Gui, %flag%: Add, Text, 0x80 -Wrap
    Gui, %flag%: Menu, MyMenu
    Gui, %flag%: Show, Hide, % flag "[" s "]"
    return
    Ahk_SubGuiClose:
    Critical
    WinMenuSelectItem,,, 1&
    return
  }
  else
  {
    flag:="Ahk_Main"
    this.WinKill(flag)
    Gui, %flag%: Show, Hide, % flag
    OnExit(this.WinKill.Bind(this,"Ahk_Sub"))
    Menu, Tray, Icon
  }
}

Menu_Go() {
  ControlGetText, s
  s:=Trim(s)
  if (s="Reload")
  {
    WinGetTitle, s
    this.RunAhk(RegExReplace(s,"Ahk_Sub\[|]"))
    ExitApp
  }
  if IsLabel(s)
    Gosub, %s%
  else if IsFunc(s)
    %s%()
  Loop
    Sleep, 60000
}

WinKill(flag) {
  DetectHiddenWindows, On
  WinGet, list, List, % flag " ahk_class AutoHotkeyGUI"
  Loop % list
    IfWinExist, % "ahk_id " list%A_Index%
    {
      WinGet, pid, PID
      WinClose, ahk_class AutoHotkey ahk_pid %pid%,, 3
      IfWinExist,,, Process, Close, %pid%
    }
  DetectHiddenWindows, Off
}

RunAhk(s="") {
  if (A_IsCompiled)
    Run, "%A_ScriptFullPath%" /f %s%
  else
    Run, "%A_AhkPath%" /f "%A_ScriptFullPath%" %s%
}

; 一个进程叠加超过100个线程就切换另一个进程,原进程重启
Go(LabelOrFuncName="", index=0) {
  static arr:=[]
  DetectHiddenWindows, On
  SetFormat, IntegerFast, d
  index:=Floor(index), (!arr[index] && arr[index]:=[0,0])
  , ii:=Floor(arr[index][1]), jj:=Floor(arr[index][2])
  , tt:="Ahk_Sub[" index "_" jj "]"
  if (++ii>100)
  {
    IfWinExist, % tt
    {
      ControlSetText,, Reload
      WinClose
    }
    else
      this.RunAhk(index "_" jj)
    arr[index][2]:=jj:=!jj, ii:=1
    , tt:="Ahk_Sub[" index "_" jj "]"
  }
  arr[index][1]:=ii
  IfWinNotExist, % tt
  {
    this.RunAhk(index "_" jj)
    WinWait, % tt,, 3
  }
  IfWinExist, % tt
  {
    ControlSetText,, % LabelOrFuncName
    WinClose
  }
  DetectHiddenWindows, Off
}

}  ;// 类结束



;======== 下面是使用的例子 =========



;-- 按住松开型循环

$F1::
Go.Go("aaa")
KeyWait, F1
Go.Go()
return

aaa:
i:=1
Loop
  ToolTip, % "按住松开型循环-" i++
return


;-- 两次开关型循环

F2:: (ok:=!ok) ? Go.Go("bbb") : Go.Go("ccc")

bbb:
k:=1
Loop
  ToolTip, % "两次开关型循环-" k++
return

ccc:
ToolTip
return

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。