注意:視窗標題和視窗文本參數總是對大小寫敏感的。
1、等待視窗系列命令/函數
- AHK和AU3都提供了用法類似的一組視窗等待命令/函數:WinWait/WinWaitActive/WinWaitClose。
- 它們分別用於等待視窗出現、等待視窗被激活、等待視窗被關閉。由於這些命令/函數的參數類似,現僅以WinWait為例說明。
- [size=10.5pt]AHK:[size=10.5pt]
- WinWait [, 視窗標題, 視窗文本, 超時時間, 排除標題, 排除文本]
- AU3:
- WinWait ( "視窗標題" [, "視窗文本" [, 超時時間]] )
- [size=10.5pt]WinWait 的作用是在目標視窗出現之前不再執行後面的所有語句。[size=10.5pt]
- 假設我們要執行記事本程式,並在其視窗出現時提示會員:[size=10.5pt]
- 【示例 [size=10.5pt]3.1.1 】[size=10.5pt]
- [size=10.5pt]
- AHK:[size=10.5pt]
- Run Notepad
- WinWait, 無標題 - 記事本
- MsgBox 記事本視窗已被打開!
- [size=10.5pt]AU3:[size=10.5pt]
- Run("Notepad")
- WinWait("無標題 - 記事本")
- MsgBox(0, "", "記事本視窗已被打開!")
複製代碼
2、激活視窗相關命令/函數
- 讓目標視窗成為活動視窗的辦法就是激活它,可用的命令/函數是WinActivate:
- [size=10.5pt]AHK:[size=10.5pt]
- WinActivate [,視窗標題, 視窗文本, 排除標題, 排除文本]
- AU3:
- WinActivate ( "視窗標題" [, "視窗文本"] )
複製代碼
3、關閉視窗
- 關閉視窗有兩種方式,一種是正常的關閉視窗(WinClose),另一種則是強行關閉視窗(WinKill):
- [size=10.5pt]AHK:[size=10.5pt]
- WinClose/WinKill [,視窗標題, 視窗文本, 超時時間,, 排除標題, 排除文本]
- AU3:
- WinClose/WinKill ( "視窗標題" [, "視窗文本"] )
- 現在我們已經可以實現一個比較簡單的功能了,比如我們可以打開系統屬性視窗並等待其出現,視窗出現後激活它,接著等待[size=10.5pt]3秒再關閉它:[size=10.5pt]
- 【示例 [size=10.5pt]3.1.2 】[size=10.5pt]
- [size=10.5pt]
- AHK:[size=10.5pt]
- Run, Sysdm.cpl
- WinWait, 系統屬性
- WinActivate, 系統屬性
- WinWaitActive, 系統屬性
- Sleep, 3000
- WinClose, 系統屬性
- WinWaitClose, 系統屬性
- [size=10.5pt]AU3:[size=10.5pt]
- Run("Control Sysdm.cpl")
- WinWait("系統屬性")
- WinActivate("系統屬性")
- WinWaitActive("系統屬性")
- Sleep(3000)
- WinClose("系統屬性")
- WinWaitClose("系統屬性")
- 建議:如果程式中頻繁地出現要用到這些視窗標題的地方,會帶來一個問題:腳本的可讀性,也許你會想,這不是很直觀嗎?可問題是如果這個重複出現的視窗標題是個很長的字符串呢?這將嚴重影響整個代碼的排版美觀。而且我們也無從瞭解這些視窗標題的「來頭」,不知道這個視窗標題究竟是怎麼來的。而如果我們定義一個變量(假設變量名是「AppWindow1」)保存這個視窗標題,我們就能在命令/函數中用變量來表示它,這樣就達到了讓代碼用意更清晰一點的目的。另外,就算目標軟體因某些原因(比如升級)而改變了它的視窗標題,我們也能很方便地作出修改。
- [size=10.5pt]
複製代碼
4、更準確的標識視窗的方法(主要針對AHK腳本)
- 程式在執行時起碼會有一個進程,如果能獲得這個進程[size=10.5pt]ID就能在一定程度上保證對視窗的準確標識。另外,每個視窗都有定義視窗類名([size=10.5pt]Class,比如說記事本視窗的類名就是[size=10.5pt]Notepad),所以我們可以以此排除與目標視窗不同的其它視窗類。其實,我們還有一個更準確的方法:[size=10.5pt]
- 每個視窗(包括控件在內)都被[size=10.5pt]Windows指派了一個可區別於其它視窗的唯一的標識符([size=10.5pt]ID),我們稱之為視窗句柄([size=10.5pt]HWND)。[size=10.5pt]
- 直接給定視窗標題來表示視窗的一個缺點就是無法保證在腳本執行的過程中始終以該視窗為操作目標,因為在這個過程中很有可能會有其它「同名」視窗(或者說滿足匹配條件的視窗)出現,而如果我們使用這個標識符來表示視窗自然就能保證命令/函數的操作視窗總是同一個視窗了。
- 我們先來瞭解一下獲得視窗句柄的命令/函數:
- [size=10.5pt]AHK:[size=10.5pt]
- WinGet[, 輸出變量, ID, 視窗標題, 視窗文本, 排除標題, 排除文本]
- AU3:
- WinGetHandle ( "視窗標題" [, "視窗文本"] )
- 其中[size=10.5pt]WinGet獲得的視窗[size=10.5pt]ID將通過「輸出變量」返回,而[size=10.5pt]WinGetHandle的返回值就是獲得的視窗[size=10.5pt]ID。[size=10.5pt]
- [size=10.5pt]
- 我們在進行自動化操作時是要先執行某個程式,如何獲得這個程式成功執行後顯示的視窗句柄?一個比較保險的辦法是先獲得這個程式的進程[size=10.5pt]ID,然後根據這個進程[size=10.5pt]ID獲得它的視窗句柄,[size=10.5pt]AHK支持使用進程[size=10.5pt]ID作為視窗標題使用;但[size=10.5pt]AU3不支持這樣使用,只能先獲得該視窗的類名再根據該類名來獲得視窗句柄(不夠保險):[size=10.5pt]
- 【示例 [size=10.5pt]3.1.3 】[size=10.5pt]
- [size=10.5pt]AHK:[size=10.5pt]
- [size=10.5pt]Run, NotePad, , , ThisPID
- [size=10.5pt]WinWait, ahk_pid %ThisPID%[size=10.5pt]
- [size=10.5pt];這裡的[size=10.5pt]ahk_pid表明跟在後面的變量是進程[size=10.5pt]ID
- [size=10.5pt]WinGet, ThisID, ID, ahk_pid %ThisPID%[size=10.5pt]
- [size=10.5pt];ThisID將保存獲得的視窗句柄[size=10.5pt]
- [size=10.5pt]AU3:[size=10.5pt]
- [size=10.5pt]
- Opt("WinTitleMatchMode", 4)
- [size=10.5pt]Run("Notepad")
- [size=10.5pt]$handle = WinGetHandle("classname=Notepad")
- 現在暫且先忘記了[size=10.5pt]AU3吧,因為它的視窗函數一般都不支持使用視窗句柄作為(視窗標題)參數。[size=10.5pt]
- 至於如何在[size=10.5pt]AHK中使用視窗句柄,簡單的說,凡是有「視窗標題」參數的命令就可以用視窗句柄來代替,比如:[size=10.5pt]
- 【示例 [size=10.5pt]3.1.4 】[size=10.5pt]
- [size=10.5pt]AHK:[size=10.5pt]
- Run, Notepad, , , ThisPID[size=10.5pt]
- [size=10.5pt]
- ;先獲得執行的記事本程式的進程[size=10.5pt]ID
- WinWait, 無標題 - 記事本 ahk_pid %ThisPID%[size=10.5pt]
- [size=10.5pt];等待該進程視窗的出現
- WinGet, ThisHWND, ID, 無標題 - 記事本 ahk_pid %ThisPID%[size=10.5pt]
- [size=10.5pt];獲得視窗句柄
- WinActivate, ahk_id %ThisHWND%[size=10.5pt]
- [size=10.5pt];這裡的[size=10.5pt]ahk_id表明跟在後面的變量是視窗句柄
- WinWaitActive, ahk_id %ThisHWND%
- Sleep, 3000
- WinClose, ahk_id %ThisHWND%
- WinWaitClose, ahk_id %ThisHWND%
複製代碼
1、模擬滑鼠點擊(按鈕等)控件
- 既然是模擬會員操作,自然就包括了模擬滑鼠點擊在內。[size=10.5pt]
- 適用命令[size=10.5pt]/函數:[size=10.5pt]Click/MouseClick/ControlClick
- 其中[size=10.5pt]Click/MouseClick用來模擬會員的物理操作(點擊),把滑鼠點擊事件發送到指定坐標位置(相對當前視窗或絕對位置)上,但這種方法並不能保證[size=10.5pt]100%的準確性,屏幕分辨率、會員干擾和系統環境等都會影響到它們的執行結果,而[size=10.5pt]ControlClick則直接把滑鼠點擊事件發送到目標視窗的目標控件上,因而更準確,一般我們不考慮使用坐標位置方式的點擊,下面僅以[size=10.5pt]ControlClick為例說明:[size=10.5pt]
- [size=10.5pt]AHK:[size=10.5pt]
- ControlClick [, 目標控件或坐標位置, 視窗標題, 視窗文本, 滑鼠按鈕, 點擊次數, 選項,排除標題, 排除文本]
- AU3:
- ControlClick ( "視窗標題", "視窗文本", 控件ID [, 按鈕] [, 點擊次數]] )
- 對[size=10.5pt]AHK而言,「目標控件」參數是指要點擊的控件的類別名([size=10.5pt]ClassNN)或控件文本,另外還可以使用控件句柄(若用的是控件句柄則第一個參數需留空,並在第二個參數中使用ahk_id %控件句柄%)。[size=10.5pt]
- [size=10.5pt]
- [size=10.5pt]Q:用什麼工具來獲得目標控件的這些信息呢?[size=10.5pt]
- [size=10.5pt]A:[size=10.5pt]AHK會員請使用[size=10.5pt] AutoIt3 Window Spy,[size=10.5pt]AU3會員則請使用[size=10.5pt]AutoIt[size=10.5pt] Window Info,你可以在相應的開始功能表項目裡找到它們,或者到安裝資料夾下尋找。[size=10.5pt]
- [size=10.5pt]
- [size=10.5pt]Q:如何使用這兩個工具?[size=10.5pt]
- [size=10.5pt]A:先打開你要進行操作的目標視窗,然後執行[size=10.5pt] AutoIt3 Window Spy 或[size=10.5pt] AutoIt Window Info,接下來就是把滑鼠移到目標控件上(比如某個按鈕):[size=10.5pt]
- [size=10.5pt]AutoIt3 Window Spy 使用演示截圖:[size=10.5pt]
- [size=10.5pt]
- [size=10.5pt]
- [size=10.5pt]AutoIt[size=10.5pt] Window Info 使用演示截圖:[size=10.5pt]
- [size=10.5pt]
- [size=10.5pt]
- 現在我們假設已打開並激活了「系統屬性」視窗,而任務是點擊它的「確定」按鈕,則可用以下幾種方法:[size=10.5pt]
- 【示例[size=10.5pt]4.1.1】[size=10.5pt]
- [size=10.5pt]AHK:[size=10.5pt]
- [size=10.5pt]ControlClick[size=10.5pt], 確定[size=10.5pt], 系統屬性[size=10.5pt]
- [size=10.5pt]ControlClick[size=10.5pt], Button2, 系統屬性[size=10.5pt]
- [size=10.5pt]AU3:[size=10.5pt]
- [size=10.5pt]
- ControlClick("系統屬性[size=10.5pt]", "", 1)
- [size=10.5pt]ControlClick[size=10.5pt]("系統屬性[size=10.5pt]", "", "Button2")
- [size=10.5pt]ControlClick[size=10.5pt]("系統屬性[size=10.5pt]", "", "確定[size=10.5pt]")
- 提醒:即使目標視窗或控件是隱藏狀態,[size=10.5pt]ControlClick命令還是可以「點擊」目標控件,但不能保證成功率。[size=10.5pt]
- [size=10.5pt]
複製代碼
2、模擬鍵盤操作
- 鍵盤也是我們在操作視窗時會用到的工具,比如說在安裝軟體的時候經典的「一路回車大法」。下面簡單介紹一下模擬鍵盤操作的方法。
- Send
- 這個是最直接的方法,就是模擬會員按鍵行為,直接發送鍵擊命令,用法請參考官方文檔,在此不予說明。
- 最簡單的應用--按回車:
- AHK:
- Run, Control Sysdm.cpl
- WinWait, 系統屬性
- Send, {Enter}
- AU3:
- Run("Control Sysdm.cpl")
- WinWait("系統屬性")
- Send("{Enter}")
- 常見的組合鍵--Alt+X / Ctrl+N等等,在安裝軟體的時候經常會有提供一個按鈕「下一步(N)」,表示按下Alt+N即可觸發等同於點擊該按鈕的效果,其它的可觸類旁通。以打開記事本視窗的「檔案」功能表為例:
- AHK:
- Run, Notepad
- WinWait, 無標題 - 記事本
- WinActivate, 無標題 - 記事本
- WinWaitActive, 無標題 - 記事本
- Send, !f
- AU3:
- Run("Notepad")
- WinWait("無標題 - 記事本")
- WinActivate("無標題 - 記事本")
- WinWaitActive("無標題 - 記事本")
- Send("!f")
複製代碼
五、自動化操作輕鬆入門系列
- 控件操作
- 然而,在真正實現自動化時僅靠上面的技術往往難以達到預期目的。下面開始進入最為重要的控件操作。
- 1、設定文本
- 在安裝軟體的過程中會員往往需要提供一些必需信息,比如安裝資料夾。很多會員並不喜歡把軟體安裝到默認的C盤而更願意把它們安裝到別的地方,那麼腳本究竟提供了什麼方法能讓我們修改如下圖所示的資料夾呢?
- 我們先用上文中提到的[size=10.5pt]AutoIt3 Window Spy 或[size=10.5pt] AutoIt Window Info 來獲得這個資料夾的編輯框的信息,假設這個視窗的標題為[size=10.5pt]Setup foobar,該資料夾編輯框的類名是[size=10.5pt]Edit1,而我們需要把它改成「[size=10.5pt]D:\foobar2000」,接下來就可以使用下列命令[size=10.5pt]/函數來設定它的文本了:[size=10.5pt]
- [size=10.5pt]AHK:[size=10.5pt]
- ControlSetText [, 目標控件, 新文本, 視窗標題, 視窗文本, 排除標題, 排除文本]
- AU3:
- ControlSetText ( "視窗標題", "視窗文本", 控件ID, "新文本")
- 具體用法如下:[size=10.5pt]
- 【示例[size=10.5pt]5.1.1】[size=10.5pt]
- [size=10.5pt]AHK:[size=10.5pt]
- [size=10.5pt]ControlSetText[size=10.5pt], Edit1, D:\foobar2000, Setup foobar
- [size=10.5pt]AU3:[size=10.5pt]
- [size=10.5pt]
- ControlSetText("Setup foobar", "", "Edit1", "D:\foobar2000"[size=10.5pt])
- [size=10.5pt]
複製代碼
2、選中和取消選中單選框和復選框項目
- 有時程式為了滿足會員的個性化設定而需要會員提供更多的信息,我們經常會遇到這樣的情況:[size=10.5pt]
- [size=10.5pt]
- 如何保證選中所需項目並取消某些項目呢?[size=10.5pt]
- 下面先來介紹[size=10.5pt]AHK和[size=10.5pt]AU3中用來對控件進行各種屬性設定的命令[size=10.5pt]/函數:[size=10.5pt]
- [size=10.5pt]AHK:[size=10.5pt]
- Control [, 命令, 值, 目標控件, 視窗標題, 視窗文本, 排除標題, 排除文本]
- AU3:
- ControlCommand ( "視窗標題", "視窗文本", 控件ID, "命令", "選項")
- 其中,「命令」就是讓我們指定要進行何種設定的參數。對這些單選框[size=10.5pt]/復選框按鈕來說,適用的命令是「[size=10.5pt]Check」和「[size=10.5pt]UnCheck」。[size=10.5pt]
- 假設這個視窗的標題是為[size=10.5pt]Setup foobar,我們打算進行下來操作:[size=10.5pt]
- 選中它的「桌面」復選框([size=10.5pt]Button5)、取消選中「快速啟動欄」復選框([size=10.5pt]Button7);[size=10.5pt]
- 選中「[size=10.5pt]0.7x」單選框([size=10.5pt]Button14)。[size=10.5pt]
- [size=10.5pt]
- 那麼具體的用法示例如下:[size=10.5pt]
- 【示例[size=10.5pt]5.1.2】[size=10.5pt]
- [size=10.5pt]AHK:[size=10.5pt]
- [size=10.5pt]Control, Check, , Button5, foobar
- [size=10.5pt]Control, UnCheck, , Button7, foobar
- [size=10.5pt]Control, Check, , Button14, foobar
- [size=10.5pt]AU3:[size=10.5pt]
- [size=10.5pt]
- ControlCommand("foobar", "", "Button5", "Check", "")
- [size=10.5pt]ControlCommand[size=10.5pt]([size=10.5pt]"foobar", "", "Button7", "UnCheck", "")
- [size=10.5pt]ControlCommand[size=10.5pt]([size=10.5pt]"foobar", "", "Button14", "Check", "")
- [size=10.5pt]
複製代碼
3、選擇下拉列表的項目
- 相信你肯定遇到過下面這種情況:[size=10.5pt]
- [size=10.5pt]
- 問題又來了:如何選中自己需要的項目?[size=10.5pt]
- 答案仍是使用上面提到的命令[size=10.5pt]/函數。對這種控件而言,[size=10.5pt]AHK適用的命令是「Choose, N」和「ChooseString, String」,分別表示選中第[size=10.5pt]N個項目和選中與字符串[size=10.5pt]String匹配的項目;而[size=10.5pt]AU3適用的命令則是「SetCurrentSelection, N」和「SelectString, String」,分別表示選中第[size=10.5pt]N+1(注意是從零開始表示!)個項目和選中與字符串[size=10.5pt]String匹配的項目。[size=10.5pt]
- [size=10.5pt]
- 假設我們要選中第五個項目「繁體中文」,那麼具體的用法示例如下:[size=10.5pt]
- [size=10.5pt]
- 【示例[size=10.5pt]5.1.3】[size=10.5pt]
- [size=10.5pt]AHK:[size=10.5pt]
- [size=10.5pt]Control, Choose, 5, ComboBox1, Installer
- [size=10.5pt]Control, ChooseString, 繁體中文[size=10.5pt], ComboBox1, Installer
- [size=10.5pt]AU3:[size=10.5pt]
- [size=10.5pt]ControlCommand[size=10.5pt]([size=10.5pt]"Installer", "", "ComboBox1", "SetCurrentSelection", 4)
- [size=10.5pt]ControlCommand[size=10.5pt]("Installer", "", "ComboBox1", "SelectString", "繁體中文[size=10.5pt]")
複製代碼 |