全網(wǎng)最全AutoIt3基礎(chǔ)教程及實(shí)戰(zhàn)案例

一、簡(jiǎn)介

AutoIt 目前最新是v3版本函喉,這是一個(gè)使用類似BASIC腳本語言的免費(fèi)軟件园欣,它設(shè)計(jì)用于Windows GUI(圖形用戶界面)中進(jìn)行自動(dòng)化操作。它利用模擬鍵盤按鍵么夫,鼠標(biāo)移動(dòng)和窗口/控件的組合來實(shí)現(xiàn)自動(dòng)化任務(wù),而這是其它語言不可能做到或無可靠方法實(shí)現(xiàn)的肤视,比如橄教,我們?cè)谑褂胹elenium做自動(dòng)化測(cè)試web應(yīng)用時(shí)到腥,就會(huì)遇到一個(gè)問題就是哪轿,當(dāng)使用selenium自動(dòng)化點(diǎn)擊了網(wǎng)頁(yè)中上傳文件的按鈕后窑业,彈出一個(gè)選擇文件的彈框,由于這個(gè)彈框是屬于操作系統(tǒng)的而非瀏覽器困后,selenium程序就無法進(jìn)行后續(xù)的操作了乐纸,這時(shí)侯就我們就可以使用AutoIt編寫自動(dòng)化腳本,來執(zhí)行后續(xù)的自動(dòng)選擇文件的操作操灿。

二锯仪、安裝及使用

1. 安裝

AutoIt官網(wǎng):https://www.autoitscript.com/site/autoit/
AutoIt下載地址:https://www.autoitscript.com/site/autoit/downloads/

安裝完成后打開AutoIt v3所在的文件夾


2. 查看API手冊(cè)



在線中文文檔:https://www.autoitx.com/Doc/

3. 提取窗口信息

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



將Finder Tool的定位光標(biāo)拖拽到窗口中的某控件上,獲取窗口及控件相關(guān)信息


4. 編寫腳本

5. 運(yùn)行腳本

雙擊.au3文件運(yùn)行腳本


6. 導(dǎo)出exe文件


選擇demo.au3文件趾盐,點(diǎn)擊Convert按鈕生成demo.exe文件


三庶喜、開發(fā)基礎(chǔ)

1. 定義變量

  • 定義變量(必須以"$"符號(hào)開頭,默認(rèn)為全局變量)
;定義變量
$a, $b, $c
$a = 1
$b = 2
$c = $a + $b

;定義字符串
$name = "張三"

;定義布爾值
$bool1 = True
$bool2 = False

;定義數(shù)組
$arr[2] = ["react", "vue"]
$arr[] = ["text", True, 5]

;定義函數(shù)
Func getName()
    Local $name = "李四"
    Return $name
EndFunc
  • 局部變量(函數(shù)內(nèi)定義的救鲤,函數(shù)外無法獲取)
Local $name = "張三"
Local $arr[2] = ["react", "vue"]
  • 全局變量(函數(shù)內(nèi)定義的久窟,函數(shù)外可以獲取)
Global $name = "張三"
Global $arr[2] = ["react", "vue"]
  • 常量(不可被重新賦值)
Const $pi = 3.1415926

2. 添加注釋

;單行注釋以";" 開頭
Local $name = "張三"

#cs
多行注釋:以 "#cs" 開頭,以 "#ce" 結(jié)束本缠,或者以 "#comments-start" 開頭斥扛,以 "#comments-end" 結(jié)束。
#ce
Func fn()
    MsgBox(0, "標(biāo)題", "文本內(nèi)容")
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. 循環(huán)體

  • 簡(jiǎn)單For循環(huán)
Local $sum1 = 0
For $i=0 To 10
    $sum1 += $i
Next
  • Step 2表示每次循環(huán)結(jié)束后執(zhí)行$i += 2, 如果是Step -2, 則每次循環(huán)結(jié)束后執(zhí)行$i -= 2
Local $sum2 = 0
For $i=0 To 10 Step 2
    $sum1 += $i
Next
  • While循環(huán)
Local $i = 0
While True
    $i += 1
    If $i=4 Then
        ContinueLoop
    ElseIf $i > 10 Then
        ExitLoop
    EndIf
    Tooltip($i)
    Sleep(500)
WEnd
  • Do循環(huán)
