autoit快速開發(fā)指南_第1頁
autoit快速開發(fā)指南_第2頁
autoit快速開發(fā)指南_第3頁
autoit快速開發(fā)指南_第4頁
autoit快速開發(fā)指南_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Autoit快速開發(fā)指南2012年9月6日Autoit開發(fā)指南啟動程序啟動exe類型文件,一般使用Run函數(shù)Run(“路徑”)如:Run(“D:JavaMyEclipse 6eclipseeclipse.exe”)如果運行該函數(shù),程序還沒有啟動起來,請配置好程序運行的工作目錄Run(“路徑”,”工作目錄”)如:Run(“D:JavaMyEclipse 6eclipseeclipse.exe”,” D:JavaMyEclipse 6eclipse”)注:有時程序的目錄不一定和工作目錄相同啟動lnk,txt等文件一般使用ShellExecute函數(shù)該函數(shù)除了可以指定工作目錄外,還可以設(shè)置啟動參數(shù)1

2、.窗口操作窗口處理一般都是針對Windows GUI窗口的操作,常用的如下:;窗口是否存在WinExists( 窗口標題 , 窗口文本 ) ;激活窗口WinActivate( 窗口標題 , 窗口文本 );等待某個窗口WinWait(窗口標題 , 窗口文本 , 超時時間 );關(guān)閉指定窗口WinClose ( 窗口標題 , 窗口文本 );獲取窗口句柄WinGetHandle ( 窗口標題 , 窗口文本 );獲取窗口標題WinGetTitle ( 窗口標題 , 窗口文本 );獲取窗口進程WinGetProcess ( 窗口標題 , 窗口文本 )還有其他一些處理函數(shù),這個可以直接去查找AutoIt的幫

3、助文檔。下面是一個例子,一般在很多地方用到,特別是程序啟動或者運行到某個步驟,等待其他窗口處理,一般采用以下腳本判斷WinWait(“窗口標題”, 窗口文本, ”等待時間”)If WinExists(“窗口標題”) ThenWinActivate(“窗口標題”)EndIf不建議使用WinWaitActive(“窗口標題”,窗口文本,”等待時間”),否則,如果該窗口處于非激活狀態(tài),會使腳本一直等待直到超時,按照非預(yù)設(shè)的流程解析運行下去,得不到預(yù)期結(jié)果。1.菜單操作菜單點擊使用WinMenuSelectItem函數(shù)WinMenuSelectItem(“窗口標題”, ”主菜單” , ”子菜單1”,

4、”子菜單2” )例如點擊窗口菜單的文件=保存WinMenuSelectItem(“未命名 畫圖”, ”文件” , ” 保存”)當該函數(shù)無法操作菜單時候(一般為非標準的Windows GUI),可以在工具欄查找該菜單的快捷啟動按鈕或者通過發(fā)送快捷鍵進行控制3.工具欄操作對于工具欄快速按鈕,可以使用ControlCommand函數(shù)處理,菜單操作中很多快捷方式一般都放在工具欄中,這種情況可以多一個選擇。ControlCommand(“窗口標題”, 窗口文本, ”工具欄控件名” , SendCommandID, ”控件ID”)ControlCommand只能操作ToolbarWindow32類型的控件

5、。控件ID需要通過Windows Info工具獲取。文本框在文本框輸入數(shù)據(jù)使用:ControlSetText(“標題”,”控件名或ID” ,”輸入的字符串數(shù)據(jù)”)如果需要獲取文本框的數(shù)據(jù),則使用ControlGetText(“標題”,”控件名或ID”)ControlSetText和ControlGetText可以操作單行文本框,密碼輸入框,多行文本框等。 選擇控件選擇控件使用ControlCommand函數(shù)操作,可以操作單選多選以及單行多行下拉選擇(ComboBox和ListBox)等控件。如選擇下拉框的某個選項:ControlCommand(“窗口標題”, , 控件類名或ID , Selec

6、tString, 選中選項文本)而針對Radio,CheckBox等選擇類型的控件ControlCommand(“窗口標題”, ,控件類名或ID ,check, ”)而對于ListBox類型的選擇框,則需要通過一系列組合來操作選項,如下面是獲取所有選項數(shù)據(jù)的例子:WinActivate(“窗口標題”)$hWnd = ControlGetHandle(“窗口標題”, , “控件ID”)$count = _GUICtrlListBox_GetCount($hWnd)For $i=0 To $count-1$hLabel = _GUICtrlListBox_GetText($hWnd, $i)Nex

