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