Local $i = 0
Local $i = 0
Do
    Tooltip($i)
    Sleep(500)
    $i += 1
Until $i>3
  • 遍歷數(shù)組
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

;返回字符串中從左開始指定數(shù)量的字符
StringLeft("123456", 3)

;返回字符串中從右開始指定數(shù)量的字符
StringRight("123456", 3)

#cs
截取字符串的部分字符
第一個(gè)參數(shù)為要操作的字符串
第二個(gè)參數(shù)為截取開始的第幾個(gè)字符數(shù)
第三個(gè)參數(shù)為要截取的字符個(gè)數(shù)
#ce
Local $newStr = StringMid("123456", 3, 2)

;刪除字符串中從左開始指定數(shù)量的字符
Local $newStr = StringTrimLeft("123456", 3)

;刪除字符串中從右開始指定數(shù)量的字符
Local $newStr = StringTrimRight("123456", 3)

#cs
字符串替換
第一個(gè)參數(shù)為要操作的字符串
第二個(gè)參數(shù)為要替換的字符串
第三個(gè)參數(shù)為要替換成的目標(biāo)字符串
第四個(gè)參數(shù)為替換的次數(shù),默認(rèn)為0稀颁,全部替換
第五個(gè)參數(shù)為標(biāo)志芬失,是否區(qū)分大小寫,默認(rèn)為0匾灶,不區(qū)分大小寫棱烂,1則區(qū)分大小寫,2也不區(qū)分大小寫阶女,使用基本/更快的比較方式
返回值為新字符串
#ce
Local $newStr = StringReplace("ab3ab3ab3", "ab", "12", 3)

#cs
根據(jù)給定的分隔符將字符串拆分為子字符串
第一個(gè)參數(shù)為要操作的字符串
第二個(gè)參數(shù)為用作分隔符的一個(gè)或多個(gè)字符
第三個(gè)參數(shù)略
返回值為數(shù)組
#ce
#include <StringConstants.au3>
Local $arr = StringSplit("1233,ab,3", ",", $STR_NOCOUNT)

;更多操作可以使用內(nèi)置的String.au3模塊
#include <String.au3>

6. 操作數(shù)組

;獲取數(shù)組中的某個(gè)值
Local $arr[2] = [1, 2]
Local $sum = $arr[0] + $arr[2]

;返回?cái)?shù)組的長(zhǎng)度或map中鍵的數(shù)量
Local $arr[] = [1, 2, 3]
UBound($arr)

;初始化數(shù)組時(shí)有個(gè)很大的坑颊糜,雖然寫的空數(shù)組,但是里面卻默認(rèn)有一個(gè)空字符串元素秃踩,所以要特別注意這點(diǎn)
#include <Array.au3>
Local $arr[] = []
MsgBox(0, "", UBound($arr))  ;會(huì)顯示1

;更多操作可以使用內(nèi)置的Array.au3模塊
#include <Array.au3>

7. 常用函數(shù)

  • 暫停腳本執(zhí)行
Sleep(2000)
  • 生成隨機(jī)數(shù)
#cs
第一個(gè)參數(shù)為隨機(jī)數(shù)的最小值
第二個(gè)參數(shù)為隨機(jī)數(shù)的最大值
第三個(gè)參數(shù)如果設(shè)為1衬鱼,則返回整數(shù)
#ce
Local $num = Random(1, 1000, 1)
  • 判斷值類型
Local $i = 1

;是否是個(gè)數(shù)值
Local $isNumber = IsNumber($i)

;是否是個(gè)整數(shù)
Local $isInt = IsInt($i)

;是否是個(gè)字符串
Local $isString = IsString($i)

;是否是個(gè)布爾值
Local $isBool = IsBool($i)
  • 鼠標(biāo)移動(dòng)操作
#cs
第一個(gè)參數(shù)為鼠標(biāo)移動(dòng)到的x軸位置
第二個(gè)參數(shù)為鼠標(biāo)移動(dòng)到的y軸位置
第三個(gè)參數(shù)為鼠標(biāo)移動(dòng)的速度
#ce
MouseMove(500, 300, 20)
  • 鼠標(biāo)點(diǎn)擊操作
