稀土掘金 稀土掘金

全网最全AutoIt3基础教程及实战案例

一、简介

AutoIt 目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作。它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务,而这是其它语言不可能做到或无可靠方法实现的,比如,我们在使用selenium做自动化测试web应用时,就会遇到一个问题就是,当使用selenium自动化点击了网页中上传文件的按钮后,弹出一个选择文件的弹框,由于这个弹框是属于操作系统的而非浏览器,selenium程序就无法进行后续的操作了,这时侯就我们就可以使用AutoIt编写自动化脚本,来执行后续的自动选择文件的操作。

二、安装及使用

1. 安装

AutoIt官网: www.autoitscript.com/site/autoit…

AutoIt下载地址: www.autoitscript.com/site/autoit…

安装完成后打开AutoIt v3所在的文件夹

2. 查看API手册

在线中文文档: www.autoitx.com/Doc/

3. 提取窗口信息

打开AutoIt提供的窗口信息提取工具

将Finder Tool的定位光标拖拽到窗口中的某控件上,获取窗口及控件相关信息

4. 编写脚本

5. 运行脚本

双击.au3文件运行脚本

6. 导出exe文件

选择demo.au3文件,点击Convert按钮生成demo.exe文件

三、开发基础

1. 定义变量

  • 定义变量(必须以"$"符号开头,默认为全局变量)
;定义变量
$a, $b, $c
$a = 1
$b = 2
$c = $a + $b

;定义字符串
$name = "张三"

;定义布尔值
$bool1 = True
$bool2 = False

;定义数组
$arr[2] = ["react", "vue"]
$arr[] = ["text", True, 5]

;定义函数
Func getName()
    Local $name = "李四"
    Return $name
EndFunc
  • 局部变量(函数内定义的,函数外无法获取)
Local $name = "张三"
Local $arr[2] = ["react", "vue"]
  • 全局变量(函数内定义的,函数外可以获取)
Global $name = "张三"
Global $arr[2] = ["react", "vue"]
  • 常量(不可被重新赋值)
Const $pi = 3.1415926

2. 添加注释

;单行注释以";" 开头
Local $name = "张三"

#cs
多行注释:以 "#cs" 开头,以 "#ce" 结束,或者以 "#comments-start" 开头,以 "#comments-end" 结束。
#ce
Func fn()
    MsgBox(0, "标题", "文本内容")
EndFunc

3. 条件判断

  • If判断
If 2>1 And 3>2 Then
    ...
ElseIf 4>3 Or 5>4 Then
    ...
Else
    ...
EndIf
  • Switch判断
Local $name = "张三"
Switch $name
    Case "张三"
        ...
    Case "李四"
        ...
    Case Else
        ...
EndSwitch
  • Select判断
Local $i = 1
Select
    Case $i = 1
        ...
    Case $i = 2
        ...
    Case Else
        ...
EndSelect

4. 循环体

  • 简单For循环
Local $sum1 = 0
For $i=0 To 10
    $sum1 += $i
Next
  • Step 2表示每次循环结束后执行$i += 2, 如果是Step -2, 则每次循环结束后执行$i -= 2
Local $sum2 = 0
For $i=0 To 10 Step 2
    $sum1 += $i
Next
  • While循环
Local $i = 0
While True
    $i += 1
    If $i=4 Then
        ContinueLoop
    ElseIf $i > 10 Then
        ExitLoop
    EndIf
    Tooltip($i)
    Sleep(500)
WEnd
  • Do循环
Local $i = 0
Local $i = 0
Do
    Tooltip($i)
    Sleep(500)
    $i += 1
Until $i>3
  • 遍历数组
Local $arr[2] = [1, 2]
Local $sum3 = 0
For $i In $arr
    $sum3 += $i
Next

5. 操作字符串

;拼接字符串
Local $a = "Hello"
Local $b = "World"
Local $c = $a & $b

;返回字符串中从左开始指定数量的字符
StringLeft("123456", 3)

;返回字符串中从右开始指定数量的字符
StringRight("123456", 3)

#cs
截取字符串的部分字符
第一个参数为要操作的字符串
第二个参数为截取开始的第几个字符数
第三个参数为要截取的字符个数
#ce
Local $newStr = StringMid("123456", 3, 2)

;删除字符串中从左开始指定数量的字符
Local $newStr = StringTrimLeft("123456", 3)