7、t點擊操作 控件點擊控件點擊一般使用:ControlClick(窗口標題,控件名或ID,按鈕,點擊次數(shù))按鈕分左鍵(left),右鍵(right)等此外還可以在函數(shù)后面添加坐標,這對于占用屏幕區(qū)域比較大的時候,精確點擊某個位置觸發(fā)其他操作比較重要比如在一個表格中,需要右擊某一行記錄,彈出右鍵菜單的情況。鼠標點擊MouseClick(“按鈕”, “X坐標”,”Y坐標”,”點擊次數(shù)”)MouseClick函數(shù)對于任何點擊操作都有效,唯一不理想的是,它涉及坐標點的確定,降低了程序的通用性。如果非要這么做,建議:將當前窗口激活,并最大化WinActivate(窗口標題, )WinSetState(窗口

8、標題, , SW_MAXIMIZE);接下來進行鼠標點擊相關(guān)操作如果當前窗口禁用最大化,則使用當前窗口相對坐標進行操作AutoItSetOption ( MouseCoordMode , 1) ;這里指相對當前激活窗口的坐標WinActivate(窗口標題, );接下來進行鼠標點擊相關(guān)操作鍵盤操作鍵盤操作一般使用Send函數(shù),想激活窗口發(fā)送模擬鍵盤操作 一般字符這種情況指向當前激活窗口文本框,發(fā)送按鍵字符,如:Send(向光標激活地方發(fā)送的字符串)快捷操作這種情況一般沒有光標的輸入,只是針對當前的激活窗口的一些快捷操作,比如按鍵”ctrl+S”是保存等,如Send(s)另外一些快捷鍵如:Ctr

9、l=Alt=!Win=#Shift=+其他如:Send(“ PRINTSCREEN”) 截屏鍵Send(“ SPACE”) 空格鍵Send(“ ENTER”) 回車鍵Send(“ BACKSPACE”) 退格鍵字符串處理針對字符串的處理,一般常需要判斷字符串是否存在,或?qū)ψ址M行拆分、替換等,下面用一個例子來說明一下:一個用&連接的子字符串,需要跟某段文字進行匹配,如果發(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ù)組這個跟其他程序語言無太大的差別,如下所示:Dim $array2$array0=1$array1=2注意下標從0開始特殊數(shù)組特殊數(shù)組指某些函數(shù)的返回值為數(shù)組的情況,或是在運行腳本時候,傳遞給命令行的參數(shù),AutoIT會初始化一個特殊的數(shù)組,這些數(shù)組下標也是從0開始,但是為0的項保存的是數(shù)組的個數(shù)

11、。命令行返回數(shù)組對于腳本參數(shù)數(shù)組為$CmdLine,可以直接使用$CmdLine0 ;參數(shù)的數(shù)量$CmdLine1 ;第一個參數(shù) (腳本名稱后面)$CmdLine2 ;第二個參數(shù).$CmdLine$CmdLine0 ;可以用來表示得到最后一個參數(shù).如果腳本是像下面這樣被運行的話:AutoIt3.exe myscript.au3 參數(shù)1 這是 一個其它參數(shù)$CmdLine0 等價于. 2$CmdLine1 等價于. 參數(shù)1$CmdLine2 等價于. 這是一個其它參數(shù)ScriptName 等價于. myscript.au3函數(shù)返回數(shù)組前面用到的StringSplit函數(shù)返回值也是一個數(shù)組,0位保