#cs
第一個(gè)參數(shù)的枚舉值有"left"、"right", 表示模擬點(diǎn)擊鼠標(biāo)的左鍵或右鍵
第二個(gè)參數(shù)為鼠標(biāo)點(diǎn)擊的x軸位置
第三個(gè)參數(shù)為鼠標(biāo)點(diǎn)擊的y軸位置
第四個(gè)參數(shù)為鼠標(biāo)點(diǎn)擊的次數(shù)憔杨,默認(rèn)為1
第五個(gè)參數(shù)為鼠標(biāo)點(diǎn)擊的速度
#ce
MouseClick("left", 500, 300, 2, 20)
  • 向指定控件發(fā)送鼠標(biāo)點(diǎn)擊命令
#cs
第一個(gè)參數(shù)為窗口標(biāo)題
第二個(gè)參數(shù)為窗口文本
第三個(gè)參數(shù)為控件ID
第四個(gè)參數(shù)為點(diǎn)擊鼠標(biāo)的左鍵鸟赫、右鍵或其他
第五個(gè)參數(shù)為鼠標(biāo)點(diǎn)擊的次數(shù),默認(rèn)為1
第六個(gè)參數(shù)為點(diǎn)擊鼠標(biāo)相對(duì)于控件的x軸的位置芍秆,默認(rèn)為中間
第七個(gè)參數(shù)為點(diǎn)擊鼠標(biāo)相對(duì)于控件的y軸的位置惯疙,默認(rèn)為中間
#ce
ControlClick("winTitle", "winContent", "Button1", "right", 2)
  • 暫停腳本的執(zhí)行直至指定窗口存在(出現(xiàn))為止
#cs
第一個(gè)參數(shù)為窗口標(biāo)題
第二個(gè)參數(shù)為窗口文本
第三個(gè)參數(shù)為超時(shí)時(shí)間
#ce
WinWait ( "winTitle" , "winContent" , 2000)
  • 聚焦到指定活動(dòng)窗口
#cs
第一個(gè)參數(shù)為窗口標(biāo)題
第二個(gè)參數(shù)為窗口文本,選填
返回值為聚焦的窗口句柄妖啥,如果失敗則返回0   
#ce
Local $window = WinActivate ( "winTitle", "winContent")
  • 設(shè)置輸入焦點(diǎn)到指定窗口的指定控件上
#cs
第一個(gè)參數(shù)為窗口標(biāo)題
第二個(gè)參數(shù)為窗口文本
第三個(gè)參數(shù)為控件ID
#ce
ControlFocus("winTitle", "winContent", "Edit1")
  • 向當(dāng)前激活窗口發(fā)出模擬鍵盤操作
#cs
選中桌面上的Chrome圖標(biāo)(前提是腳本文件放到桌面執(zhí)行)
第一個(gè)參數(shù)為按鍵名
第二個(gè)參數(shù)為標(biāo)志,默認(rèn)為0对碌,特殊字符會(huì)生效荆虱,如果是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")

;模擬連續(xù)按下DOWN鍵3次
Send("{DOWN 3}")

;選中某個(gè)復(fù)選框
Send("{+}")

;取消選中某個(gè)復(fù)選框
Send("{-}")
  • 向指定窗口的指定控件發(fā)出模擬鍵盤操作
#cs
第一個(gè)參數(shù)為窗口標(biāo)題
第二個(gè)參數(shù)為窗口內(nèi)容
第三個(gè)參數(shù)為控件ID
第四個(gè)參數(shù)為模擬鍵盤輸入的內(nèi)容
第五個(gè)參數(shù)為標(biāo)志怀读,默認(rèn)為0,特殊字符會(huì)生效骑脱,如果是1菜枷,則特殊字符不生效,作為普通字符
返回值為1表示成功叁丧,0表示失敗
#ce
Local $result = ControlSend("winTitle", "winContent", "Edit1", "鍵盤輸入的內(nèi)容", 1)
  • 修改指定窗口下的指定控件的文本(除了輸入框中文本啤誊,按鈕上的文本也可修改)
#cs
第一個(gè)參數(shù)為窗口標(biāo)題
第二個(gè)參數(shù)為窗口文本
第三個(gè)參數(shù)為控件ID
第四個(gè)參數(shù)為修改的新文本
第五個(gè)參數(shù)為標(biāo)志,默認(rèn)為0拥娄,特殊字符會(huì)生效蚊锹,如果是1,則特殊字符不生效稚瘾,作為普通字符
返回值為1表示成功牡昆,0表示失敗
#ce
Local $result = ControlSetText("winTitle", "winContent", "Edit1", "新文本", 1)
  • 打開并運(yùn)行系統(tǒng)中的軟件應(yīng)用
