; 多进程热键——快速响应随时中止 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