12、存的是數(shù)組項的個數(shù),數(shù)組內(nèi)卻是從1開始計數(shù)$matchStr=11&22&33$array = StringSplit($matchStr, &, 1)如上:$array0 等于4$array1 等于”11”$array2 等于”22”$array3 等于”33” 其他還有另外一些特殊的函數(shù),如FileGetTime,WinList等等很多函數(shù),返回值都是數(shù)組的情況,具體用法可能有些差異,這些可以參考相關(guān)文檔。日期時間當前日期時間,可以直接從日期和時間宏中獲取,如:SEC 當前時鐘的秒值,值的范圍是 00 到 59MIN 當前時鐘的分值,值的范圍是 00 到 59HOUR 當前時鐘的時值(24

13、時制),值的范圍是 00 到 23MDAY 當天屬本月的第幾天,值的范圍是 01 到 31MON 當前月份,值的范圍是 01到 12YEAR 當前年份(4位數(shù)) 計算指定日期間隔后的新日期:_DateAdd(“計算類型”, “間隔數(shù)”, “指定日期”)計算兩個指定日期的間隔:_DateDiff(“計算類型”, “計算的開始日期”, “計算的結(jié)束日期”)像素捕獲像素捕獲主要去獲取屏幕某塊區(qū)域像素點的色值,以此和給定的顏色色值來比較判斷是否一致。WinActivate(窗口標題)$Handle = WinGetHandle(窗口標題,)AutoItSetOption (PixelCoordMode

14、,2)$Color = PixelGetColor(X坐標,Y坐標,$Handle)$ColorStr = Hex($Color,6)在實際情況中,有時可能不止獲取一個點的像素就夠了,這時可以通過獲取窗口的相關(guān)WinGetPos(窗口標題,)坐標位置,然后對某個區(qū)塊進行掃描。文件操作一般文件對于一般文本文件的讀?。嚎梢允褂肍ileOpen打開文件,在按照要求讀取文件內(nèi)容:$fHandle = FileOpen(文件, 0)if $fHandle -1 ThenWhile 1$line = FileReadLine($fHandle)If error = -1 Then ExitLoopWend

15、EndIfFileClose($fHandle)如果文件被獨占打開,進行FileOpen操作時候,獲取不到文件操作句柄,無法對文件進行讀寫操作,這時,如果只是針對文件讀,可以將獨占打開的文件進行一下復(fù)制,然后用拷貝文件進行目標操作。FileCopy(原文件, 目標文件或路徑, 1)ini文件對于ini類型文件,形如:字段名關(guān)鍵字=數(shù)值文件中可以有多個不同的字段名,每個字段名下有多個關(guān)鍵字,不同字段名下的關(guān)鍵字可以相同。讀取ini文件:IniRead ( 文件名, 字段名, 關(guān)鍵字, 默認值 )寫入ini文件:IniWrite ( 文件名, 字段名, 鍵名, 值 )刪除ini文件:IniDele

