




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Autoit快速開發(fā)指南2012年9月6日Autoit開發(fā)指南啟動(dòng)程序啟動(dòng)exe類型文件,一般使用Run函數(shù)Run(“路徑”)如:Run(“D:JavaMyEclipse 6eclipseeclipse.exe”)如果運(yùn)行該函數(shù),程序還沒有啟動(dòng)起來,請(qǐng)配置好程序運(yùn)行的工作目錄Run(“路徑”,”工作目錄”)如:Run(“D:JavaMyEclipse 6eclipseeclipse.exe”,” D:JavaMyEclipse 6eclipse”)注:有時(shí)程序的目錄不一定和工作目錄相同啟動(dòng)lnk,txt等文件一般使用ShellExecute函數(shù)該函數(shù)除了可以指定工作目錄外,還可以設(shè)置啟動(dòng)參數(shù)1
2、.窗口操作窗口處理一般都是針對(duì)Windows GUI窗口的操作,常用的如下:;窗口是否存在WinExists( 窗口標(biāo)題 , 窗口文本 ) ;激活窗口WinActivate( 窗口標(biāo)題 , 窗口文本 );等待某個(gè)窗口WinWait(窗口標(biāo)題 , 窗口文本 , 超時(shí)時(shí)間 );關(guān)閉指定窗口WinClose ( 窗口標(biāo)題 , 窗口文本 );獲取窗口句柄WinGetHandle ( 窗口標(biāo)題 , 窗口文本 );獲取窗口標(biāo)題WinGetTitle ( 窗口標(biāo)題 , 窗口文本 );獲取窗口進(jìn)程WinGetProcess ( 窗口標(biāo)題 , 窗口文本 )還有其他一些處理函數(shù),這個(gè)可以直接去查找AutoIt的幫
3、助文檔。下面是一個(gè)例子,一般在很多地方用到,特別是程序啟動(dòng)或者運(yùn)行到某個(gè)步驟,等待其他窗口處理,一般采用以下腳本判斷WinWait(“窗口標(biāo)題”, 窗口文本, ”等待時(shí)間”)If WinExists(“窗口標(biāo)題”) ThenWinActivate(“窗口標(biāo)題”)EndIf不建議使用WinWaitActive(“窗口標(biāo)題”,窗口文本,”等待時(shí)間”),否則,如果該窗口處于非激活狀態(tài),會(huì)使腳本一直等待直到超時(shí),按照非預(yù)設(shè)的流程解析運(yùn)行下去,得不到預(yù)期結(jié)果。1.菜單操作菜單點(diǎn)擊使用WinMenuSelectItem函數(shù)WinMenuSelectItem(“窗口標(biāo)題”, ”主菜單” , ”子菜單1”,
4、”子菜單2” )例如點(diǎn)擊窗口菜單的文件=保存WinMenuSelectItem(“未命名 畫圖”, ”文件” , ” 保存”)當(dāng)該函數(shù)無法操作菜單時(shí)候(一般為非標(biāo)準(zhǔn)的Windows GUI),可以在工具欄查找該菜單的快捷啟動(dòng)按鈕或者通過發(fā)送快捷鍵進(jìn)行控制3.工具欄操作對(duì)于工具欄快速按鈕,可以使用ControlCommand函數(shù)處理,菜單操作中很多快捷方式一般都放在工具欄中,這種情況可以多一個(gè)選擇。ControlCommand(“窗口標(biāo)題”, 窗口文本, ”工具欄控件名” , SendCommandID, ”控件ID”)ControlCommand只能操作ToolbarWindow32類型的控件
5、??丶蘒D需要通過Windows Info工具獲取。文本框在文本框輸入數(shù)據(jù)使用:ControlSetText(“標(biāo)題”,”控件名或ID” ,”輸入的字符串?dāng)?shù)據(jù)”)如果需要獲取文本框的數(shù)據(jù),則使用ControlGetText(“標(biāo)題”,”控件名或ID”)ControlSetText和ControlGetText可以操作單行文本框,密碼輸入框,多行文本框等。 選擇控件選擇控件使用ControlCommand函數(shù)操作,可以操作單選多選以及單行多行下拉選擇(ComboBox和ListBox)等控件。如選擇下拉框的某個(gè)選項(xiàng):ControlCommand(“窗口標(biāo)題”, , 控件類名或ID , Selec
6、tString, 選中選項(xiàng)文本)而針對(duì)Radio,CheckBox等選擇類型的控件ControlCommand(“窗口標(biāo)題”, ,控件類名或ID ,check, ”)而對(duì)于ListBox類型的選擇框,則需要通過一系列組合來操作選項(xiàng),如下面是獲取所有選項(xiàng)數(shù)據(jù)的例子:WinActivate(“窗口標(biāo)題”)$hWnd = ControlGetHandle(“窗口標(biāo)題”, , “控件ID”)$count = _GUICtrlListBox_GetCount($hWnd)For $i=0 To $count-1$hLabel = _GUICtrlListBox_GetText($hWnd, $i)Nex
7、t點(diǎn)擊操作 控件點(diǎn)擊控件點(diǎn)擊一般使用:ControlClick(窗口標(biāo)題,控件名或ID,按鈕,點(diǎn)擊次數(shù))按鈕分左鍵(left),右鍵(right)等此外還可以在函數(shù)后面添加坐標(biāo),這對(duì)于占用屏幕區(qū)域比較大的時(shí)候,精確點(diǎn)擊某個(gè)位置觸發(fā)其他操作比較重要比如在一個(gè)表格中,需要右擊某一行記錄,彈出右鍵菜單的情況。鼠標(biāo)點(diǎn)擊MouseClick(“按鈕”, “X坐標(biāo)”,”Y坐標(biāo)”,”點(diǎn)擊次數(shù)”)MouseClick函數(shù)對(duì)于任何點(diǎn)擊操作都有效,唯一不理想的是,它涉及坐標(biāo)點(diǎn)的確定,降低了程序的通用性。如果非要這么做,建議:將當(dāng)前窗口激活,并最大化WinActivate(窗口標(biāo)題, )WinSetState(窗口
8、標(biāo)題, , SW_MAXIMIZE);接下來進(jìn)行鼠標(biāo)點(diǎn)擊相關(guān)操作如果當(dāng)前窗口禁用最大化,則使用當(dāng)前窗口相對(duì)坐標(biāo)進(jìn)行操作AutoItSetOption ( MouseCoordMode , 1) ;這里指相對(duì)當(dāng)前激活窗口的坐標(biāo)WinActivate(窗口標(biāo)題, );接下來進(jìn)行鼠標(biāo)點(diǎn)擊相關(guān)操作鍵盤操作鍵盤操作一般使用Send函數(shù),想激活窗口發(fā)送模擬鍵盤操作 一般字符這種情況指向當(dāng)前激活窗口文本框,發(fā)送按鍵字符,如:Send(向光標(biāo)激活地方發(fā)送的字符串)快捷操作這種情況一般沒有光標(biāo)的輸入,只是針對(duì)當(dāng)前的激活窗口的一些快捷操作,比如按鍵”ctrl+S”是保存等,如Send(s)另外一些快捷鍵如:Ctr
9、l=Alt=!Win=#Shift=+其他如:Send(“ PRINTSCREEN”) 截屏鍵Send(“ SPACE”) 空格鍵Send(“ ENTER”) 回車鍵Send(“ BACKSPACE”) 退格鍵字符串處理針對(duì)字符串的處理,一般常需要判斷字符串是否存在,或?qū)ψ址M(jìn)行拆分、替換等,下面用一個(gè)例子來說明一下:一個(gè)用&連接的子字符串,需要跟某段文字進(jìn)行匹配,如果發(fā)現(xiàn)存在子存在,則替換成指定的字符串$originalStr=$matchStr=政府&奶奶的$array = StringSplit($matchStr, &, 1)If $i=1 To $array0 ThenIf Str
10、ingInStr($originalStr,$array$i)0 Then$originalStr = StringReplace($originalStr,$array$i,XXX)EndIfEndIf其他可以參考官方幫助文檔。數(shù)組處理數(shù)組可以包含不同數(shù)據(jù)類型的數(shù)據(jù),處理起來有兩種情況需要注意一般數(shù)組這個(gè)跟其他程序語言無太大的差別,如下所示:Dim $array2$array0=1$array1=2注意下標(biāo)從0開始特殊數(shù)組特殊數(shù)組指某些函數(shù)的返回值為數(shù)組的情況,或是在運(yùn)行腳本時(shí)候,傳遞給命令行的參數(shù),AutoIT會(huì)初始化一個(gè)特殊的數(shù)組,這些數(shù)組下標(biāo)也是從0開始,但是為0的項(xiàng)保存的是數(shù)組的個(gè)數(shù)
11、。命令行返回?cái)?shù)組對(duì)于腳本參數(shù)數(shù)組為$CmdLine,可以直接使用$CmdLine0 ;參數(shù)的數(shù)量$CmdLine1 ;第一個(gè)參數(shù) (腳本名稱后面)$CmdLine2 ;第二個(gè)參數(shù).$CmdLine$CmdLine0 ;可以用來表示得到最后一個(gè)參數(shù).如果腳本是像下面這樣被運(yùn)行的話:AutoIt3.exe myscript.au3 參數(shù)1 這是 一個(gè)其它參數(shù)$CmdLine0 等價(jià)于. 2$CmdLine1 等價(jià)于. 參數(shù)1$CmdLine2 等價(jià)于. 這是一個(gè)其它參數(shù)ScriptName 等價(jià)于. myscript.au3函數(shù)返回?cái)?shù)組前面用到的StringSplit函數(shù)返回值也是一個(gè)數(shù)組,0位保
12、存的是數(shù)組項(xiàng)的個(gè)數(shù),數(shù)組內(nèi)卻是從1開始計(jì)數(shù)$matchStr=11&22&33$array = StringSplit($matchStr, &, 1)如上:$array0 等于4$array1 等于”11”$array2 等于”22”$array3 等于”33” 其他還有另外一些特殊的函數(shù),如FileGetTime,WinList等等很多函數(shù),返回值都是數(shù)組的情況,具體用法可能有些差異,這些可以參考相關(guān)文檔。日期時(shí)間當(dāng)前日期時(shí)間,可以直接從日期和時(shí)間宏中獲取,如:SEC 當(dāng)前時(shí)鐘的秒值,值的范圍是 00 到 59MIN 當(dāng)前時(shí)鐘的分值,值的范圍是 00 到 59HOUR 當(dāng)前時(shí)鐘的時(shí)值(24
13、時(shí)制),值的范圍是 00 到 23MDAY 當(dāng)天屬本月的第幾天,值的范圍是 01 到 31MON 當(dāng)前月份,值的范圍是 01到 12YEAR 當(dāng)前年份(4位數(shù)) 計(jì)算指定日期間隔后的新日期:_DateAdd(“計(jì)算類型”, “間隔數(shù)”, “指定日期”)計(jì)算兩個(gè)指定日期的間隔:_DateDiff(“計(jì)算類型”, “計(jì)算的開始日期”, “計(jì)算的結(jié)束日期”)像素捕獲像素捕獲主要去獲取屏幕某塊區(qū)域像素點(diǎn)的色值,以此和給定的顏色色值來比較判斷是否一致。WinActivate(窗口標(biāo)題)$Handle = WinGetHandle(窗口標(biāo)題,)AutoItSetOption (PixelCoordMode
14、,2)$Color = PixelGetColor(X坐標(biāo),Y坐標(biāo),$Handle)$ColorStr = Hex($Color,6)在實(shí)際情況中,有時(shí)可能不止獲取一個(gè)點(diǎn)的像素就夠了,這時(shí)可以通過獲取窗口的相關(guān)WinGetPos(窗口標(biāo)題,)坐標(biāo)位置,然后對(duì)某個(gè)區(qū)塊進(jìn)行掃描。文件操作一般文件對(duì)于一般文本文件的讀?。嚎梢允褂肍ileOpen打開文件,在按照要求讀取文件內(nèi)容:$fHandle = FileOpen(文件, 0)if $fHandle -1 ThenWhile 1$line = FileReadLine($fHandle)If error = -1 Then ExitLoopWend
15、EndIfFileClose($fHandle)如果文件被獨(dú)占打開,進(jìn)行FileOpen操作時(shí)候,獲取不到文件操作句柄,無法對(duì)文件進(jìn)行讀寫操作,這時(shí),如果只是針對(duì)文件讀,可以將獨(dú)占打開的文件進(jìn)行一下復(fù)制,然后用拷貝文件進(jìn)行目標(biāo)操作。FileCopy(原文件, 目標(biāo)文件或路徑, 1)ini文件對(duì)于ini類型文件,形如:字段名關(guān)鍵字=數(shù)值文件中可以有多個(gè)不同的字段名,每個(gè)字段名下有多個(gè)關(guān)鍵字,不同字段名下的關(guān)鍵字可以相同。讀取ini文件:IniRead ( 文件名, 字段名, 關(guān)鍵字, 默認(rèn)值 )寫入ini文件:IniWrite ( 文件名, 字段名, 鍵名, 值 )刪除ini文件:IniDele
16、te ( 文件名, 字段名 , 關(guān)鍵字 )常用控件操作ListBox控件ListBox控件,如圖所示:在前面提到選擇控件,ListBox也是其中一種,前面介紹了如何選中的某行選項(xiàng),但是在真正的ListBox空間中,多半是記錄相關(guān)軟件運(yùn)行時(shí)的一些狀態(tài)參數(shù)記錄,需要做的只判斷其中打印的相關(guān)記錄:$hWnd = ControlGetHandle(窗口標(biāo)題,ListBox控件名)$count = _GUICtrlListBox_GetCount($hWnd)For $i=0 To $count-1$hLabel = _GUICtrlListBox_GetText($hWnd, $i)Next其中第一行
17、是獲取控件操作句柄,第二行根據(jù)句柄獲取控件的記錄條數(shù),最后根據(jù)記錄上遍歷,獲取每一條記錄。ListView控件ListView控件展示形如表格,如圖所示:其操作如下$rows = ControlListView(窗口標(biāo)題,ListView控件名,GetItemCount)For $i=0 To $rows-1$iText = ControlListView(窗口標(biāo)題,ListView控件名,GetText, $i, 列名序號(hào))Next上面代碼,我們首先獲取行數(shù),然后指定某列,獲取其所有行的文本。更多ListView操作可以參考ControlListView函數(shù)說明。運(yùn)行參數(shù)設(shè)置運(yùn)行參數(shù)設(shè)置可以
18、調(diào)整Autoit各種函數(shù)/參數(shù)的運(yùn)作方式,可以通過Opt或者AutoItSetOption函數(shù)來設(shè)置:AutoItSetOption ( 選項(xiàng) , 參數(shù) )如:Opt (PixelCoordMode,2)或AutoItSetOption (PixelCoordMode,2)常用的有:Opt (PixelCoordMode,2) ;設(shè)置用于象素函數(shù)的坐標(biāo)參照Opt (GUIEventOptions ,1) ;修改特殊的 GUI 函數(shù)的返回值類型Opt (MouseClickDelay,500) ;更改每個(gè)鼠標(biāo)點(diǎn)擊命令之間的延遲時(shí)間長度Opt (SendKeyDelay ,1000) ;更改發(fā)送鍵
19、擊命令之間的延遲時(shí)間長度Opt (TrayIconDebug ,1) ;在托盤圖標(biāo)上顯示當(dāng)前腳本執(zhí)行到的那一行的相關(guān)信息(工具提示)以助調(diào)試Opt (WinWaitDelay ,500) ;更改每次成功執(zhí)行窗口相關(guān)操作后的延遲時(shí)間長度更多運(yùn)行參數(shù)設(shè)置可以參考AutoItSetOption幫助文檔說明加密解密加密;$bEncrypted 為加密后字符串_Crypt_Startup()$hKey=_Crypt_DeriveKey(sop,$CALG_RC4)$bEncrypted =_Crypt_EncryptData(待加密字符,$hKey,$CALG_USERKEY)_Crypt_Destro
20、yKey($hKey)_Crypt_Shutdown()這里加密的是一個(gè)16進(jìn)制的字符串,其中加密匙可以自己設(shè)置,示例中為sop,其中加密算法為AutoIt內(nèi)置的$CALG_RC4,還可以為$CALG_RC2等等其他。解密;$ encrypt為解密后字符串$bData = Binary(“加密的字符”)$encrypt = BinaryToString(_Crypt_DecryptData($bData, sop, $CALG_RC4)很簡單的兩行,不過其中的解密匙和解密算法要跟之前的加密參數(shù)對(duì)應(yīng)。GUI操作GUI操作包括創(chuàng)建窗口面板,在面板上創(chuàng)建表單控件及其互動(dòng)事件處理等一系列連貫配置:$h
21、Wnd=GUICreate(加密,400,300,-1)$hInputEdit=GUICtrlCreateEdit(,0,0,400,150,$ES_WANTRETURN)$hOutputEdit=GUICtrlCreateEdit(,0,150,400,150,$ES_READONLY)GUIRegisterMsg($WM_COMMAND,WM_COMMAND)GUISetState(SW_SHOW)_Crypt_Startup()$hKey=_Crypt_DeriveKey(sop,$CALG_RC4)Do $msg=GUIGetMsg()Until $msg=$GUI_EVENT_clo
22、se_Crypt_DestroyKey($hKey)_Crypt_Shutdown()Func WM_COMMAND($hWinHandle,$iMsg,$wParam,$lParam) If _WinAPI_HiWord($wParam)=$EN_CHANGE And _WINAPI_LoWord($wParam)=$hInputEdit Then $bEncrypted=_Crypt_EncryptData(GUICtrlRead($hInputEdit),$hKey,$CALG_USERKEY) GUICtrlSetData($hOutputEdit,$bEncrypted) EndIf
23、EndFunc上面是一個(gè)簡單界面包裝,一旦界面檢測(cè)到$WM_COMMAND事件響應(yīng),即觸發(fā)自定義函數(shù)WM_COMMAND,窗口包括兩個(gè)簡單的文本編輯控件。我們還可以設(shè)置其他控件的事件處理:Opt(GUIOnEventMode, 1)$winTitle = 配置密碼$handle = GUICreate($winTitle,300,200)$btn = GUICtrlCreateButton(確定,15,60,50,25,$BS_CENTER)GUISetState (SW_SHOW,$handle)GUICtrlSetOnEvent($btn,GetPwd)Func GetPwd($hWinH
24、andle,$iMsg,$wParam,$lParam)EndFunc這里是針對(duì)按鈕設(shè)置了點(diǎn)擊觸發(fā)事件。IE操作IE操作,不像GUI界面一樣,通過AutoIt Window Info就能得到相關(guān)控件,進(jìn)而獲取控件句柄進(jìn)行操作。我們?cè)诓僮鱅E網(wǎng)頁時(shí)候,需要事先獲取HTML頁面中的相關(guān)Dom節(jié)點(diǎn)或元素,所以需要對(duì)HTML有一些了解。下面是一個(gè)簡單的例子:$oIE = _IECreate (,0,1,1,0)_IEPropertySet ($oIE, statustext,歡迎訪問)$oForm = _IEFormGetObjByName ($oIE, f) ; 查找表單名$oQuery1 = _I
25、EFormElementGetObjByName ($oForm, wd) ;查找表單控件_IEFormElementSetValue ($oQuery1, 賦值) ;給控件賦值_IEFormSubmit ($oForm,1) ;點(diǎn)擊提交表單請(qǐng)求實(shí)例是一個(gè)簡單操作,打開一個(gè)IE窗口,訪問百度,然后在搜索網(wǎng)頁表單,輸入一個(gè)要查詢的關(guān)鍵字,點(diǎn)擊百度搜索。一般網(wǎng)頁很多超鏈接,對(duì)于這些鏈接的頁面,都有很多的Dom節(jié)點(diǎn)嵌套,單純的以對(duì)象名稱不一定能夠獲取到某個(gè)操作的對(duì)象,這時(shí)需要從頂級(jí)Dom節(jié)點(diǎn),一級(jí)一級(jí)縮小范圍,直到獲取到最終操作對(duì)象節(jié)點(diǎn),如下所示:$oIE = _IECreate (,0,1,1,0
26、)$iFrame = _IEFrameGetObjByName ($oIE, iFrame)$oDiv = _IEGetObjById ($iFrame, divId)$ohrefArray = _IETagNameGetCollection ($oDiv,a)For $oLink In $ohrefArrayIf $oLink.href = then_IEAction($oLink,click)ExitLoopEndIfNext這里實(shí)例主要是從一個(gè)打開的瀏覽器窗口,獲取名為iFrame的frame頁面,然后獲取其中為Id為divId的節(jié)點(diǎn),進(jìn)而,取到divId節(jié)點(diǎn)下的所有超鏈接對(duì)象,最后一個(gè)
27、一個(gè)判斷,找到某個(gè)url,點(diǎn)擊超鏈接。自定義函數(shù)把一些常用而相關(guān)邏輯的操作,抽離出來,獨(dú)立成一個(gè)模塊,供腳本調(diào)用,這就需要涉及到自定義函數(shù)。用戶可通過使用 Func.EndFunc 語句來自定義函數(shù),函數(shù)中可以有Return返回值,也可以無,下面我們列出了一些常用的自定義函數(shù),供參考:#include #Include #include #Include #Include #Include #include #include ;獲取配置文件Func GetConfigFile()Return String(D:DigitalchinaAutoAgentscriptsConfigParamete
28、r.ini)EndFunc;根據(jù)給定的日期格式字符串轉(zhuǎn)換成當(dāng)前日期格式Func ReplaceDateStr($DateStr)SelectCase StringInStr($DateStr,YYYYMMDD)Return StringReplace($DateStr,YYYYMMDD,DateYYYY() & DateMM() & DateDD()Case StringInStr($DateStr,YYYY-MM-DD)Return StringReplace($DateStr,YYYY-MM-DD,DateYYYY() &-& DateMM() &-& DateDD()Case Strin
29、gInStr($DateStr,YYYY/MM/DD)Return StringReplace($DateStr,YYYY/MM/DD,DateYYYY() &/& DateMM() &/& DateDD()Case StringInStr($DateStr,ABCDD-YYYY);ABC代表英文的短月份格式,如1月=JanReturn StringReplace($DateStr,ABCDD-YYYY,_DateToMonth(MON,1) & DateDD() &-& DateYYYY()Case StringInStr($DateStr,MMDD)Return StringReplace
30、($DateStr,MMDD, DateMM() & DateDD()Case ElseReturn $DateStrEndSelectEndFunc;返回日期格式Func DateYYYY()Return String(YEAR)EndFuncFunc DateYY()Return StringRight(String(YEAR),2)EndFuncFunc DateMM()Return String(MON)EndFuncFunc DateDD()Return String(MDAY)EndFunc;寫日志,截屏等操作;$fileName 日志文件;$flag 操作標(biāo)識(shí) 1為成功,0為失敗
31、;$logTxt 寫入日志內(nèi)容,增加在行尾Func WriteLog($fileName,$flag,$logTxt);根據(jù)代理約定的相對(duì)目錄$File_dat= $fileName & .dat$File_do = $fileName & .do$File_jpg = $fileName & .jpg;截屏文件_ScreenCapture_Capture($File_jpg);如果截屏失敗,則啟動(dòng)畫板If FileExists($File_jpg) = 0 ThenSaveImage($File_jpg)EndIf;腳本執(zhí)行結(jié)果文件$file1=FileOpen($File_dat,2)Fi
32、leWriteLine($file1, $flag)FileWriteLine($file1,$logTxt)FileClose($file1);狀態(tài)文件$file2=FileOpen($File_do,2)FileWriteLine($file2,ok)FileClose($file2)EndFunc;啟動(dòng)畫圖程序,將全屏截圖保存為文件;$imgFile文件保存路徑Func SaveImage($imgFile)Send(PRINTSCREEN)$picProcess = mspaint.exe$pid = Run(mspaint.exe)$picWin = 未命名 - 畫圖$warnWin
33、 = 畫圖$saveWin = 保存為$imgFilePath = StringReplace(GetConfigFile(),scriptsConfigParameter.ini,$imgFile)If WinWait($picWin,10) ThenWinActivate($picWin)Send(v)If WinActivate($warnWin) Then ControlClick($warnWin,Button1)WinMenuSelectItem($picWin,文件,保存)If WinWait($saveWin,5) ThenWinActivate($saveWin)Contro
34、lSetText($saveWin,Edit1,$imgFilePath)ControlCommand($saveWin,ComboBox3,SelectString, JPEG (*.JPG;*.JPEG;*.JPE;*.JFIF)ControlClick($saveWin,Button2)If WinWait($saveWin,已存在,5) ThenControlClick($saveWin,已存在,Button1)EndIfEndIfWinWait($imgFile)If WinExists($imgFile) Then WinClose($imgFile)EndIfEndFunc;判斷
35、窗口;$win 窗口名稱;返回值 如果找存在返回1,否則返回0Func ChkProgram($win)Dim $ret$ret=-1If WinExists($win) Then$ret =1Else$ret =0EndIfReturn $retEndFunc;判斷程序進(jìn)程;$process 進(jìn)程名稱;返回值 如果找存在返回1,否則返回0Func ChkService($process)Dim $ret$ret=-1$flag = ProcessExists($process)If $flag=0 Then$ret =0Else$ret =1EndIfReturn $retEndFunc;根
36、據(jù)給定的字符串匹配ListBox控件中的數(shù)據(jù);$title 窗口標(biāo)題;$listBoxCmp ListBox控件;$matchStr 匹配字符串.如果字符串以&連接,則匹配所有,如果字符串以|連接則匹配部分;返回值 如果找到匹配的字符串返回1,否則返回0Func MatchListBox($title,$listBoxCmp,$matchStr)Dim $ret,$count$ret=0$num=0$flag=1WinActivate($title)If StringInStr($matchStr,|)0 Then$array = StringSplit($matchStr, |, 1)$fl
37、ag=0Else$array = StringSplit($matchStr, &, 1)EndIf$hWnd = ControlGetHandle($title,$listBoxCmp)$count = _GUICtrlListBox_GetCount($hWnd)For $i=0 To $count-1$hLabel = _GUICtrlListBox_GetText($hWnd, $i)If MatchStrArray($hLabel,$array) Then$num = $num + 1If $flag ThenIf $num = $array0 Then$ret=1ExitLoopE
38、ndIfElse$ret=1ExitLoopEndIfEndIfNextReturn $retEndFunc;匹配ListView控件字符串;$title 窗口標(biāo)題;$listViewCmp ListView控件;$cols 要查找的列,從0開始;$matchStr 匹配字符串;返回值 如果找到匹配的字符串返回1,否則返回0Func MatchListView($title,$listViewCmp,$cols,$matchStr)Dim $ret,$count,$rows$ret=0WinActivate($title)$rows = ControlListView($Title,$list
39、ViewCmp,GetItemCount)$count=0For $i=0 To $rows-1$iText = ControlListView($Title,$listViewCmp,GetText, $i, $cols)If StringInStr($iText,$matchStr)0 Then$count=$count+1EndIfNextIf $count=$rows Then $ret=1Return $retEndFunc;匹配日志文件字符串;$logFile 日志文件;$matchStr 匹配字符串.如果字符串以&連接,則匹配所有,如果字符串以|連接則匹配部分;返回值 如果找到匹
40、配的字符串返回1,否則返回0Func MatchLogFile($logFile,$matchStr)Dim $line,$array,$result,$count,$flag$result=0$count=0$flag=1If StringInStr($matchStr,|)0 Then$array = StringSplit($matchStr, |, 1)$flag=0Else$array = StringSplit($matchStr, &, 1)EndIf$file = FileOpen($logFile, 0)if $file = -1 ThenReturn -1EndIfWhil
41、e 1$line = FileReadLine($file)If error = -1 Then ExitLoopEndIfIf MatchStrArray($line,$array) Then$count = $count+1If $flag ThenIf $count=$array0 Then$result = 1ExitLoopEndIfElse$result = 1ExitLoopEndIfEndIfWendFileClose($file)Return $resultEndFunc;匹配子字符串是否存在;$str 目標(biāo)字符串;$arr 匹配字符串;返回值 如果找到匹配的字符串返回1,否
42、則返回0Func MatchStrArray($str,$arr)$flag = 0 For $i=1 To $arr0If StringInStr($str,$arr$i)0 Then$flag = 1ExitLoopEndIfNextReturn $flagEndFuncFunc DecryptPwd($encryptStr)$pwdStr = If $encryptStr Then$bEncrypted = Binary($encryptStr)$pwdStr = BinaryToString(_Crypt_DecryptData($bEncrypted, sop, $CALG_RC4)
43、EndIfReturn $pwdStrEndFunc上面實(shí)例函數(shù)用到了AutoIt內(nèi)部函數(shù)庫,通過#include 關(guān)鍵字包含了進(jìn)來。Windows鎖屏處理辦法鎖屏解釋:當(dāng)windows操作系統(tǒng)被鎖屏?xí)r,實(shí)際上是在所有窗口(包括隱藏的)的前面再新開了一個(gè)窗口,完全遮擋住先前的窗口,這樣大家就看不到了,autoit說這個(gè)窗口叫“Always on TOP”。被遮擋的窗口雖然看不到了,但是還在,只是變成了隱藏模式,找到他們,是可以執(zhí)行快捷方式命令的;但窗口界面操作是不行的,主要原因是沒法激活Send 和 ControlSend 命令Send 命令必須要在激活窗口的條件下才能正確執(zhí)行ControlS
44、end命令可以不需要激活窗口就能執(zhí)行附錄實(shí)例介紹,相關(guān)說明請(qǐng)參考代碼中的注釋:;導(dǎo)入需要用到的外部參數(shù)#include #include ;定義變量Dim $yyyymd1,$yyyymd2,$yyyymd3,$flag,$ret給變量賦值$flag = 0$ret = 0;從ini文件中,獲取相關(guān)配置數(shù)據(jù)$programPath = IniRead(GetConfigFile(),HQZR,programPath,)$showDataFile = IniRead(GetConfigFile(),HQZR,showDataFile,)$hqDataFile = IniRead(GetConfi
45、gFile(),HQZR,hqDataFile,)$xxDataFile = IniRead(GetConfigFile(),HQZR,xxDataFile,);調(diào)用JudgeTime函數(shù);如果當(dāng)前時(shí)間不到9:20 則暫停10秒后繼續(xù)判斷,直到9:20While JudgeTime()=0920 Then$ret = 1EndIfReturn $retEndFunc二、運(yùn)行程序或打開文件1、運(yùn)行程序Run t命令或者函數(shù)用來運(yùn)行外部可執(zhí)行文件,AHK還可利用它來直接打開文件。AHK:Run, 目標(biāo)文件 , 工作目錄, Max|Min|Hide|UseErrorLevel, 輸出PID變量AU3
46、:Run ( 文件名 , 工作目錄 , 標(biāo)志 )【示例 2.1.1 】AHK:Run, Notepad.exeAU3:Run(Notepad.exe)上面的示例中都沒有給出程序“Notepad.exe”的路徑,為什么仍能執(zhí)行?這是因?yàn)樗鼈兌紩?huì)自動(dòng)在腳本所在目錄下搜尋目標(biāo)文件,如有則運(yùn)行,否則就到系統(tǒng)文件夾(%PATH%)中搜尋。注意:A)某些程序必須給定“工作目錄”才能成功運(yùn)行!B)給出完整的文件路徑有助于輕微提高程序的可靠性。C)AHK的Run命令可以用來運(yùn)行程序和直接打開文件,而AU3的Run函數(shù)則只能用來運(yùn)行程序(可執(zhí)行文件)或傳遞參數(shù)讓某個(gè)程序打開目標(biāo)文件。當(dāng)然,運(yùn)行程序的功能還不僅僅
47、是這么簡單,我們還可以指定運(yùn)行程序的初始狀態(tài),比如讓運(yùn)行的記事本窗口以最大化狀態(tài)顯示(或者最小化、隱藏):【示例 2.1.2 】AHK:Run, Notepad.exe, , MaxAU3:Run(Notepad.exe, , SW_MAXIMIZE)2、打開文件前面已經(jīng)提到,AHK的Run命令可以直接打開文件,而AU3的Run函數(shù)則只能用來運(yùn)行程序,因此在打開文件的方式上有點(diǎn)不同:AHK腳本中可直接給出目標(biāo)文件,而AHK將自動(dòng)運(yùn)行該文件的關(guān)聯(lián)程序來打開它;而AU3則必須由用戶自己傳遞參數(shù)讓某個(gè)程序打開目標(biāo)文件。【示例 2.2.1 】AHK:Run, MyFile.txtRun, Notepa
48、d.exe MyFile.txtAU3:Run(Notepad.exe MyFile.txt)3、以命令行形式運(yùn)行程序可以考慮運(yùn)行系統(tǒng)的命令行解釋器(cmd.exe/),然后指定要執(zhí)行的命令并傳遞參數(shù)。假設(shè)我們要執(zhí)行命令“dir C:WINDOWSsystem 32” ,用以列出指定目錄的所有文件及子目錄?!臼纠?2.3.1 】AHK:Run, %ComSpec% /k dir C:WINDOWSsystem32AU3:Run(ComSpec & /k dir C:WINDOWSsystem32)注意:A)ComSpec是腳本內(nèi)建的用以指示命令行解釋器位置的變量或宏。B)/k 參數(shù)表示“執(zhí)行字
49、符串指定的命令但保留”,若改為 /c 則表示“執(zhí)行字符串指定的命令然后終斷”。對(duì)此比較直觀的解釋是 /k 將在執(zhí)行完命令后保留命令提示窗口,而 /c 則將在執(zhí)行完命令之后關(guān)閉命令提示窗口。C)符號(hào)“&”是AU3定義的字符串連接符。4、特殊應(yīng)用A)打開網(wǎng)頁【示例 2.4.1 】AHK:Run, Run, %A_ProgramFiles%Internet ExplorerIEXPLORE.EXE AU3:Run(ProgramFilesDir & Internet ExplorerIEXPLORE.EXE )B)打開特殊文件夾系統(tǒng)的某些特殊文件夾被定義了相應(yīng)的CLSID(請(qǐng)查看幫助文檔),我們可利
50、用它來打開相應(yīng)的文件夾,比如打開回收站:【示例 2.4.2 】AHK:Run :645ff040-5081-101b -9f 08-00aa 002f 954eAU3:不適用!C)運(yùn)行控制面板工具微軟已經(jīng)為我們提供了通過命令行打開控制面板某個(gè)工具或項(xiàng)目的方式,比如打開系統(tǒng)屬性窗口:【示例 2.4.3 】AHK:Run control sysdm.cplAU3:Run(control sysdm.cpl)關(guān)于訪問控制面板項(xiàng)目的詳細(xì)介紹請(qǐng)查看此文:文章地址。D)指定搜索位置并打開搜索窗口假設(shè)我們要打開一個(gè)搜索窗口,而且要指定搜索位置,比如C::【示例 2.4.4 】AHK:Run, find C:
51、AU3:不適用!E)顯示指定文件的屬性窗口假設(shè)我們要打開文件“MyFile.txt”的屬性窗口,則使用關(guān)鍵字properties 然后接上目標(biāo)文件即可:【示例 2.4.5 】AHK:Run, properties MyFile.txtAU3:不適用!注意:AHK在退出前將自動(dòng)關(guān)閉打開的屬性窗口!F)用“資源管理器”打開指定文件夾我們知道使用Run, explorer C: 或Run(explorer C:) 即可打開指定的文件夾,可是有時(shí)候我們需要在資源管理器中打開它,這時(shí)可使用關(guān)鍵字 explore:【示例 2.4.6 】AHK:Run, explore C:AU3:run(explorer
52、.exe /e,C:)G)打印指定文件要打印指定文件,可使用關(guān)鍵字 print:【示例 2.4.7 】AHK:Run, print MyFile.txtAU3:不適用!F)用“資源管理器”打開指定文件夾我們知道使用Run, explorer C: 或Run(explorer C:) 即可打開指定的文件夾,可是有時(shí)候我們需要在資源管理器中打開它,這時(shí)可使用關(guān)鍵字 explore:【示例 2.4.6 】AHK:Run, explore C:AU3:不適用!run(explorer.exe /e,d:)這樣就可以做到你說的打開樹狀文件了注意:窗口標(biāo)題和窗口文本參數(shù)總是對(duì)大小寫敏感的。1、等待窗口系列
53、命令/函數(shù)AHK和AU3都提供了用法類似的一組窗口等待命令/函數(shù):WinWait/WinWaitActive/WinWaitClose。它們分別用于等待窗口出現(xiàn)、等待窗口被激活、等待窗口被關(guān)閉。由于這些命令/函數(shù)的參數(shù)類似,現(xiàn)僅以WinWait為例說明。AHK:WinWait , 窗口標(biāo)題, 窗口文本, 超時(shí)時(shí)間, 排除標(biāo)題, 排除文本AU3:WinWait ( 窗口標(biāo)題 , 窗口文本 , 超時(shí)時(shí)間 )WinWait 的作用是在目標(biāo)窗口出現(xiàn)之前不再執(zhí)行后面的所有語句。假設(shè)我們要運(yùn)行記事本程序,并在其窗口出現(xiàn)時(shí)提示用戶:【示例 3.1.1 】AHK:Run NotepadWinWait, 無標(biāo)題
54、 - 記事本MsgBox 記事本窗口已被打開!AU3:Run(Notepad)WinWait(無標(biāo)題 - 記事本)MsgBox(0, , 記事本窗口已被打開!)2、激活窗口相關(guān)命令/函數(shù)讓目標(biāo)窗口成為活動(dòng)窗口的辦法就是激活它,可用的命令/函數(shù)是WinActivate:AHK:WinActivate ,窗口標(biāo)題, 窗口文本, 排除標(biāo)題, 排除文本AU3:WinActivate ( 窗口標(biāo)題 , 窗口文本 )3、關(guān)閉窗口關(guān)閉窗口有兩種方式,一種是正常的關(guān)閉窗口(WinClose),另一種則是強(qiáng)行關(guān)閉窗口(WinKill):AHK:WinClose/WinKill ,窗口標(biāo)題, 窗口文本, 超時(shí)時(shí)間
55、, 排除標(biāo)題, 排除文本AU3:WinClose/WinKill ( 窗口標(biāo)題 , 窗口文本 )現(xiàn)在我們已經(jīng)可以實(shí)現(xiàn)一個(gè)比較簡單的功能了,比如我們可以打開系統(tǒng)屬性窗口并等待其出現(xiàn),窗口出現(xiàn)后激活它,接著等待3秒再關(guān)閉它:【示例 3.1.2 】AHK:Run, Sysdm.cplWinWait, 系統(tǒng)屬性WinActivate, 系統(tǒng)屬性WinWaitActive, 系統(tǒng)屬性Sleep, 3000WinClose, 系統(tǒng)屬性WinWaitClose, 系統(tǒng)屬性AU3:Run(Control Sysdm.cpl)WinWait(系統(tǒng)屬性)WinActivate(系統(tǒng)屬性)WinWaitActive
56、(系統(tǒng)屬性)Sleep(3000)WinClose(系統(tǒng)屬性)WinWaitClose(系統(tǒng)屬性)建議:如果程序中頻繁地出現(xiàn)要用到這些窗口標(biāo)題的地方,會(huì)帶來一個(gè)問題:腳本的可讀性,也許你會(huì)想,這不是很直觀嗎?可問題是如果這個(gè)重復(fù)出現(xiàn)的窗口標(biāo)題是個(gè)很長的字符串呢?這將嚴(yán)重影響整個(gè)代碼的排版美觀。而且我們也無從了解這些窗口標(biāo)題的“來頭”,不知道這個(gè)窗口標(biāo)題究竟是怎么來的。而如果我們定義一個(gè)變量(假設(shè)變量名是“AppWindow1”)保存這個(gè)窗口標(biāo)題,我們就能在命令/函數(shù)中用變量來表示它,這樣就達(dá)到了讓代碼用意更清晰一點(diǎn)的目的。另外,就算目標(biāo)軟件因某些原因(比如升級(jí))而改變了它的窗口標(biāo)題,我們也能很
57、方便地作出修改。4、更準(zhǔn)確的標(biāo)識(shí)窗口的方法(主要針對(duì)AHK腳本)程序在運(yùn)行時(shí)起碼會(huì)有一個(gè)進(jìn)程,如果能獲得這個(gè)進(jìn)程ID就能在一定程度上保證對(duì)窗口的準(zhǔn)確標(biāo)識(shí)。另外,每個(gè)窗口都有定義窗口類名(Class,比如說記事本窗口的類名就是Notepad),所以我們可以以此排除與目標(biāo)窗口不同的其它窗口類。其實(shí),我們還有一個(gè)更準(zhǔn)確的方法:每個(gè)窗口(包括控件在內(nèi))都被Windows指派了一個(gè)可區(qū)別于其它窗口的唯一的標(biāo)識(shí)符(ID),我們稱之為窗口句柄(HWND)。直接給定窗口標(biāo)題來表示窗口的一個(gè)缺點(diǎn)就是無法保證在腳本運(yùn)行的過程中始終以該窗口為操作目標(biāo),因?yàn)樵谶@個(gè)過程中很有可能會(huì)有其它“同名”窗口(或者說滿足匹配條件
58、的窗口)出現(xiàn),而如果我們使用這個(gè)標(biāo)識(shí)符來表示窗口自然就能保證命令/函數(shù)的操作窗口總是同一個(gè)窗口了。我們先來了解一下獲得窗口句柄的命令/函數(shù):AHK:WinGet, 輸出變量, ID, 窗口標(biāo)題, 窗口文本, 排除標(biāo)題, 排除文本AU3:WinGetHandle ( 窗口標(biāo)題 , 窗口文本 )其中WinGet獲得的窗口ID將通過“輸出變量”返回,而WinGetHandle的返回值就是獲得的窗口ID。我們?cè)谶M(jìn)行自動(dòng)化操作時(shí)是要先運(yùn)行某個(gè)程序,如何獲得這個(gè)程序成功運(yùn)行后顯示的窗口句柄?一個(gè)比較保險(xiǎn)的辦法是先獲得這個(gè)程序的進(jìn)程ID,然后根據(jù)這個(gè)進(jìn)程ID獲得它的窗口句柄,AHK支持使用進(jìn)程ID作為窗口標(biāo)
59、題使用;但AU3不支持這樣使用,只能先獲得該窗口的類名再根據(jù)該類名來獲得窗口句柄(不夠保險(xiǎn)):【示例 3.1.3 】AHK:Run, NotePad, , , ThisPIDWinWait, ahk_pid %ThisPID%;這里的ahk_pid表明跟在后面的變量是進(jìn)程IDWinGet, ThisID, ID, ahk_pid %ThisPID%;ThisID將保存獲得的窗口句柄AU3:Opt(WinTitleMatchMode, 4)Run(Notepad)$handle = WinGetHandle(classname=Notepad)現(xiàn)在暫且先忘記了AU3吧,因?yàn)樗拇翱诤瘮?shù)一般都不支
60、持使用窗口句柄作為(窗口標(biāo)題)參數(shù)。至于如何在AHK中使用窗口句柄,簡單的說,凡是有“窗口標(biāo)題”參數(shù)的命令就可以用窗口句柄來代替,比如:【示例 3.1.4 】AHK:Run, Notepad, , , ThisPID;先獲得運(yùn)行的記事本程序的進(jìn)程IDWinWait, 無標(biāo)題 - 記事本 ahk_pid %ThisPID%;等待該進(jìn)程窗口的出現(xiàn)WinGet, ThisHWND, ID, 無標(biāo)題 - 記事本 ahk_pid %ThisPID%;獲得窗口句柄WinActivate, ahk_id %ThisHWND%;這里的ahk_id表明跟在后面的變量是窗口句柄WinWaitActive, ahk
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 手術(shù)室感染管理制度及職責(zé)
- 婦產(chǎn)科門診護(hù)士崗位職責(zé)
- 2025小學(xué)數(shù)學(xué)教材使用教學(xué)計(jì)劃
- 教育管理干部教師培訓(xùn)心得體會(huì)
- 信息技術(shù)教研組實(shí)訓(xùn)基地建設(shè)計(jì)劃
- 醫(yī)院檢驗(yàn)科實(shí)驗(yàn)室安全管理制度和流程
- 學(xué)校食堂員工崗位職責(zé)一覽
- 學(xué)校食堂安全檢查三防措施
- 邊坡錨索施工專項(xiàng)進(jìn)度計(jì)劃
- 學(xué)校社團(tuán)活動(dòng)統(tǒng)計(jì)業(yè)務(wù)工作流程
- 支架植入知情同意書模板
- 茶文化講座優(yōu)選ppt資料
- 綠化工程施工技術(shù)方案及措施(可編輯)
- 會(huì)計(jì)知識(shí)競賽題庫附答案2021
- 廠房鋼筋混凝土地坪板工程施工方案
- 項(xiàng)目延期申請(qǐng)表(樣本)
- AS9100D體系標(biāo)準(zhǔn)中文版
- 固井工藝技術(shù)培訓(xùn)教學(xué)課件(77p)
- 入團(tuán)志愿書(2016版本)(可編輯打印標(biāo)準(zhǔn)A4) (1)
- 《復(fù)分解反應(yīng)》教學(xué)設(shè)計(jì)
- 盤扣式腳手架模板與支撐架專項(xiàng)施工方案
評(píng)論
0/150
提交評(píng)論