;打開計(jì)算器
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
    第一個(gè)參數(shù)為快捷鍵的鍵值
    第二個(gè)參數(shù)為觸發(fā)后的回調(diào)函數(shù)名
    返回值為1表示成功丢烘,0表示失敗
    #ce
    HotKeySet("{esc}", "stopRun")
WEnd

Func stopRun()
    MsgBox(0, "", "程序結(jié)束")
    Exit
EndFunc

8. 常用宏命令(一種特殊的內(nèi)置變量)

  • 系統(tǒng)相關(guān)
 @DesktopWidth  桌面寬度
 @DesktopHeight  桌面高度
 @UserName  系統(tǒng)當(dāng)前登錄的用戶名稱
 @IPAddress1  第一塊網(wǎng)卡的IP地址柱宦。在某些計(jì)算機(jī)上傾向于返回127.0.0.1
  • 文件路徑相關(guān)
 @DesktopDir  系統(tǒng)當(dāng)前用戶的桌面的絕對(duì)路徑
 @AppDataDir  系統(tǒng)當(dāng)前用戶的應(yīng)用程序數(shù)據(jù)文件夾的絕對(duì)路徑(WinXp為"Application Data"文件夾路徑,win7/8為"Roaming"文件夾路徑)
 @LocalAppDataDir  系統(tǒng)當(dāng)前用戶的"Application Data"文件夾路徑
 @ScriptDir  腳本所在目錄(不包括反斜杠"\")
 @ScriptName  當(dāng)前運(yùn)行腳本的長(zhǎng)文件名
  • 時(shí)間相關(guān)
 @YEAR  當(dāng)前年份(4位數(shù))
 @MON  當(dāng)前月份(01到12)
 @MADY  當(dāng)前月的當(dāng)前天數(shù)(01到31)
 @HOUR  當(dāng)前小時(shí)值(00到23)
 @MIN  當(dāng)前時(shí)鐘的分鐘值(00到59)
 @SEC  當(dāng)前時(shí)鐘的秒值(00到59)
 @MSEC  當(dāng)前時(shí)鐘的毫秒值(000到999)
 @YDAY  當(dāng)天屬該年的第幾天(001到366, 如果不是閏年則001到365)

9. 調(diào)用外部au3模塊

;Array.au3為內(nèi)置模塊
#include <Array.au3>

;導(dǎo)入自己編寫的au3文件模塊
#include "C:\Users\ke\Desktop\autoClickSelect.au3"

四播瞳、實(shí)戰(zhàn)案例

1. 浮框顯示簡(jiǎn)單的文字

ToolTip("顯示的文字")
;使浮框持續(xù)顯示2秒
Sleep(2000)

;第二個(gè)參數(shù)為x坐標(biāo)掸刊,第三個(gè)參數(shù)為y坐標(biāo)
ToolTip("顯示的文字", 500, 300)
Sleep(2000)

;Default為自動(dòng)跟隨鼠標(biāo)位置
ToolTip("顯示的文字", Default, Default)
Sleep(2000)

;第四個(gè)參數(shù)為標(biāo)題,第五個(gè)參數(shù)為顯示的圖標(biāo)狐史,1-7為7個(gè)不同的圖標(biāo)痒给,默認(rèn)為0不顯示
ToolTip("顯示的文字", Default, Default, "標(biāo)題", 1)
Sleep(2000)

2. 彈出框

#cs
第一個(gè)參數(shù)為標(biāo)志,默認(rèn)為0骏全,顯示簡(jiǎn)單的彈框,苍柏,如果是1,則顯示確認(rèn)彈框
第二個(gè)參數(shù)為彈框標(biāo)題
第三個(gè)參數(shù)為文本內(nèi)容
第四個(gè)參數(shù)為彈框顯示的超時(shí)時(shí)間姜贡,默認(rèn)為0试吁,不自動(dòng)關(guān)閉,單位秒
第五個(gè)參數(shù)為用作此對(duì)話框父級(jí)的窗口句柄 
返回值為用戶點(diǎn)擊的按鈕ID
#ce
MsgBox(0, "標(biāo)題", "內(nèi)容文字")

MsgBox(0, "標(biāo)題", "一秒后自動(dòng)關(guān)閉", 1)

Local $btnId =MsgBox(1, "提示", "是否確定刪除楼咳?")
If $btnId = 1 Then
    MsgBox(0, "結(jié)果", "點(diǎn)擊了確定")
ElseIf $btnId = 2 Then
    MsgBox(0, "結(jié)果", "點(diǎn)擊了取消")
EndIf

3. 顯示鼠標(biāo)點(diǎn)擊位置

#include<Misc.au3>

While 1
    Local $pos = MouseGetPos()
    ;當(dāng)鼠標(biāo)左鍵被按下時(shí)
    If _isPressed("01") Then
        ToolTip("鼠標(biāo)的x軸為:" & $pos[0] & ",鼠標(biāo)的y軸為:" & $pos[1], Default, Default)
        Sleep(200)
     EndIf
 WEnd

4. 操作窗口

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

;隱藏運(yùn)行窗口
WinSetState($hWnd, "", @SW_HIDE)

Sleep(2000)

;顯示運(yùn)行窗口
WinSetState($hWnd, "", @SW_SHOW)

5. 讀寫文本文件

;寫入一個(gè)字符串并以換行符結(jié)尾
FileWriteLine(@DesktopDir & "\test.txt", "第一行文本")

;緊接著文本原來的數(shù)據(jù)寫入"test"
FileWrite(@DesktopDir & "\test.txt", "test" & @LF)

;讀取文件中的前6個(gè)字節(jié)數(shù)據(jù)(一個(gè)中文為3個(gè)字節(jié))
Local $val1 = FileRead(@DesktopDir & "\test.txt", 6)

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

MsgBox(0, "", "前6個(gè)字節(jié)為:" & $val1 & @LF & "第二行文本為:" & $val2)

6. 防休眠小程序(每50秒自動(dòng)移動(dòng)鼠標(biāo)1個(gè)像素熄捍,按Ctrl+e鍵結(jié)束程序)

;設(shè)置快捷鍵Ctrl+e,按下后執(zhí)行stop函數(shù)
HotKeySet("^e", "stop")

While True
   ;獲取當(dāng)前鼠標(biāo)位置
   Local $pos = MouseGetPos()
   Local $newX = $pos[0]
   Local $newY = $pos[1]

   ;讓鼠標(biāo)的x和y往屏幕的中心點(diǎn)移動(dòng)
   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, "提示", "程序已結(jié)束")
   Exit