16、te ( 文件名, 字段名 , 關(guān)鍵字 )常用控件操作ListBox控件ListBox控件,如圖所示:在前面提到選擇控件,ListBox也是其中一種,前面介紹了如何選中的某行選項,但是在真正的ListBox空間中,多半是記錄相關(guān)軟件運行時的一些狀態(tài)參數(shù)記錄,需要做的只判斷其中打印的相關(guān)記錄:$hWnd = ControlGetHandle(窗口標題,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(窗口標題,ListView控件名,GetItemCount)For $i=0 To $rows-1$iText = ControlListView(窗口標題,ListView控件名,GetText, $i, 列名序號)Next上面代碼,我們首先獲取行數(shù),然后指定某列,獲取其所有行的文本。更多ListView操作可以參考ControlListView函數(shù)說明。運行參數(shù)設(shè)置運行參數(shù)設(shè)置可以

18、調(diào)整Autoit各種函數(shù)/參數(shù)的運作方式,可以通過Opt或者AutoItSetOption函數(shù)來設(shè)置:AutoItSetOption ( 選項 , 參數(shù) )如:Opt (PixelCoordMode,2)或AutoItSetOption (PixelCoordMode,2)常用的有:Opt (PixelCoordMode,2) ;設(shè)置用于象素函數(shù)的坐標參照Opt (GUIEventOptions ,1) ;修改特殊的 GUI 函數(shù)的返回值類型Opt (MouseClickDelay,500) ;更改每個鼠標點擊命令之間的延遲時間長度Opt (SendKeyDelay ,1000) ;更改發(fā)送鍵

19、擊命令之間的延遲時間長度Opt (TrayIconDebug ,1) ;在托盤圖標上顯示當前腳本執(zhí)行到的那一行的相關(guān)信息(工具提示)以助調(diào)試Opt (WinWaitDelay ,500) ;更改每次成功執(zhí)行窗口相關(guā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()這里加密的是一個16進制的字符串,其中加密匙可以自己設(shè)置,示例中為sop,其中加密算法為AutoIt內(nèi)置的$CALG_RC4,還可以為$CALG_RC2等等其他。解密;$ encrypt為解密后字符串$bData = Binary(“加密的字符”)$encrypt = BinaryToString(_Crypt_DecryptData($bData, sop, $CALG_RC4)很簡單的兩行,不過其中的解密匙和解密算法要跟之前的加密參數(shù)對應(yīng)。GUI操作GUI操作包括創(chuàng)建窗口面板,在面板上創(chuà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上面是一個簡單界面包裝,一旦界面檢測到$WM_COMMAND事件響應(yīng),即觸發(fā)自定義函數(shù)WM_COMMAND,窗口包括兩個簡單的文本編輯控件。我們還可以設(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這里是針對按鈕設(shè)置了點擊觸發(fā)事件。IE操作IE操作,不像GUI界面一樣,通過AutoIt Window Info就能得到相關(guān)控件,進而獲取控件句柄進行操作。我們在操作IE網(wǎng)頁時候,需要事先獲取HTML頁面中的相關(guān)Dom節(jié)點或元素,所以需要對HTML有一些了解。下面是一個簡單的例子:$oIE = _IECreate (,0,1,1,0)_IEPropertySet ($oIE, statustext,歡迎訪問)$oForm = _IEFormGetObjByName ($oIE, f) ; 查找表單名$oQuery1 = _I

25、EFormElementGetObjByName ($oForm, wd) ;查找表單控件_IEFormElementSetValue ($oQuery1, 賦值) ;給控件賦值_IEFormSubmit ($oForm,1) ;點擊提交表單請求實例是一個簡單操作,打開一個IE窗口,訪問百度,然后在搜索網(wǎng)頁表單,輸入一個要查詢的關(guān)鍵字,點擊百度搜索。一般網(wǎng)頁很多超鏈接,對于這些鏈接的頁面,都有很多的Dom節(jié)點嵌套,單純的以對象名稱不一定能夠獲取到某個操作的對象,這時需要從頂級Dom節(jié)點,一級一級縮小范圍,直到獲取到最終操作對象節(jié)點,如下所示:$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這里實例主要是從一個打開的瀏覽器窗口,獲取名為iFrame的frame頁面,然后獲取其中為Id為divId的節(jié)點,進而,取到divId節(jié)點下的所有超鏈接對象,最后一個

27、一個判斷,找到某個url,點擊超鏈接。自定義函數(shù)把一些常用而相關(guān)邏輯的操作,抽離出來,獨立成一個模塊,供腳本調(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)換成當前日期格式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 操作標識 1為成功,0為失敗

31、;$logTxt 寫入日志內(nèi)容,增加在行尾Func WriteLog($fileName,$flag,$logTxt);根據(jù)代理約定的相對目錄$File_dat= $fileName & .dat$File_do = $fileName & .do$File_jpg = $fileName & .jpg;截屏文件_ScreenCapture_Capture($File_jpg);如果截屏失敗,則啟動畫板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;啟動畫圖程序,將全屏截圖保存為文件;$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;判斷程序進程;$process 進程名稱;返回值 如果找存在返回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 窗口標題;$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 窗口標題;$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 目標字符串;$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ù)用到了AutoIt內(nèi)部函數(shù)庫,通過#include 關(guān)鍵字包含了進來。Windows鎖屏處理辦法鎖屏解釋:當windows操作系統(tǒng)被鎖屏?xí)r,實際上是在所有窗口(包括隱藏的)的前面再新開了一個窗口,完全遮擋住先前的窗口,這樣大家就看不到了,autoit說這個窗口叫“Always on TOP”。被遮擋的窗口雖然看不到了,但是還在,只是變成了隱藏模式,找到他們,是可以執(zhí)行快捷方式命令的;但窗口界面操作是不行的,主要原因是沒法激活Send 和 ControlSend 命令Send 命令必須要在激活窗口的條件下才能正確執(zhí)行ControlS

44、end命令可以不需要激活窗口就能執(zhí)行附錄實例介紹,相關(guān)說明請參考代碼中的注釋:;導(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ù);如果當前時間不到9:20 則暫停10秒后繼續(xù)判斷,直到9:20While JudgeTime()=0920 Then$ret = 1EndIfReturn $retEndFunc二、運行程序或打開文件1、運行程序Run t命令或者函數(shù)用來運行外部可執(zhí)行文件,AHK還可利用它來直接打開文件。AHK:Run, 目標文件 , 工作目錄, Max|Min|Hide|UseErrorLevel, 輸出PID變量AU3

46、:Run ( 文件名 , 工作目錄 , 標志 )【示例 2.1.1 】AHK:Run, Notepad.exeAU3:Run(Notepad.exe)上面的示例中都沒有給出程序“Notepad.exe”的路徑,為什么仍能執(zhí)行?這是因為它們都會自動在腳本所在目錄下搜尋目標文件,如有則運行,否則就到系統(tǒng)文件夾(%PATH%)中搜尋。注意:A)某些程序必須給定“工作目錄”才能成功運行!B)給出完整的文件路徑有助于輕微提高程序的可靠性。C)AHK的Run命令可以用來運行程序和直接打開文件,而AU3的Run函數(shù)則只能用來運行程序(可執(zhí)行文件)或傳遞參數(shù)讓某個程序打開目標文件。當然,運行程序的功能還不僅僅

47、是這么簡單,我們還可以指定運行程序的初始狀態(tài),比如讓運行的記事本窗口以最大化狀態(tài)顯示(或者最小化、隱藏):【示例 2.1.2 】AHK:Run, Notepad.exe, , MaxAU3:Run(Notepad.exe, , SW_MAXIMIZE)2、打開文件前面已經(jīng)提到,AHK的Run命令可以直接打開文件,而AU3的Run函數(shù)則只能用來運行程序,因此在打開文件的方式上有點不同:AHK腳本中可直接給出目標文件,而AHK將自動運行該文件的關(guān)聯(lián)程序來打開它;而AU3則必須由用戶自己傳遞參數(shù)讓某個程序打開目標文件?!臼纠?2.2.1 】AHK:Run, MyFile.txtRun, Notepa

48、d.exe MyFile.txtAU3:Run(Notepad.exe MyFile.txt)3、以命令行形式運行程序可以考慮運行系統(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í)行字符串指定的命令然后終斷”。對此比較直觀的解釋是 /k 將在執(zhí)行完命令后保留命令提示窗口,而 /c 則將在執(zhí)行完命令之后關(guān)閉命令提示窗口。C)符號“&”是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(請查看幫助文檔),我們可利

