为什么我要写这么一个脚本?因为我有几十个签证和变更需要分别设置“安装费用”,我发现,一个个的点速度太慢了,于是脑袋一热,想着我为什么不写个脚本模拟按键来解决这重复的操作呢。
于是为了应付当前的工作,用VBScript写了一个简易的脚本,代码如下:

1 Dim WshShell 2 Set WshShell = CreateObject("WScript.Shell") 3 4 Do 5 WScript.Sleep 200 6 Loop Until WshShell.AppActivate("统一设置安装费用") 7 8 For k = 1 to 8 9 If K <> 4 Then 10 '发送Enter键用于选择当前列表 11 WshShell.SendKeys "{Enter}" 12 WScript.Sleep 200 13 14 '发送Alt+Down键用于打开下拉列表 15 WshShell.SendKeys "%{Down}" 16 WScript.Sleep 200 17 18 '发送UP键10次,用于定位到第一个选项[无] 19 WshShell.SendKeys "{UP 10}" 20 WScript.Sleep 100 21 22 '当前楼层数为33,根据列表中的选项,排在第9位 23 WshShell.SendKeys "{Down 9}" 24 WScript.Sleep 100 25 26 '发送Enter键确认当前选项 27 WshShell.SendKeys "{Enter}" 28 End If 29 30 '继续下一个专业 31 WshShell.SendKeys "{Down}" 32 Next
于是乎,我从重复的选择中解脱,也帮我提升了效率,下面请看对比
自己鼠标点选
用脚本辅助选择
是不是有不一样的感觉。不过VBS脚本虽然方便,却也有一些缺点,比如,如果我打开“统一设置安装费用”的窗口,但是我并没有点击“高层建筑增加费”怎么办,或者某程序弹出消息,使得焦点不在当前窗口怎么办……
于是,我选择操起 AutoIt3 这家伙,我既可以方便的模拟鼠标点击,又可以方便的激活窗口。比起VBS,不说功能强大,至少方便些,不用我自己去造某些轮子(^_^)
用AutoIT重写脚本如下:

1 #cs ---------------------------------------------------------------------------- 2 3 AutoIt Version: 3.3.14.5 4 Author: lnissi 5 6 Script Function: 7 Template AutoIt script. 8 9 #ce ---------------------------------------------------------------------------- 10 11 ; Script Start - Add your code below here 12 13 #include <MsgBoxConstants.au3> 14 15 Local $str_Title = "统一设置安装费用" 16 Local $Floor_Count = 61 ;此处设置实际工程楼层数 17 18 ;列表中最大为60,即使点击更多,还是60 19 If $Floor_Count > 60 Then $Floor_Count = 60 20 21 If WinExists($str_Title) = 0 Then 22 MsgBox($MB_OK + $MB_ICONWARNING, "温馨提示", "未找到【" & $str_Title & "】窗口") 23 Exit 24 EndIf 25 26 ;激活窗口 27 WinActivate($str_Title) 28 WinSetState($str_Title, "", @SW_MAXIMIZE) 29 30 ;点击高层建筑增加费 31 ControlClick($str_Title, "", "[CLASS:TGSPDBGrid; INSTANCE:2]", "left", 1, 150, 50) 32 ;点击规则说明 33 ControlClick($str_Title, "", "[CLASS:TGSPDBGrid; INSTANCE:1]", "left", 1, 330, 52) 34 35 #cs 36 ;序号1,电气设备安装工程 从9层开始,递增3层,到60层;更多... 37 ;序号2,消防工程 从9层开始,递增3层,到60层,更多... 38 ;序号3,给排水、采暖、燃气工程 从9层开始,递增3层,到60层;更多... 39 ;序号4,通风空调工程 从36层开始,递增3层,到60层;从9层开始,递增3层,到33层;更多... 40 ;序号5,通信设备及线路工程 从9层开始,递增3层,到60层;更多... 41 ;序号6,建筑智能化系统设备安装工程 从9层开始,递增3层,到60层;更多... 42 ;序号7,安装节能工程-1安装节能电气工程 从9层开始,递增3层,到60层;更多... 43 ;序号8,安装节能工程-2安装节能给排水采暖工程 从9层开始,递增3层,到60层;更多... 44 #ce 45 46 For $n = 1 to 8 Step 1 47 48 ;初始化 $Count_Down 用于选择与实际楼层相匹配的列表 49 Local $Count_Down = 1 50 51 Switch $n 52 Case 1 to 3, 5 to 8 ;除通风空调以外 53 #Region "计算需要 {DOWN} 多少次" 54 ;根据 $Floor_Count 中设置的楼层数,进行循环匹配 55 ;匹配成功就跳出循环,匹配不成功则 $Count_Down 累加 56 For $Floor_Num = 9 to 60 Step 3 57 If $Floor_Count <= $Floor_Num Then 58 ExitLoop 59 Else 60 $Count_Down += 1 61 EndIf 62 Next 63 #EndRegion 64 Case 4 ;通风空调工程 65 #Region "计算需要 {DOWN} 多少次" 66 ;第一次循环,条件满足,则跳出循环。否则累加 $Count_Down 67 For $Floor_Num = 36 to 60 Step 3 68 If $Floor_Count <= $Floor_Num And $Floor_Count > 33 Then 69 ExitLoop 70 Else 71 $Count_Down += 1 72 EndIf 73 Next 74 ;第二次循环,如果条件满足,继续累加 $Count_Down 75 If $Floor_Num <= 33 Then 76 For $Floor_Num = 9 to 33 Step 3 77 If $Floor_Count <= $Floor_Num Then 78 ExitLoop 79 Else 80 $Count_Down += 1 81 EndIf 82 Next 83 EndIf 84 #EndRegion 85 EndSwitch 86 87 WinWaitActive($str_Title) ;为避免列表选择时的窗口无法获得焦点,需激活窗口 88 ControlSend($str_Title, "", "[CLASS:TGSPDBGrid; INSTANCE:1]", "{F2}") 89 Send("!{DOWN}") ;发送 ALT + DOWN ,使列表出现 90 Send("{UP 20}") ;发送 UP 键 20 次,使当前选择的列表置顶[无] 91 ;根据计算得出的列表位置,选择与楼层数对应的列表 92 For $i = 1 to $Count_Down Step 1 93 Send("{DOWN}") 94 Next 95 Send("{ENTER}") 96 Send("{DOWN}") ;选择下一个工程类别 97 Next