EndFunc

7. 設(shè)置默認(rèn)瀏覽器

  • 設(shè)置Chrome為默認(rèn)瀏覽器
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")
  • 設(shè)置Firefox為默認(rèn)瀏覽器
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. 定時(shí)關(guān)機(jī)精靈

#cs
=======================定時(shí)關(guān)機(jī)精靈=======================
#ce

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

#cs
修改AutoIt的通知欄全局設(shè)置
#ce
Opt("TrayMenuMode", 1 + 2)
Opt("TrayAutoPause", 0) ;點(diǎn)擊圖標(biāo)時(shí)母怜,腳本不暫停

;創(chuàng)建快捷鍵余耽,按下Ctrl+Alt+向下箭頭則退出程序
HotKeySet("^!{DOWN}", "_HotKey")

#cs
創(chuàng)建GUI視圖界面
#ce
Global $Form = GUICreate("定時(shí)關(guān)機(jī)精靈1.0", 308, 280, 192, 114)

Const $shutdownOptionsWidth = 290 ;關(guān)機(jī)選項(xiàng)模塊的寬
Const $shutdownOptionsHeight = 97 ;關(guān)機(jī)選項(xiàng)模塊的高
Global $Group1 = GUICtrlCreateGroup("定時(shí)關(guān)機(jī)選項(xiàng)", 8, 8, $shutdownOptionsWidth, $shutdownOptionsHeight)
Global $Label1 = GUICtrlCreateLabel("系統(tǒng)將在每天", 20, 32, 76, 17)
Global $Combo1 = GUICtrlCreateCombo("", 93, 27, 40, 17)
Global $Label2 = GUICtrlCreateLabel("時(shí)", 137, 32, 16, 17)
Global $Combo2 = GUICtrlCreateCombo("", 153, 27, 40, 17)
Global $Labe13 = GUICtrlCreateLabel("分執(zhí)行下列操作", 200, 32, 88, 17)
Global $Radio1 = GUICtrlCreateRadio("關(guān)機(jī)", 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 ;高級(jí)選項(xiàng)模塊的寬
Const $advancedOptionsHeight = 121 ;高級(jí)選項(xiàng)模塊的高
Const $advancedOptionsStartY = $shutdownOptionsHeight + 20 ;高級(jí)選項(xiàng)模塊開始的Y軸位置
Global $Group3 = GUICtrlCreateGroup("高級(jí)選項(xiàng)", 8, $advancedOptionsStartY, $advancedOptionsWidth, $advancedOptionsHeight)
Global $Checkbox1 = GUICtrlCreateCheckbox("啟用自我保護(hù),設(shè)置密碼", 16, $advancedOptionsStartY + 20, 153, 17, $BS_AUTOCHECKBOX)
Global $Input = GUICtrlCreateInput("", 173, $advancedOptionsStartY + 20, 80, 17, $ES_PASSWORD)
Global $Checkbox2 = GUICtrlCreateCheckbox("程序運(yùn)行時(shí)禁止修改系統(tǒng)時(shí)間苹熏。", 16, $advancedOptionsStartY + 42, 185, 17, $BS_AUTOCHECKBOX)
Global $Checkbox3 = GUICtrlCreateCheckbox("每天8:30分自動(dòng)與授時(shí)服務(wù)器校準(zhǔn)時(shí)間碟贾。", 16, $advancedOptionsStartY + 64, 249, 17, $BS_AUTOCHECKBOX)
Global $Checkbox4 = GUICtrlCreateCheckbox("當(dāng)同時(shí)按下ctr1+a1t+UP鍵時(shí),系統(tǒng)瞬間重啟轨域。", 16, $advancedOptionsStartY + 86, 257, 17, $BS_AUTOCHECKBOX)

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

#cs
創(chuàng)建程序右鍵菜單
#ce
Global $ts1 = TrayCreateItem("程序設(shè)置")
TrayCreateItem("")
Global $ts2 = TrayCreateItem("系統(tǒng)休眠")
Global $ts3 = TrayCreateItem("注銷當(dāng)前用戶")
Global $ts4 = TrayCreateItem("系統(tǒng)重啟")
Global $ts5 = TrayCreateItem("關(guān)閉系統(tǒng)")
TrayCreateItem("")
Global $ts0 = TrayCreateItem("退出程序")

#cs
創(chuàng)建用于選擇時(shí)間的下拉框選項(xiàng)的兩個(gè)常量
#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"

;程序?qū)懭胱?cè)表袱耽,開機(jī)自啟動(dòng)
RegWrite("HKLM\SOFTWARE\Microsoft\Windows\Currentversion\Run", "定時(shí)強(qiáng)制關(guān)機(jī)精靈", "REG_SZ", @ScriptFullPath)

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