;删除字符串中从右开始指定数量的字符
Local $newStr = StringTrimRight("123456", 3)

#cs
字符串替换
第一个参数为要操作的字符串
第二个参数为要替换的字符串
第三个参数为要替换成的目标字符串
第四个参数为替换的次数,默认为0,全部替换
第五个参数为标志,是否区分大小写,默认为0,不区分大小写,1则区分大小写,2也不区分大小写,使用基本/更快的比较方式
返回值为新字符串
#ce
Local $newStr = StringReplace("ab3ab3ab3", "ab", "12", 3)

#cs
根据给定的分隔符将字符串拆分为子字符串
第一个参数为要操作的字符串
第二个参数为用作分隔符的一个或多个字符
第三个参数略
返回值为数组
#ce
#include <StringConstants.au3>
Local $arr = StringSplit("1233,ab,3", ",", $STR_NOCOUNT)

;更多操作可以使用内置的String.au3模块
#include <String.au3>

6. 操作数组

;获取数组中的某个值
Local $arr[2] = [1, 2]
Local $sum = $arr[0] + $arr[2]

;返回数组的长度或map中键的数量
Local $arr[] = [1, 2, 3]
UBound($arr)

;初始化数组时有个很大的坑,虽然写的空数组,但是里面却默认有一个空字符串元素,所以要特别注意这点
#include <Array.au3>
Local $arr[] = []
MsgBox(0, "", UBound($arr))  ;会显示1

;更多操作可以使用内置的Array.au3模块
#include <Array.au3>

7. 常用函数

  • 暂停脚本执行
Sleep(2000)
  • 生成随机数
#cs
第一个参数为随机数的最小值
第二个参数为随机数的最大值
第三个参数如果设为1,则返回整数
#ce
Local $num = Random(1, 1000, 1)
  • 判断值类型
Local $i = 1

;是否是个数值
Local $isNumber = IsNumber($i)

;是否是个整数
Local $isInt = IsInt($i)

;是否是个字符串
Local $isString = IsString($i)

;是否是个布尔值
Local $isBool = IsBool($i)
  • 鼠标移动操作
#cs
第一个参数为鼠标移动到的x轴位置
第二个参数为鼠标移动到的y轴位置
第三个参数为鼠标移动的速度
#ce
MouseMove(500, 300, 20)
  • 鼠标点击操作
#cs
第一个参数的枚举值有"left""right", 表示模拟点击鼠标的左键或右键
第二个参数为鼠标点击的x轴位置
第三个参数为鼠标点击的y轴位置
第四个参数为鼠标点击的次数,默认为1
第五个参数为鼠标点击的速度
#ce
MouseClick("left", 500, 300, 2, 20)
  • 向指定控件发送鼠标点击命令
#cs
第一个参数为窗口标题
第二个参数为窗口文本
第三个参数为控件ID
第四个参数为点击鼠标的左键、右键或其他
第五个参数为鼠标点击的次数,默认为1
第六个参数为点击鼠标相对于控件的x轴的位置,默认为中间
第七个参数为点击鼠标相对于控件的y轴的位置,默认为中间
#ce
ControlClick("winTitle", "winContent", "Button1", "right", 2)
  • 暂停脚本的执行直至指定窗口存在(出现)为止
#cs
第一个参数为窗口标题
第二个参数为窗口文本
第三个参数为超时时间
#ce
WinWait ( "winTitle" , "winContent" , 2000)
  • 聚焦到指定活动窗口
#cs
第一个参数为窗口标题
第二个参数为窗口文本,选填
返回值为聚焦的窗口句柄,如果失败则返回0   
#ce
Local $window = WinActivate ( "winTitle", "winContent")
  • 设置输入焦点到指定窗口的指定控件上
#cs
第一个参数为窗口标题
第二个参数为窗口文本
第三个参数为控件ID
#ce
ControlFocus("winTitle", "winContent", "Edit1")
  • 向当前激活窗口发出模拟键盘操作
#cs
选中桌面上的Chrome图标(前提是脚本文件放到桌面执行)
第一个参数为按键名
第二个参数为标志,默认为0,特殊字符会生效,如果是1,则特殊字符不生效,作为普通字符
#ce
Local $result = Send("Google Chrome", 1)

;模拟按下Window+r键
Send("#r")

;模拟按下CTRL+c键
Send("^c")

;模拟按下ALT+SPACE键
Send("!{SPACE}")