50、用它來打開相應(yīng)的文件夾,比如打開回收站:【示例 2.4.2 】AHK:Run :645ff040-5081-101b -9f 08-00aa 002f 954eAU3:不適用!C)運行控制面板工具微軟已經(jīng)為我們提供了通過命令行打開控制面板某個工具或項目的方式,比如打開系統(tǒng)屬性窗口:【示例 2.4.3 】AHK:Run control sysdm.cplAU3:Run(control sysdm.cpl)關(guān)于訪問控制面板項目的詳細介紹請查看此文:文章地址。D)指定搜索位置并打開搜索窗口假設(shè)我們要打開一個搜索窗口,而且要指定搜索位置,比如C::【示例 2.4.4 】AHK:Run, find C:

51、AU3:不適用!E)顯示指定文件的屬性窗口假設(shè)我們要打開文件“MyFile.txt”的屬性窗口,則使用關(guān)鍵字properties 然后接上目標文件即可:【示例 2.4.5 】AHK:Run, properties MyFile.txtAU3:不適用!注意:AHK在退出前將自動關(guān)閉打開的屬性窗口!F)用“資源管理器”打開指定文件夾我們知道使用Run, explorer C: 或Run(explorer C:) 即可打開指定的文件夾,可是有時候我們需要在資源管理器中打開它,這時可使用關(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:) 即可打開指定的文件夾,可是有時候我們需要在資源管理器中打開它,這時可使用關(guān)鍵字 explore:【示例 2.4.6 】AHK:Run, explore C:AU3:不適用!run(explorer.exe /e,d:)這樣就可以做到你說的打開樹狀文件了注意:窗口標題和窗口文本參數(shù)總是對大小寫敏感的。1、等待窗口系列

53、命令/函數(shù)AHK和AU3都提供了用法類似的一組窗口等待命令/函數(shù):WinWait/WinWaitActive/WinWaitClose。它們分別用于等待窗口出現(xiàn)、等待窗口被激活、等待窗口被關(guān)閉。由于這些命令/函數(shù)的參數(shù)類似,現(xiàn)僅以WinWait為例說明。AHK:WinWait , 窗口標題, 窗口文本, 超時時間, 排除標題, 排除文本AU3:WinWait ( 窗口標題 , 窗口文本 , 超時時間 )WinWait 的作用是在目標窗口出現(xiàn)之前不再執(zhí)行后面的所有語句。假設(shè)我們要運行記事本程序,并在其窗口出現(xiàn)時提示用戶:【示例 3.1.1 】AHK:Run NotepadWinWait, 無標題