#cs
以下是自定義的函數(shù)
#ce

;主入口函數(shù)
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()
      ;響應(yīng)用戶在右鍵菜單中的點(diǎn)擊操作
      Switch $_ts
         Case $ts0
            _pdcheck("E")
         Case $ts1
            _pdcheck("F")
         Case $ts2
            ;休眠
            _shutdown(5)
         Case $ts3
            ;注銷
            _shutdown(3)
         Case $ts4
            ;重啟
            _shutdown(2)
         Case $ts5
            ;關(guān)機(jī)
            _shutdown(1)
      EndSwitch
   WEnd
   ;退出循環(huán)則表示到了設(shè)置的時(shí)間,執(zhí)行關(guān)機(jī)干发、重啟等操作
   _shutdown($type)
EndFunc

;執(zhí)行關(guān)機(jī)朱巨、重啟等操作
Func _shutdown($type)
   For $step = 3 To 1 Step -1
      TrayTip("警告", $step & "正在執(zhí)行操作...", 0, 1)
      Sleep(1000)
   Next
   TrayTip("", "", 0)
   Switch $type
      Case 1
         ;關(guān)機(jī)
         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的設(shè)置寫入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配置文件并表現(xiàn)在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", "")
   ;根據(jù)配置數(shù)據(jù)選中單選框
   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

