;
; 最高级的AutoHotkey重试源代码结构20191221.docx
;
; 在编写AutoHotkey脚本时经常要用到重试,
; 单击控件无效时需要重新再单击,
; 发送模拟按键无效时需要重新发送。
; 经过我长期的测试研究,发现SetTimer计时器周期执行是最好的最高级的重试代码结构。
; SetTimer的优点1: 各个计时器并行同时执行互不影响,不像Loop循环、For循环或者WinWait那样只能同时做一件事,一件事没有做好时无法做其他事情,整个脚本会阻塞在循环中无法自拔,犹豫不前。
; SetTimer的优点2: 先写SetTimer声明创建部分,就像书本的总目录,再写对应的功能定义函数,就像书本的正文内容。代码条理清晰,方便今后阅读修改。实现函数化,模块化,区块化编程。
; SetTimer的优点3: 通过同时启动不同的计时器可以充分利用电脑的运行时间资源,满足什么条件就立即做什么事情,无需盲目等待。可以做到精确等待,不多等浪费时间,不少等错过操作时机(不会在窗口还没有完全显示出来就发送模拟按键等原因引起的无对象操作失败事故出现)。
; 如果有网友发现更好的重试代码结构可以通过腾讯QQ邮箱 595076941@QQ.com 联系告诉我,谢谢
; 示例 #1: 在Windows7专业版中运行记事本并显示打开对话框
#SingleInstance,force
#Persistent
SetTitleMatchMode,2
;
; 运行程序
SetTimer,RunExeFile,-100
; 激活窗口
SetTimer,SwitchToThisWindow,100
; 发送模拟键击到控件
SetTimer,ControlSendKeys,100
; 完成所有任务后删除计时器
SetTimer,AllMissionComplete,100
return
;
RunExeFile()
{
;~ IfExist,C:Windowsnotepad.exe
;~ {
IfWinNotExist,记事本 ahk_class Notepad ahk_exe notepad.exe
{
Run,notepad
}
;~ }
}
;
SwitchToThisWindow()
{
IfWinNotActive,记事本 ahk_class Notepad ahk_exe notepad.exe
{
;~ WinActivate [, WinTitle, WinText, ExcludeTitle, ExcludeText]
WinGet, WinID, ID,记事本
DllCall(“SwitchToThisWindow”, “UInt”, WinID, “UInt”, 1)
;~ WinGetActiveTitle,WinActiveTitlekp
;~ IfInString,WinActiveTitlekp,窗口标题
}
}
;
ControlSendKeys()
{
;~ IfWinActive,记事本
;~ {
IfWinNotExist,打开 ahk_class #32770, 地址
{
ControlSend,msctls_statusbar321,{CtrlDown}o{CtrlUp},记事本 ahk_class Notepad ahk_exe notepad.exe
}
;~ }
}
;
AllMissionComplete()
{
; 完成所有任务后删除计时器
IfWinActive,打开 ahk_class #32770, 地址
{
SetTimer,RunExeFile,Delete
SetTimer,SwitchToThisWindow,Delete
SetTimer,ControlSendKeys,Delete
SetTimer,AllMissionComplete,Delete
}
}
; ===== 脚本结束 =====
; 在编写AutoHotkey的重试源代码区块段落结构时应当注意以下几点:
; 注意点1:每个计时器任务应当是不可再分的最细小的任务。
; 注意点2:每个任务单独定义一个计时器,互相并行同时操作,互不影响。
; 注意点3:计时器时间间隔周期值(毫秒数)应当合适恰当,数值太大性能不好,数值太小资源占用太严重。
; 注意点4:在执行操作(例如:发送按键,单击控件)之前应根据情况预先判断是否满足操作条件
; (例如:文件是否存在,文件夹是否存在,磁盘是否存在,网络是否存在,
; 窗口是否已经创建完毕,控件是否已经创建完毕等等),
; 如果条件不满足则跳过执行,进入下一个计时器周期再重新判断操作条件。
; 注意点5:应当等到完成所有任务之后才删除所有计时器。
; 注意点6:应当充分注意一些互斥条件的操作前预先判断。
; 例如:主窗口和子窗口的激活,当子窗口已经激活时就不应当在激活主窗口了,
; 否则主窗口和子窗口要同时激活就会死循环出错,一般情况下,对话框总是属于子窗口。
; IfWinNotActive,子窗口
; {
; WinActivate,主窗口
; }
;
; 以下是本文的重复副本容灾备份网址:
; 重复副本容灾备份网址1:
; 重复副本容灾备份网址2:
http://autohotkey.bokee.com/507519527.html
; 重复副本容灾备份网址3:
https://www.cnblogs.com/delphixx/p/12102538.html