;模拟按下ALT+SHIFT+aSend("!+a")

;模拟连续按下DOWN键3Send("{DOWN 3}")

;选中某个复选框
Send("{+}")

;取消选中某个复选框
Send("{-}")
  • 向指定窗口的指定控件发出模拟键盘操作
#cs
第一个参数为窗口标题
第二个参数为窗口内容
第三个参数为控件ID
第四个参数为模拟键盘输入的内容
第五个参数为标志,默认为0,特殊字符会生效,如果是1,则特殊字符不生效,作为普通字符
返回值为1表示成功,0表示失败
#ce
Local $result = ControlSend("winTitle", "winContent", "Edit1", "键盘输入的内容", 1)
  • 修改指定窗口下的指定控件的文本(除了输入框中文本,按钮上的文本也可修改)
#cs
第一个参数为窗口标题
第二个参数为窗口文本
第三个参数为控件ID
第四个参数为修改的新文本
第五个参数为标志,默认为0,特殊字符会生效,如果是1,则特殊字符不生效,作为普通字符
返回值为1表示成功,0表示失败
#ce
Local $result = ControlSetText("winTitle", "winContent", "Edit1", "新文本", 1)
  • 打开并运行系统中的软件应用
;打开计算器
Run("calc")

;打开记事本
Run("notepad")

;打开画图工具
Run("mspaint")

;打开Chrome浏览器
Run("C:\Program Files\Google\Chrome\Application\chrome.exe")
;暂停脚本,直至Chrome浏览器打开
RunWait("C:\Program Files\Google\Chrome\Application\chrome.exe")
ToolTip("浏览器已打开")
Sleep(2000)
  • 自定义快捷键操作
While True
    ToolTip("这里一直显示,按Esc键可退出")
    #cs
    第一个参数为快捷键的键值
    第二个参数为触发后的回调函数名
    返回值为1表示成功,0表示失败
    #ce
    HotKeySet("{esc}", "stopRun")
WEnd

Func stopRun()
    MsgBox(0, "", "程序结束")
    Exit
EndFunc