;驗(yàn)證密碼,實(shí)現(xiàn)退出或進(jìn)入系統(tǒng)設(shè)置功能
Func _pdcheck($call)
   If $pwd <> "" And $hide = 1 Then
      Local $pdchk = GUICreate("驗(yàn)證密碼", 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, "錯(cuò)誤", "驗(yàn)證失敗")
               EndIf
         EndSwitch
      WEnd
   EndIf
   GUISetState(@SW_HIDE)
   If $call = "F" Then
      _form()
   ElseIf $CALL = "E" Then
      FileMove(@ScriptDir & "\timedate.dll", @SystemDir & "\timedate.cpl")
      ;刪除注冊(cè)表中添加的開機(jī)自啟動(dòng)
      RegDelete("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "定時(shí)關(guān)機(jī)精靈")
      MsgBox(0, "", "成功退出程序")
      Exit
   EndIf
EndFunc

;按下Ctrl+Alt+向下箭頭按鍵后的回調(diào)函數(shù)
Func _HotKey()
   _pdcheck("E")
EndFunc

五枉长、實(shí)戰(zhàn)總結(jié)

1. ControlSend和ControlSetText的區(qū)別
  • ControlSend是模擬鍵盤一個(gè)個(gè)字符進(jìn)行輸入冀续;而ControlSetText相當(dāng)于是將整個(gè)字符串直接粘貼進(jìn)去
  • ControlSend只對(duì)可輸入的控件有作用;而ControlSetText可以操作其他控件搀暑,比如沥阳,可以修改按鈕中的文字
2. 不能使用If Else判斷一個(gè)數(shù)組存不存在,因?yàn)樗偸菚?huì)走Else自点,即使它不是空數(shù)組
3. 使用UBound()函數(shù)獲取數(shù)組中元素個(gè)數(shù)時(shí)桐罕,空數(shù)組和有一個(gè)元素的數(shù)組都會(huì)返回1,可以使用If _ArrayToString($arr) Then來判斷是空數(shù)組還是非空數(shù)組,但是這有個(gè)弊端就是功炮,如果數(shù)組中是空字符串溅潜,那么就會(huì)走Else,這點(diǎn)注意一下就行
4. 如果想要學(xué)習(xí)AutoIt3更多知識(shí)或者想使用AutoIt3進(jìn)行實(shí)戰(zhàn)開發(fā)的薪伏,可以看我的另一篇文章滚澜,手把手帶你使用AutoIt3開發(fā)一個(gè)完整項(xiàng)目

更多個(gè)人文章

  1. 十分鐘帶你入門Chrome插件開發(fā)
  2. 一款將打包后的Chrome插件自動(dòng)化加載到瀏覽器的webpack插件
  3. hashHistory和browserHistory的區(qū)別
  4. 面試秘籍之手寫系列
  5. requestAnimationFrame和requestIdleCallback是宏任務(wù)還是微任務(wù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嫁怀,一起剝皮案震驚了整個(gè)濱河市设捐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌塘淑,老刑警劉巖萝招,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異存捺,居然都是意外死亡槐沼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門捌治,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岗钩,“玉大人,你說我怎么就攤上這事肖油〖嫦牛” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵森枪,是天一觀的道長(zhǎng)周蹭。 經(jīng)常有香客問我,道長(zhǎng)疲恢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任瓷胧,我火速辦了婚禮显拳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搓萧。我一直安慰自己杂数,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布瘸洛。 她就那樣靜靜地躺著揍移,像睡著了一般。 火紅的嫁衣襯著肌膚如雪反肋。 梳的紋絲不亂的頭發(fā)上那伐,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼罕邀。 笑死畅形,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诉探。 我是一名探鬼主播日熬,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼肾胯!你這毒婦竟也來了竖席?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤敬肚,失蹤者是張志新(化名)和其女友劉穎毕荐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帘皿,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡东跪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鹰溜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虽填。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖曹动,靈堂內(nèi)的尸體忽然破棺而出斋日,到底是詐尸還是另有隱情,我是刑警寧澤墓陈,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布恶守,位于F島的核電站,受9級(jí)特大地震影響贡必,放射性物質(zhì)發(fā)生泄漏兔港。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一仔拟、第九天 我趴在偏房一處隱蔽的房頂上張望衫樊。 院中可真熱鬧,春花似錦利花、人聲如沸科侈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)臀栈。三九已至,卻和暖如春挠乳,著一層夾襖步出監(jiān)牢的瞬間权薯,已是汗流浹背姑躲。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留崭闲,地道東北人肋联。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像刁俭,于是被迫代替她去往敵國(guó)和親橄仍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容