autoit入門教程小結第3/5頁
更新時間:2008年06月19日 09:14:04 作者:
對于聽說過autoit腳本的朋友,下面的入門教程是個不錯的教材,建議大家看看
注意:窗口標題和窗口文本參數(shù)總是對大小寫敏感的。
1、等待窗口系列命令/函數(shù)
AHK和AU3都提供了用法類似的一組窗口等待命令/函數(shù):WinWait/WinWaitActive/WinWaitClose。
它們分別用于等待窗口出現(xiàn)、等待窗口被激活、等待窗口被關閉。由于這些命令/函數(shù)的參數(shù)類似,現(xiàn)僅以WinWait為例說明。
AHK:
WinWait [, 窗口標題, 窗口文本, 超時時間, 排除標題, 排除文本]
AU3:
WinWait ( "窗口標題" [, "窗口文本" [, 超時時間]] )
WinWait 的作用是在目標窗口出現(xiàn)之前不再執(zhí)行后面的所有語句。
假設我們要運行記事本程序,并在其窗口出現(xiàn)時提示用戶:
【示例 3.1.1 】
AHK:
Run Notepad
WinWait, 無標題 - 記事本
MsgBox 記事本窗口已被打開!
AU3:
Run("Notepad")
WinWait("無標題 - 記事本")
MsgBox(0, "", "記事本窗口已被打開!")
2、激活窗口相關命令/函數(shù)
讓目標窗口成為活動窗口的辦法就是激活它,可用的命令/函數(shù)是WinActivate:
AHK:
WinActivate [,窗口標題, 窗口文本, 排除標題, 排除文本]
AU3:
WinActivate ( "窗口標題" [, "窗口文本"] )
3、關閉窗口
關閉窗口有兩種方式,一種是正常的關閉窗口(WinClose),另一種則是強行關閉窗口(WinKill):
AHK:
WinClose/WinKill [,窗口標題, 窗口文本, 超時時間,, 排除標題, 排除文本]
AU3:
WinClose/WinKill ( "窗口標題" [, "窗口文本"] )
現(xiàn)在我們已經(jīng)可以實現(xiàn)一個比較簡單的功能了,比如我們可以打開系統(tǒng)屬性窗口并等待其出現(xiàn),窗口出現(xiàn)后激活它,接著等待3秒再關閉它:
【示例 3.1.2 】
AHK:
Run, Sysdm.cpl
WinWait, 系統(tǒng)屬性
WinActivate, 系統(tǒng)屬性
WinWaitActive, 系統(tǒng)屬性
Sleep, 3000
WinClose, 系統(tǒng)屬性
WinWaitClose, 系統(tǒng)屬性
AU3:
Run("Control Sysdm.cpl")
WinWait("系統(tǒng)屬性")
WinActivate("系統(tǒng)屬性")
WinWaitActive("系統(tǒng)屬性")
Sleep(3000)
WinClose("系統(tǒng)屬性")
WinWaitClose("系統(tǒng)屬性")
建議:如果程序中頻繁地出現(xiàn)要用到這些窗口標題的地方,會帶來一個問題:腳本的可讀性,也許你會想,這不是很直觀嗎?可問題是如果這個重復出現(xiàn)的窗口標題是個很長的字符串呢?這將嚴重影響整個代碼的排版美觀。而且我們也無從了解這些窗口標題的“來頭”,不知道這個窗口標題究竟是怎么來的。而如果我們定義一個變量(假設變量名是“AppWindow1”)保存這個窗口標題,我們就能在命令/函數(shù)中用變量來表示它,這樣就達到了讓代碼用意更清晰一點的目的。另外,就算目標軟件因某些原因(比如升級)而改變了它的窗口標題,我們也能很方便地作出修改。
4、更準確的標識窗口的方法(主要針對AHK腳本)
程序在運行時起碼會有一個進程,如果能獲得這個進程ID就能在一定程度上保證對窗口的準確標識。另外,每個窗口都有定義窗口類名(Class,比如說記事本窗口的類名就是Notepad),所以我們可以以此排除與目標窗口不同的其它窗口類。其實,我們還有一個更準確的方法:
每個窗口(包括控件在內(nèi))都被Windows指派了一個可區(qū)別于其它窗口的唯一的標識符(ID),我們稱之為窗口句柄(HWND)。
直接給定窗口標題來表示窗口的一個缺點就是無法保證在腳本運行的過程中始終以該窗口為操作目標,因為在這個過程中很有可能會有其它“同名”窗口(或者說滿足匹配條件的窗口)出現(xiàn),而如果我們使用這個標識符來表示窗口自然就能保證命令/函數(shù)的操作窗口總是同一個窗口了。
我們先來了解一下獲得窗口句柄的命令/函數(shù):
AHK:
WinGet[, 輸出變量, ID, 窗口標題, 窗口文本, 排除標題, 排除文本]
AU3:
WinGetHandle ( "窗口標題" [, "窗口文本"] )
其中WinGet獲得的窗口ID將通過“輸出變量”返回,而WinGetHandle的返回值就是獲得的窗口ID。
我們在進行自動化操作時是要先運行某個程序,如何獲得這個程序成功運行后顯示的窗口句柄?一個比較保險的辦法是先獲得這個程序的進程ID,然后根據(jù)這個進程ID獲得它的窗口句柄,AHK支持使用進程ID作為窗口標題使用;但AU3不支持這樣使用,只能先獲得該窗口的類名再根據(jù)該類名來獲得窗口句柄(不夠保險):
【示例 3.1.3 】
AHK:
Run, NotePad, , , ThisPID
WinWait, ahk_pid %ThisPID%
;這里的ahk_pid表明跟在后面的變量是進程ID
WinGet, ThisID, ID, ahk_pid %ThisPID%
;ThisID將保存獲得的窗口句柄
AU3:
Opt("WinTitleMatchMode", 4)
Run("Notepad")
$handle = WinGetHandle("classname=Notepad")
現(xiàn)在暫且先忘記了AU3吧,因為它的窗口函數(shù)一般都不支持使用窗口句柄作為(窗口標題)參數(shù)。
至于如何在AHK中使用窗口句柄,簡單的說,凡是有“窗口標題”參數(shù)的命令就可以用窗口句柄來代替,比如:
【示例 3.1.4 】
AHK:
Run, Notepad, , , ThisPID
;先獲得運行的記事本程序的進程ID
WinWait, 無標題 - 記事本 ahk_pid %ThisPID%
;等待該進程窗口的出現(xiàn)
WinGet, ThisHWND, ID, 無標題 - 記事本 ahk_pid %ThisPID%
;獲得窗口句柄
WinActivate, ahk_id %ThisHWND%
;這里的ahk_id表明跟在后面的變量是窗口句柄
WinWaitActive, ahk_id %ThisHWND%
Sleep, 3000
WinClose, ahk_id %ThisHWND%
WinWaitClose, ahk_id %ThisHWND%
相關文章
使用AutoIT實現(xiàn)自動登錄/退出客戶端軟件,刪除日志
最近在測試新版客戶端時發(fā)現(xiàn),會不定時的出現(xiàn)登錄失敗,提示信息是“連接登錄服務器失敗...”。經(jīng)過一番嘗試,發(fā)現(xiàn)在安裝客戶端后登錄,錯誤出現(xiàn)的幾率較高。2009-03-03