54、 - 記事本MsgBox 記事本窗口已被打開!AU3:Run(Notepad)WinWait(無標題 - 記事本)MsgBox(0, , 記事本窗口已被打開!)2、激活窗口相關(guān)命令/函數(shù)讓目標窗口成為活動窗口的辦法就是激活它,可用的命令/函數(shù)是WinActivate:AHK:WinActivate ,窗口標題, 窗口文本, 排除標題, 排除文本AU3:WinActivate ( 窗口標題 , 窗口文本 )3、關(guān)閉窗口關(guān)閉窗口有兩種方式,一種是正常的關(guān)閉窗口(WinClose),另一種則是強行關(guān)閉窗口(WinKill):AHK:WinClose/WinKill ,窗口標題, 窗口文本, 超時時間

55、, 排除標題, 排除文本AU3:WinClose/WinKill ( 窗口標題 , 窗口文本 )現(xiàn)在我們已經(jīng)可以實現(xiàn)一個比較簡單的功能了,比如我們可以打開系統(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)要用到這些窗口標題的地方,會帶來一個問題:腳本的可讀性,也許你會想,這不是很直觀嗎?可問題是如果這個重復(fù)出現(xiàn)的窗口標題是個很長的字符串呢?這將嚴重影響整個代碼的排版美觀。而且我們也無從了解這些窗口標題的“來頭”,不知道這個窗口標題究竟是怎么來的。而如果我們定義一個變量(假設(shè)變量名是“AppWindow1”)保存這個窗口標題,我們就能在命令/函數(shù)中用變量來表示它,這樣就達到了讓代碼用意更清晰一點的目的。另外,就算目標軟件因某些原因(比如升級)而改變了它的窗口標題,我們也能很

57、方便地作出修改。4、更準確的標識窗口的方法(主要針對AHK腳本)程序在運行時起碼會有一個進程,如果能獲得這個進程ID就能在一定程度上保證對窗口的準確標識。另外,每個窗口都有定義窗口類名(Class,比如說記事本窗口的類名就是Notepad),所以我們可以以此排除與目標窗口不同的其它窗口類。其實,我們還有一個更準確的方法:每個窗口(包括控件在內(nèi))都被Windows指派了一個可區(qū)別于其它窗口的唯一的標識符(ID),我們稱之為窗口句柄(HWND)。直接給定窗口標題來表示窗口的一個缺點就是無法保證在腳本運行的過程中始終以該窗口為操作目標,因為在這個過程中很有可能會有其它“同名”窗口(或者說滿足匹配條件

58、的窗口)出現(xiàn),而如果我們使用這個標識符來表示窗口自然就能保證命令/函數(shù)的操作窗口總是同一個窗口了。我們先來了解一下獲得窗口句柄的命令/函數(shù):AHK:WinGet, 輸出變量, ID, 窗口標題, 窗口文本, 排除標題, 排除文本AU3:WinGetHandle ( 窗口標題 , 窗口文本 )其中WinGet獲得的窗口ID將通過“輸出變量”返回,而WinGetHandle的返回值就是獲得的窗口ID。我們在進行自動化操作時是要先運行某個程序,如何獲得這個程序成功運行后顯示的窗口句柄?一個比較保險的辦法是先獲得這個程序的進程ID,然后根據(jù)這個進程ID獲得它的窗口句柄,AHK支持使用進程ID作為窗口標

59、題使用;但AU3不支持這樣使用,只能先獲得該窗口的類名再根據(jù)該類名來獲得窗口句柄(不夠保險):【示例 3.1.3 】AHK:Run, NotePad, , , ThisPIDWinWait, ahk_pid %ThisPID%;這里的ahk_pid表明跟在后面的變量是進程IDWinGet, ThisID, ID, ahk_pid %ThisPID%;ThisID將保存獲得的窗口句柄AU3:Opt(WinTitleMatchMode, 4)Run(Notepad)$handle = WinGetHandle(classname=Notepad)現(xiàn)在暫且先忘記了AU3吧,因為它的窗口函數(shù)一般都不支

60、持使用窗口句柄作為(窗口標題)參數(shù)。至于如何在AHK中使用窗口句柄,簡單的說,凡是有“窗口標題”參數(shù)的命令就可以用窗口句柄來代替,比如:【示例 3.1.4 】AHK:Run, Notepad, , , ThisPID;先獲得運行的記事本程序的進程IDWinWait, 無標題 - 記事本 ahk_pid %ThisPID%;等待該進程窗口的出現(xiàn)WinGet, ThisHWND, ID, 無標題 - 記事本 ahk_pid %ThisPID%;獲得窗口句柄WinActivate, ahk_id %ThisHWND%;這里的ahk_id表明跟在后面的變量是窗口句柄WinWaitActive, ahk

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論