一、簡介
AutoIt 目前最新是v3版本,這是一個使用類似BASIC腳本語言的免費軟件,它設計用于Windows GUI(圖形用戶界面)中進行自動化操作。它利用模擬鍵盤按鍵,鼠標移動和窗口/控件的組合來實現自動化任務,而這是其它語言不可能做到或無可靠方法實現的,比如,我們在使用selenium做自動化測試web應用時,就會遇到一個問題就是,當使用selenium自動化點擊了網頁中上傳文件的按鈕后,彈出一個選擇文件的彈框,由于這個彈框是屬于操作系統的而非瀏覽器,selenium程序就無法進行后續的操作了,這時侯就我們就可以使用AutoIt編寫自動化腳本,來執行后續的自動選擇文件的操作。
二、安裝及使用
1. 安裝
AutoIt官網:https://www.autoitscript.com/site/autoit/
AutoIt下載地址:https://www.autoitscript.com/site/autoit/downloads/
安裝完成后打開AutoIt v3所在的文件夾
2. 查看API手冊
在線中文文檔:https://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+a鍵
Send("!+a")
;模擬連續按下DOWN鍵3次
Send("{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 當前月份(01到12)
@MADY 當前月的當前天數(01到31)
@HOUR 當前小時值(00到23)
@MIN 當前時鐘的分鐘值(00到59)
@SEC 當前時鐘的秒值(00到59)
@MSEC 當前時鐘的毫秒值(000到999)
@YDAY 當天屬該年的第幾天(001到366, 如果不是閏年則001到365)
9. 調用外部au3模塊
;Array.au3為內置模塊
#include <Array.au3>
;導入自己編寫的au3文件模塊
#include "C:\Users\ke\Desktop\autoClickSelect.au3"
四、實戰案例
1. 浮框顯示簡單的文字
ToolTip("顯示的文字")
;使浮框持續顯示2秒
Sleep(2000)
;第二個參數為x坐標,第三個參數為y坐標
ToolTip("顯示的文字", 500, 300)
Sleep(2000)
;Default為自動跟隨鼠標位置
ToolTip("顯示的文字", Default, Default)
Sleep(2000)
;第四個參數為標題,第五個參數為顯示的圖標,1-7為7個不同的圖標,默認為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]
;讓鼠標的x和y往屏幕的中心點移動
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配置文件并表現在GUI上
Func _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開發一個完整項目。
更多個人文章