8. 常用宏命令(一种特殊的内置变量)

  • 系统相关
 @DesktopWidth  桌面宽度
 @DesktopHeight  桌面高度
 @UserName  系统当前登录的用户名称
 @IPAddress1  第一块网卡的IP地址。在某些计算机上倾向于返回127.0.0.1
  • 文件路径相关
 @DesktopDir  系统当前用户的桌面的绝对路径
 @AppDataDir  系统当前用户的应用程序数据文件夹的绝对路径(WinXp为"Application Data"文件夹路径,win7/8"Roaming"文件夹路径)
 @LocalAppDataDir  系统当前用户的"Application Data"文件夹路径
 @ScriptDir  脚本所在目录(不包括反斜杠"\")
 @ScriptName  当前运行脚本的长文件名
  • 时间相关
 @YEAR  当前年份(4位数)
 @MON  当前月份(0112)
 @MADY  当前月的当前天数(0131)
 @HOUR  当前小时值(0023)
 @MIN  当前时钟的分钟值(0059)
 @SEC  当前时钟的秒值(0059)
 @MSEC  当前时钟的毫秒值(000999)
 @YDAY  当天属该年的第几天(001366, 如果不是闰年则001365)

9. 调用外部au3模块

;Array.au3为内置模块
#include <Array.au3>

;导入自己编写的au3文件模块
#include "C:\Users\ke\Desktop\autoClickSelect.au3"

四、实战案例

1. 浮框显示简单的文字

ToolTip("显示的文字")
;使浮框持续显示2Sleep(2000)

;第二个参数为x坐标,第三个参数为y坐标
ToolTip("显示的文字", 500, 300)
Sleep(2000)

;Default为自动跟随鼠标位置
ToolTip("显示的文字", Default, Default)
Sleep(2000)

;第四个参数为标题,第五个参数为显示的图标,1-77个不同的图标,默认为0不显示
ToolTip("显示的文字", Default, Default, "标题", 1)
Sleep(2000)

2. 弹出框

#cs
第一个参数为标志,默认为0,显示简单的弹框,,如果是1,则显示确认弹框
第二个参数为弹框标题
第三个参数为文本内容
第四个参数为弹框显示的超时时间,默认为0,不自动关闭,单位秒
第五个参数为用作此对话框父级的窗口句柄 
返回值为用户点击的按钮ID
#ce
MsgBox(0, "标题", "内容文字")

MsgBox(0, "标题", "一秒后自动关闭", 1)

Local $btnId =MsgBox(1, "提示", "是否确定删除?")
If $btnId = 1 Then
    MsgBox(0, "结果", "点击了确定")
ElseIf $btnId = 2 Then
    MsgBox(0, "结果", "点击了取消")
EndIf

3. 显示鼠标点击位置

#include<Misc.au3>

While 1
    Local $pos = MouseGetPos()
    ;当鼠标左键被按下时
    If _isPressed("01") Then
        ToolTip("鼠标的x轴为:" & $pos[0] & ",鼠标的y轴为:" & $pos[1], Default, Default)
        Sleep(200)
     EndIf
 WEnd

4. 操作窗口

;获取窗口句柄
Local $hWnd = WinGetHandle("[class:#32770]")

;隐藏运行窗口
WinSetState($hWnd, "", @SW_HIDE)

Sleep(2000)

;显示运行窗口
WinSetState($hWnd, "", @SW_SHOW)

5. 读写文本文件

;写入一个字符串并以换行符结尾
FileWriteLine(@DesktopDir & "\test.txt", "第一行文本")

;紧接着文本原来的数据写入"test"
FileWrite(@DesktopDir & "\test.txt", "test" & @LF)

;读取文件中的前6个字节数据(一个中文为3个字节)
Local $val1 = FileRead(@DesktopDir & "\test.txt", 6)

;读取文件中第二行的文本
Local $val2 = FileReadLine(@DesktopDir & "\test.txt", 2)

MsgBox(0, "", "前6个字节为:" & $val1 & @LF & "第二行文本为:" & $val2)

6. 防休眠小程序(每50秒自动移动鼠标1个像素,按Ctrl+e键结束程序)

;设置快捷键Ctrl+e,按下后执行stop函数
HotKeySet("^e", "stop")
   
While True
   ;获取当前鼠标位置
   Local $pos = MouseGetPos()
   Local $newX = $pos[0]
   Local $newY = $pos[1]

   ;让鼠标的xy往屏幕的中心点移动
   If $pos[0] >= @DesktopWidth / 2 Then
        $newX -= 1
   Else
        $newX += 1
   EndIf
   If $pos[1] >= @DesktopHeight / 2 Then
        $newY -= 1
   Else
        $newY += 1
   EndIf
   MouseMove($newX, $newY)
   
   Sleep(50000)
WEnd

Func stop()
   MsgBox(0, "提示", "程序已结束")
   Exit
EndFunc

7. 设置默认浏览器

  • 设置Chrome为默认浏览器
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.htm\UserChoice", "ProgId", "REG_SZ", "ChromeHTML")
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.html\UserChoice", "ProgId", "REG_SZ", "ChromeHTML")
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\ftp\UserChoice", "ProgId", "REG_SZ", "ChromeHTML")
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice", "ProgId", "REG_SZ", "ChromeHTML")
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice", "ProgId", "REG_SZ", "ChromeHTML")
  • 设置Firefox为默认浏览器
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.htm\UserChoice", "ProgId", "REG_SZ", "FirefoxHTML")
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.html\UserChoice", "ProgId", "REG_SZ", "FirefoxHTML")
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\ftp\UserChoice", "ProgId", "REG_SZ", "FirefoxURL")
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice", "ProgId", "REG_SZ", "FirefoxURL")	
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice", "ProgId", "REG_SZ", "FirefoxURL")

8. 定时关机精灵

#cs
=======================定时关机精灵=======================
#ce

#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <Date.au3>

#cs
修改AutoIt的通知栏全局设置
#ce
Opt("TrayMenuMode", 1 + 2)
Opt("TrayAutoPause", 0) ;点击图标时,脚本不暂停

;创建快捷键,按下Ctrl+Alt+向下箭头则退出程序
HotKeySet("^!{DOWN}", "_HotKey")

#cs
创建GUI视图界面
#ce
Global $Form = GUICreate("定时关机精灵1.0", 308, 280, 192, 114)

Const $shutdownOptionsWidth = 290 ;关机选项模块的宽
Const $shutdownOptionsHeight = 97 ;关机选项模块的高
Global $Group1 = GUICtrlCreateGroup("定时关机选项", 8, 8, $shutdownOptionsWidth, $shutdownOptionsHeight)
Global $Label1 = GUICtrlCreateLabel("系统将在每天", 20, 32, 76, 17)
Global $Combo1 = GUICtrlCreateCombo("", 93, 27, 40, 17)
Global $Label2 = GUICtrlCreateLabel("时", 137, 32, 16, 17)
Global $Combo2 = GUICtrlCreateCombo("", 153, 27, 40, 17)
Global $Labe13 = GUICtrlCreateLabel("分执行下列操作", 200, 32, 88, 17)
Global $Radio1 = GUICtrlCreateRadio("关机", 24, 70, 49, 17)
Global $Radio2 = GUICtrlCreateRadio("重启", 96, 70, 57, 17)
Global $Radio3 = GUICtrlCreateRadio("注销", 160, 70, 49, 17)
Global $Radio4 = GUICtrlCreateRadio("锁定", 224, 70, 49, 17)

Const $advancedOptionsWidth = 290 ;高级选项模块的宽
Const $advancedOptionsHeight = 121 ;高级选项模块的高
Const $advancedOptionsStartY = $shutdownOptionsHeight + 20 ;高级选项模块开始的Y轴位置
Global $Group3 = GUICtrlCreateGroup("高级选项", 8, $advancedOptionsStartY, $advancedOptionsWidth, $advancedOptionsHeight)
Global $Checkbox1 = GUICtrlCreateCheckbox("启用自我保护,设置密码", 16, $advancedOptionsStartY + 20, 153, 17, $BS_AUTOCHECKBOX)
Global $Input = GUICtrlCreateInput("", 173, $advancedOptionsStartY + 20, 80, 17, $ES_PASSWORD)
Global $Checkbox2 = GUICtrlCreateCheckbox("程序运行时禁止修改系统时间。", 16, $advancedOptionsStartY + 42, 185, 17, $BS_AUTOCHECKBOX)
Global $Checkbox3 = GUICtrlCreateCheckbox("每天8:30分自动与授时服务器校准时间。", 16, $advancedOptionsStartY + 64, 249, 17, $BS_AUTOCHECKBOX)
Global $Checkbox4 = GUICtrlCreateCheckbox("当同时按下ctr1+a1t+UP键时,系统瞬间重启。", 16, $advancedOptionsStartY + 86, 257, 17, $BS_AUTOCHECKBOX)

Global $Button1 = GUICtrlCreateButton("确定", 220, $advancedOptionsStartY + $advancedOptionsHeight + 10, 73, 25)

#cs
创建程序右键菜单
#ce
Global $ts1 = TrayCreateItem("程序设置")
TrayCreateItem("")
Global $ts2 = TrayCreateItem("系统休眠")
Global $ts3 = TrayCreateItem("注销当前用户")
Global $ts4 = TrayCreateItem("系统重启")
Global $ts5 = TrayCreateItem("关闭系统")
TrayCreateItem("")
Global $ts0 = TrayCreateItem("退出程序")

#cs
创建用于选择时间的下拉框选项的两个常量
#ce
Const $set1 = "1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|00"
Const $set2 = "00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59"

;程序写入注册表,开机自启动
RegWrite("HKLM\SOFTWARE\Microsoft\Windows\Currentversion\Run", "定时强制关机精灵", "REG_SZ", @ScriptFullPath)

Global $hour,$minute,$pwd
Global $type,$nettime,$hide,$lctime,$hotkey
_main()
Exit

#cs
以下是自定义的函数
#ce

;主入口函数
Func _main()
   _inird()
   GUICtrlSetData($Combo1, $set1, $hour)
   GUICtrlSetData($Combo2, $set2, $minute)
   While 1
	  If Number($hour) = @HOUR And Number($minute) = @MIN Then ExitLoop
	  Local $_ts = TrayGetMsg()
	  ;响应用户在右键菜单中的点击操作
	  Switch $_ts
		 Case $ts0
			_pdcheck("E")
		 Case $ts1
			_pdcheck("F")
		 Case $ts2
			;休眠
			_shutdown(5)
		 Case $ts3
			;注销
			_shutdown(3)
		 Case $ts4
			;重启
			_shutdown(2)
		 Case $ts5
			;关机
			_shutdown(1)
	  EndSwitch
   WEnd
   ;退出循环则表示到了设置的时间,执行关机、重启等操作
   _shutdown($type)
EndFunc

;执行关机、重启等操作
Func _shutdown($type)
   For $step = 3 To 1 Step -1
	  TrayTip("警告", $step & "正在执行操作...", 0, 1)
	  Sleep(1000)
   Next
   TrayTip("", "", 0)
   Switch $type
	  Case 1
		 ;关机
		 Shutdown(1 + 4 + 8)
	  Case 2
		 ;重启
		 Shutdown(2 + 4)
	  Case 3
		 ;注销
		 Shutdown(0)
	  Case 4
		 ;锁定
		 Send("#L")
	  Case 5
		 ;休眠
		 Shutdown(64)
	  EndSwitch
   Exit
EndFunc

Func _form()
   GUISetState(@SW_SHOW, $Form)
   While 1
	  Local $idMsg = GUIGetMsg()
	  Local $gur1 = GUICtrlRead($Checkbox1)
	  Local $gur2 = GUICtrlRead($Checkbox2)
	  Local $gur3 = GUICtrlRead($Checkbox3)
	  Local $gur4 = GUICtrlRead($Checkbox4)
	  Switch $idMsg
		 Case $Button1
			ExitLoop
		 Case $Radio1
			$type = "1"
		 Case $Radio2
			$type = "2"
			Case $Radio3
			$type = "3"
		 Case $Radio4
			$type = "4"
		 Case $Checkbox1
			If $gur1 = $GUI_CHECKED Then
			   $hide = 1
			   GUICtrlSetstate($Input, $GUI_ENABLE)
			Else
			   $hide = 0
			   GUICtrlSetState($Input, $GUI_DISABLE)
			EndIf
		 Case $Checkbox2
			If $gur2 = $GUI_CHECKED Then
			   $lctime = 1
			Else
			   $lctime = 0
			EndIf
		 Case $Checkbox3
			If $gur3 = $GUI_CHECKED Then
			   $nettime = 1
			Else
			   $nettime =0
			EndIf
		 Case $Checkbox4
			If $gur4 = $GUI_CHECKED Then
			   $hotkey = 1
			Else
			   $hotkey = 0
			EndIf
		 Case $GUI_EVENT_CLOSE
			GUISetState(@SW_HIDE, $Form)
			_main()
	  EndSwitch
   WEnd
   GUISetState(@SW_HIDE, $Form)
   _rfwin($type, $nettime, $hide, $lctime, $hotkey)
   _main()
EndFunc

;将GUI的设置写入ini文件
Func _rfwin($type, $nettime, $hide, $lctime, $hotkey)
   Local $idMsg = GUIGetMsg()
   $hour = GUICtrlRead($Combo1)
   $minute = GUICtrlRead($Combo2)
   $pwd = GUICtrlRead($Input)
   Iniwrite(@ScriptDir & "\time.ini", "time", "hour", $hour)
   IniWrite(@ScriptDir & "\time.ini", "time", "minute", $minute)
   IniWrite(@ScriptDir & "\time.ini", "time", "type", $type)
   Iniwrite(@ScriptDir & "\time.ini", "config", "nettime", $nettime)
   Iniwrite(@ScriptDir & "\time.ini", "config", "hide", $hide)
   Iniwrite(@ScriptDir & "\time.ini", "config", "lctime", $lctime)
   Iniwrite(@ScriptDir & "\time.ini", "config", "hotkey", $hotkey)
   Iniwrite(@ScriptDir & "\time.ini", "config", "pwd", $pwd)
EndFunc

;读取ini配置文件并表现在GUIFunc _inird()
   ;将ini文件中的配置读取到变量中
   $hour = IniRead(@ScriptDir & "\time.ini", "time","hour", "")
   $minute = IniRead(@ScriptDir & "\time.ini", "time", "minute", "")
   $type = IniRead(@ScriptDir & "\time.ini", "time", "type", "")
   $nettime = IniRead(@ScriptDir & "\time.ini", "config", "nettime", "")
   $hotkey = IniRead(@ScriptDir & "\time.ini", "config", "hotkey", "")
   $pwd = IniRead(@ScriptDir & "\time.ini", "config", "pwd", "")
   $hide = IniRead(@ScriptDir & "\time.ini", "config", "hide", "")
   $lctime = IniRead(@ScriptDir & "\time.ini", "config", "lctime", "")
   ;根据配置数据选中单选框
   Switch $type
	  Case 1
		 GUICtrlSetState($Radio1, $GUI CHECKED)
	  Case 2
		 GUICtrlSetState($Radio2, $GUI_CHECKED)
	  Case 3
		 GUICtrlSetState($Radio3, $GUI CHECKED)
	  Case 4
		 GUICtrlSetState($Radio4, $GUI_CHECKED)
   EndSwitch
   If $nettime = 1 Then GUICtrlSetState($Checkbox3, $GUI_CHECKED)
   If $hotkey = 1 Then GUICtrlSetState($Checkbox4, $GUI_CHECKED)
   If $hide = 1 Then
	  GUICtrlSetState($Checkbox1, $GUI_CHECKED)
	  GUICtrlSetState($Input, $GUI_ENABLE)
      GUICtrlSetData($Input, $pwd)
   EndIf
   If $lctime = 1 Then
      GUICtrlsetstate($Checkbox2, $GUI_CHECKED)
      FileMove(@SystemDir & "\timedate.cpl", @ScriptDir & "\timedate.dll", 1)
   Else
      FileMove(@ScriptDir & "\timedate.dll", @SystemDir & "\timedate.cpl")
   EndIf
   Return
EndFunc

;验证密码,实现退出或进入系统设置功能
Func _pdcheck($call)
   If $pwd <> "" And $hide = 1 Then
      Local $pdchk = GUICreate("验证密码", 240, 30)
      Local $idFile = GUICtrlCreateInput("", 10, 5, 150, 20, $ES_PASSWORD)
      GUICtrlSetState(-1, $GUI_DROPACCEPTED)
      Local $idBtn = GUICtrlCreateButton("Ok", 170, 5, 60, 20)
      GUISetState(@SW_SHOW)
      While 1
         Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
			   GUISetState(@SW_HIDE)
			   _main()
			Case $idBtn
			   If $pwd == GUICtrlRead($idFile) Then
				  ExitLoop
			   Else
				  MsgBox(4096, "错误", "验证失败")
			   EndIf
		 EndSwitch
	  WEnd
   EndIf
   GUISetState(@SW_HIDE)
   If $call = "F" Then
	  _form()
   ElseIf $CALL = "E" Then
	  FileMove(@ScriptDir & "\timedate.dll", @SystemDir & "\timedate.cpl")
	  ;删除注册表中添加的开机自启动
	  RegDelete("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "定时关机精灵")
	  MsgBox(0, "", "成功退出程序")
	  Exit
   EndIf
EndFunc

;按下Ctrl+Alt+向下箭头按键后的回调函数
Func _HotKey()
   _pdcheck("E")
EndFunc

五、实战总结

1. ControlSend和ControlSetText的区别
  • ControlSend是模拟键盘一个个字符进行输入;而ControlSetText相当于是将整个字符串直接粘贴进去
  • ControlSend只对可输入的控件有作用;而ControlSetText可以操作其他控件,比如,可以修改按钮中的文字
2. 不能使用If Else判断一个数组存不存在,因为它总是会走Else,即使它不是空数组
3. 使用UBound()函数获取数组中元素个数时,空数组和有一个元素的数组都会返回1,可以使用If _ArrayToString($arr) Then来判断是空数组还是非空数组,但是这有个弊端就是,如果数组中是空字符串,那么就会走Else,这点注意一下就行
4. 如果想要学习AutoIt3更多知识或者想使用AutoIt3进行实战开发的,可以看我的另一篇文章, 手把手带你使用AutoIt3开发一个完整项目。

更多个人文章

  1. 两个跨域页面进行跳转传参的终极方案
  2. 彻底搞懂盒子模型
  3. 深入理解Event Loop的运行机制
  4. 面试秘籍之手写系列
  5. 十分钟带你入门Chrome插件开发

代做工资流水公司太原代开签证流水湖州代办车贷流水遵义做银行流水单廊坊薪资银行流水图片上海流水单代做许昌代办企业对私流水海口查询工作收入证明湘潭贷款银行流水报价潮州企业贷流水报价淄博工资银行流水制作沧州收入证明查询南京银行流水账多少钱潍坊打印房贷银行流水阜阳打签证工资流水衡阳打印银行流水电子版衡阳对公银行流水多少钱开封开背调流水大庆银行流水电子版图片新乡离职证明代办襄阳打薪资流水徐州自存流水打印太原办理入职流水绍兴办理在职证明桂林收入证明样本徐州银行流水电子版查询桂林开企业对公流水淄博企业对私流水图片襄阳打印消费贷流水北京企业对公流水制作滁州制作流水账单香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化