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

评论(2)
哪位大佬能写一个 v2 版本的
v2可以用多线程来实现,v2的示例累积的比较少,很多东西需要自己去重写。https://github.com/thqby/AutoHotkey_H/releases