autoit快速开发指南_第1页
autoit快速开发指南_第2页
autoit快速开发指南_第3页
autoit快速开发指南_第4页
autoit快速开发指南_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Autoit快速开发指南2012年9月6日Autoit开发指南启动程序启动exe类型文件,一般使用Run函数Run(“路径”)如:Run(“D:JavaMyEclipse 6eclipseeclipse.exe”)如果运行该函数,程序还没有启动起来,请配置好程序运行的工作目录Run(“路径”,”工作目录”)如:Run(“D:JavaMyEclipse 6eclipseeclipse.exe”,” D:JavaMyEclipse 6eclipse”)注:有时程序的目录不一定和工作目录相同启动lnk,txt等文件一般使用ShellExecute函数该函数除了可以指定工作目录外,还可以设置启动参数1

2、.窗口操作窗口处理一般都是针对Windows GUI窗口的操作,常用的如下:;窗口是否存在WinExists( 窗口标题 , 窗口文本 ) ;激活窗口WinActivate( 窗口标题 , 窗口文本 );等待某个窗口WinWait(窗口标题 , 窗口文本 , 超时时间 );关闭指定窗口WinClose ( 窗口标题 , 窗口文本 );获取窗口句柄WinGetHandle ( 窗口标题 , 窗口文本 );获取窗口标题WinGetTitle ( 窗口标题 , 窗口文本 );获取窗口进程WinGetProcess ( 窗口标题 , 窗口文本 )还有其他一些处理函数,这个可以直接去查找AutoIt的帮

3、助文档。下面是一个例子,一般在很多地方用到,特别是程序启动或者运行到某个步骤,等待其他窗口处理,一般采用以下脚本判断WinWait(“窗口标题”, 窗口文本, ”等待时间”)If WinExists(“窗口标题”) ThenWinActivate(“窗口标题”)EndIf不建议使用WinWaitActive(“窗口标题”,窗口文本,”等待时间”),否则,如果该窗口处于非激活状态,会使脚本一直等待直到超时,按照非预设的流程解析运行下去,得不到预期结果。1.菜单操作菜单点击使用WinMenuSelectItem函数WinMenuSelectItem(“窗口标题”, ”主菜单” , ”子菜单1”,

4、”子菜单2” )例如点击窗口菜单的文件=保存WinMenuSelectItem(“未命名 画图”, ”文件” , ” 保存”)当该函数无法操作菜单时候(一般为非标准的Windows GUI),可以在工具栏查找该菜单的快捷启动按钮或者通过发送快捷键进行控制3.工具栏操作对于工具栏快速按钮,可以使用ControlCommand函数处理,菜单操作中很多快捷方式一般都放在工具栏中,这种情况可以多一个选择。ControlCommand(“窗口标题”, 窗口文本, ”工具栏控件名” , SendCommandID, ”控件ID”)ControlCommand只能操作ToolbarWindow32类型的控件

5、。控件ID需要通过Windows Info工具获取。文本框在文本框输入数据使用:ControlSetText(“标题”,”控件名或ID” ,”输入的字符串数据”)如果需要获取文本框的数据,则使用ControlGetText(“标题”,”控件名或ID”)ControlSetText和ControlGetText可以操作单行文本框,密码输入框,多行文本框等。 选择控件选择控件使用ControlCommand函数操作,可以操作单选多选以及单行多行下拉选择(ComboBox和ListBox)等控件。如选择下拉框的某个选项:ControlCommand(“窗口标题”, , 控件类名或ID , Selec

6、tString, 选中选项文本)而针对Radio,CheckBox等选择类型的控件ControlCommand(“窗口标题”, ,控件类名或ID ,check, ”)而对于ListBox类型的选择框,则需要通过一系列组合来操作选项,如下面是获取所有选项数据的例子:WinActivate(“窗口标题”)$hWnd = ControlGetHandle(“窗口标题”, , “控件ID”)$count = _GUICtrlListBox_GetCount($hWnd)For $i=0 To $count-1$hLabel = _GUICtrlListBox_GetText($hWnd, $i)Nex

7、t点击操作 控件点击控件点击一般使用:ControlClick(窗口标题,控件名或ID,按钮,点击次数)按钮分左键(left),右键(right)等此外还可以在函数后面添加坐标,这对于占用屏幕区域比较大的时候,精确点击某个位置触发其他操作比较重要比如在一个表格中,需要右击某一行记录,弹出右键菜单的情况。鼠标点击MouseClick(“按钮”, “X坐标”,”Y坐标”,”点击次数”)MouseClick函数对于任何点击操作都有效,唯一不理想的是,它涉及坐标点的确定,降低了程序的通用性。如果非要这么做,建议:将当前窗口激活,并最大化WinActivate(窗口标题, )WinSetState(窗口

8、标题, , SW_MAXIMIZE);接下来进行鼠标点击相关操作如果当前窗口禁用最大化,则使用当前窗口相对坐标进行操作AutoItSetOption ( MouseCoordMode , 1) ;这里指相对当前激活窗口的坐标WinActivate(窗口标题, );接下来进行鼠标点击相关操作键盘操作键盘操作一般使用Send函数,想激活窗口发送模拟键盘操作 一般字符这种情况指向当前激活窗口文本框,发送按键字符,如:Send(向光标激活地方发送的字符串)快捷操作这种情况一般没有光标的输入,只是针对当前的激活窗口的一些快捷操作,比如按键”ctrl+S”是保存等,如Send(s)另外一些快捷键如:Ctr

9、l=Alt=!Win=#Shift=+其他如:Send(“ PRINTSCREEN”) 截屏键Send(“ SPACE”) 空格键Send(“ ENTER”) 回车键Send(“ BACKSPACE”) 退格键字符串处理针对字符串的处理,一般常需要判断字符串是否存在,或对字符串进行拆分、替换等,下面用一个例子来说明一下:一个用&连接的子字符串,需要跟某段文字进行匹配,如果发现存在子存在,则替换成指定的字符串$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其他可以参考官方帮助文档。数组处理数组可以包含不同数据类型的数据,处理起来有两种情况需要注意一般数组这个跟其他程序语言无太大的差别,如下所示:Dim $array2$array0=1$array1=2注意下标从0开始特殊数组特殊数组指某些函数的返回值为数组的情况,或是在运行脚本时候,传递给命令行的参数,AutoIT会初始化一个特殊的数组,这些数组下标也是从0开始,但是为0的项保存的是数组的个数

11、。命令行返回数组对于脚本参数数组为$CmdLine,可以直接使用$CmdLine0 ;参数的数量$CmdLine1 ;第一个参数 (脚本名称后面)$CmdLine2 ;第二个参数.$CmdLine$CmdLine0 ;可以用来表示得到最后一个参数.如果脚本是像下面这样被运行的话:AutoIt3.exe myscript.au3 参数1 这是 一个其它参数$CmdLine0 等价于. 2$CmdLine1 等价于. 参数1$CmdLine2 等价于. 这是一个其它参数ScriptName 等价于. myscript.au3函数返回数组前面用到的StringSplit函数返回值也是一个数组,0位保

12、存的是数组项的个数,数组内却是从1开始计数$matchStr=11&22&33$array = StringSplit($matchStr, &, 1)如上:$array0 等于4$array1 等于”11”$array2 等于”22”$array3 等于”33” 其他还有另外一些特殊的函数,如FileGetTime,WinList等等很多函数,返回值都是数组的情况,具体用法可能有些差异,这些可以参考相关文档。日期时间当前日期时间,可以直接从日期和时间宏中获取,如:SEC 当前时钟的秒值,值的范围是 00 到 59MIN 当前时钟的分值,值的范围是 00 到 59HOUR 当前时钟的时值(24

13、时制),值的范围是 00 到 23MDAY 当天属本月的第几天,值的范围是 01 到 31MON 当前月份,值的范围是 01到 12YEAR 当前年份(4位数) 计算指定日期间隔后的新日期:_DateAdd(“计算类型”, “间隔数”, “指定日期”)计算两个指定日期的间隔:_DateDiff(“计算类型”, “计算的开始日期”, “计算的结束日期”)像素捕获像素捕获主要去获取屏幕某块区域像素点的色值,以此和给定的颜色色值来比较判断是否一致。WinActivate(窗口标题)$Handle = WinGetHandle(窗口标题,)AutoItSetOption (PixelCoordMode

14、,2)$Color = PixelGetColor(X坐标,Y坐标,$Handle)$ColorStr = Hex($Color,6)在实际情况中,有时可能不止获取一个点的像素就够了,这时可以通过获取窗口的相关WinGetPos(窗口标题,)坐标位置,然后对某个区块进行扫描。文件操作一般文件对于一般文本文件的读取:可以使用FileOpen打开文件,在按照要求读取文件内容:$fHandle = FileOpen(文件, 0)if $fHandle -1 ThenWhile 1$line = FileReadLine($fHandle)If error = -1 Then ExitLoopWend

15、EndIfFileClose($fHandle)如果文件被独占打开,进行FileOpen操作时候,获取不到文件操作句柄,无法对文件进行读写操作,这时,如果只是针对文件读,可以将独占打开的文件进行一下复制,然后用拷贝文件进行目标操作。FileCopy(原文件, 目标文件或路径, 1)ini文件对于ini类型文件,形如:字段名关键字=数值文件中可以有多个不同的字段名,每个字段名下有多个关键字,不同字段名下的关键字可以相同。读取ini文件:IniRead ( 文件名, 字段名, 关键字, 默认值 )写入ini文件:IniWrite ( 文件名, 字段名, 键名, 值 )删除ini文件:IniDele

16、te ( 文件名, 字段名 , 关键字 )常用控件操作ListBox控件ListBox控件,如图所示:在前面提到选择控件,ListBox也是其中一种,前面介绍了如何选中的某行选项,但是在真正的ListBox空间中,多半是记录相关软件运行时的一些状态参数记录,需要做的只判断其中打印的相关记录:$hWnd = ControlGetHandle(窗口标题,ListBox控件名)$count = _GUICtrlListBox_GetCount($hWnd)For $i=0 To $count-1$hLabel = _GUICtrlListBox_GetText($hWnd, $i)Next其中第一行

17、是获取控件操作句柄,第二行根据句柄获取控件的记录条数,最后根据记录上遍历,获取每一条记录。ListView控件ListView控件展示形如表格,如图所示:其操作如下$rows = ControlListView(窗口标题,ListView控件名,GetItemCount)For $i=0 To $rows-1$iText = ControlListView(窗口标题,ListView控件名,GetText, $i, 列名序号)Next上面代码,我们首先获取行数,然后指定某列,获取其所有行的文本。更多ListView操作可以参考ControlListView函数说明。运行参数设置运行参数设置可以

18、调整Autoit各种函数/参数的运作方式,可以通过Opt或者AutoItSetOption函数来设置:AutoItSetOption ( 选项 , 参数 )如:Opt (PixelCoordMode,2)或AutoItSetOption (PixelCoordMode,2)常用的有:Opt (PixelCoordMode,2) ;设置用于象素函数的坐标参照Opt (GUIEventOptions ,1) ;修改特殊的 GUI 函数的返回值类型Opt (MouseClickDelay,500) ;更改每个鼠标点击命令之间的延迟时间长度Opt (SendKeyDelay ,1000) ;更改发送键

19、击命令之间的延迟时间长度Opt (TrayIconDebug ,1) ;在托盘图标上显示当前脚本执行到的那一行的相关信息(工具提示)以助调试Opt (WinWaitDelay ,500) ;更改每次成功执行窗口相关操作后的延迟时间长度更多运行参数设置可以参考AutoItSetOption帮助文档说明加密解密加密;$bEncrypted 为加密后字符串_Crypt_Startup()$hKey=_Crypt_DeriveKey(sop,$CALG_RC4)$bEncrypted =_Crypt_EncryptData(待加密字符,$hKey,$CALG_USERKEY)_Crypt_Destro

20、yKey($hKey)_Crypt_Shutdown()这里加密的是一个16进制的字符串,其中加密匙可以自己设置,示例中为sop,其中加密算法为AutoIt内置的$CALG_RC4,还可以为$CALG_RC2等等其他。解密;$ encrypt为解密后字符串$bData = Binary(“加密的字符”)$encrypt = BinaryToString(_Crypt_DecryptData($bData, sop, $CALG_RC4)很简单的两行,不过其中的解密匙和解密算法要跟之前的加密参数对应。GUI操作GUI操作包括创建窗口面板,在面板上创建表单控件及其互动事件处理等一系列连贯配置:$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事件响应,即触发自定义函数WM_COMMAND,窗口包括两个简单的文本编辑控件。我们还可以设置其他控件的事件处理: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这里是针对按钮设置了点击触发事件。IE操作IE操作,不像GUI界面一样,通过AutoIt Window Info就能得到相关控件,进而获取控件句柄进行操作。我们在操作IE网页时候,需要事先获取HTML页面中的相关Dom节点或元素,所以需要对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窗口,访问百度,然后在搜索网页表单,输入一个要查询的关键字,点击百度搜索。一般网页很多超链接,对于这些链接的页面,都有很多的Dom节点嵌套,单纯的以对象名称不一定能够获取到某个操作的对象,这时需要从顶级Dom节点,一级一级缩小范围,直到获取到最终操作对象节点,如下所示:$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的节点,进而,取到divId节点下的所有超链接对象,最后一个

27、一个判断,找到某个url,点击超链接。自定义函数把一些常用而相关逻辑的操作,抽离出来,独立成一个模块,供脚本调用,这就需要涉及到自定义函数。用户可通过使用 Func.EndFunc 语句来自定义函数,函数中可以有Return返回值,也可以无,下面我们列出了一些常用的自定义函数,供参考:#include #Include #include #Include #Include #Include #include #include ;获取配置文件Func GetConfigFile()Return String(D:DigitalchinaAutoAgentscriptsConfigParamete

28、r.ini)EndFunc;根据给定的日期格式字符串转换成当前日期格式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 写入日志内容,增加在行尾Func WriteLog($fileName,$flag,$logTxt);根据代理约定的相对目录$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;脚本执行结果文件$file1=FileOpen($File_dat,2)Fi

32、leWriteLine($file1, $flag)FileWriteLine($file1,$logTxt)FileClose($file1);状态文件$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、据给定的字符串匹配ListBox控件中的数据;$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上面实例函数用到了AutoIt内部函数库,通过#include 关键字包含了进来。Windows锁屏处理办法锁屏解释:当windows操作系统被锁屏时,实际上是在所有窗口(包括隐藏的)的前面再新开了一个窗口,完全遮挡住先前的窗口,这样大家就看不到了,autoit说这个窗口叫“Always on TOP”。被遮挡的窗口虽然看不到了,但是还在,只是变成了隐藏模式,找到他们,是可以执行快捷方式命令的;但窗口界面操作是不行的,主要原因是没法激活Send 和 ControlSend 命令Send 命令必须要在激活窗口的条件下才能正确执行ControlS

44、end命令可以不需要激活窗口就能执行附录实例介绍,相关说明请参考代码中的注释:;导入需要用到的外部参数#include #include ;定义变量Dim $yyyymd1,$yyyymd2,$yyyymd3,$flag,$ret给变量赋值$flag = 0$ret = 0;从ini文件中,获取相关配置数据$programPath = IniRead(GetConfigFile(),HQZR,programPath,)$showDataFile = IniRead(GetConfigFile(),HQZR,showDataFile,)$hqDataFile = IniRead(GetConfi

45、gFile(),HQZR,hqDataFile,)$xxDataFile = IniRead(GetConfigFile(),HQZR,xxDataFile,);调用JudgeTime函数;如果当前时间不到9:20 则暂停10秒后继续判断,直到9:20While JudgeTime()=0920 Then$ret = 1EndIfReturn $retEndFunc二、运行程序或打开文件1、运行程序Run t命令或者函数用来运行外部可执行文件,AHK还可利用它来直接打开文件。AHK:Run, 目标文件 , 工作目录, Max|Min|Hide|UseErrorLevel, 输出PID变量AU3

46、:Run ( 文件名 , 工作目录 , 标志 )【示例 2.1.1 】AHK:Run, Notepad.exeAU3:Run(Notepad.exe)上面的示例中都没有给出程序“Notepad.exe”的路径,为什么仍能执行?这是因为它们都会自动在脚本所在目录下搜寻目标文件,如有则运行,否则就到系统文件夹(%PATH%)中搜寻。注意:A)某些程序必须给定“工作目录”才能成功运行!B)给出完整的文件路径有助于轻微提高程序的可靠性。C)AHK的Run命令可以用来运行程序和直接打开文件,而AU3的Run函数则只能用来运行程序(可执行文件)或传递参数让某个程序打开目标文件。当然,运行程序的功能还不仅仅

47、是这么简单,我们还可以指定运行程序的初始状态,比如让运行的记事本窗口以最大化状态显示(或者最小化、隐藏):【示例 2.1.2 】AHK:Run, Notepad.exe, , MaxAU3:Run(Notepad.exe, , SW_MAXIMIZE)2、打开文件前面已经提到,AHK的Run命令可以直接打开文件,而AU3的Run函数则只能用来运行程序,因此在打开文件的方式上有点不同:AHK脚本中可直接给出目标文件,而AHK将自动运行该文件的关联程序来打开它;而AU3则必须由用户自己传递参数让某个程序打开目标文件。【示例 2.2.1 】AHK:Run, MyFile.txtRun, Notepa

48、d.exe MyFile.txtAU3:Run(Notepad.exe MyFile.txt)3、以命令行形式运行程序可以考虑运行系统的命令行解释器(cmd.exe/),然后指定要执行的命令并传递参数。假设我们要执行命令“dir C:WINDOWSsystem 32” ,用以列出指定目录的所有文件及子目录。【示例 2.3.1 】AHK:Run, %ComSpec% /k dir C:WINDOWSsystem32AU3:Run(ComSpec & /k dir C:WINDOWSsystem32)注意:A)ComSpec是脚本内建的用以指示命令行解释器位置的变量或宏。B)/k 参数表示“执行字

49、符串指定的命令但保留”,若改为 /c 则表示“执行字符串指定的命令然后终断”。对此比较直观的解释是 /k 将在执行完命令后保留命令提示窗口,而 /c 则将在执行完命令之后关闭命令提示窗口。C)符号“&”是AU3定义的字符串连接符。4、特殊应用A)打开网页【示例 2.4.1 】AHK:Run, Run, %A_ProgramFiles%Internet ExplorerIEXPLORE.EXE AU3:Run(ProgramFilesDir & Internet ExplorerIEXPLORE.EXE )B)打开特殊文件夹系统的某些特殊文件夹被定义了相应的CLSID(请查看帮助文档),我们可利

50、用它来打开相应的文件夹,比如打开回收站:【示例 2.4.2 】AHK:Run :645ff040-5081-101b -9f 08-00aa 002f 954eAU3:不适用!C)运行控制面板工具微软已经为我们提供了通过命令行打开控制面板某个工具或项目的方式,比如打开系统属性窗口:【示例 2.4.3 】AHK:Run control sysdm.cplAU3:Run(control sysdm.cpl)关于访问控制面板项目的详细介绍请查看此文:文章地址。D)指定搜索位置并打开搜索窗口假设我们要打开一个搜索窗口,而且要指定搜索位置,比如C::【示例 2.4.4 】AHK:Run, find C:

51、AU3:不适用!E)显示指定文件的属性窗口假设我们要打开文件“MyFile.txt”的属性窗口,则使用关键字properties 然后接上目标文件即可:【示例 2.4.5 】AHK:Run, properties MyFile.txtAU3:不适用!注意:AHK在退出前将自动关闭打开的属性窗口!F)用“资源管理器”打开指定文件夹我们知道使用Run, explorer C: 或Run(explorer C:) 即可打开指定的文件夹,可是有时候我们需要在资源管理器中打开它,这时可使用关键字 explore:【示例 2.4.6 】AHK:Run, explore C:AU3:run(explorer

52、.exe /e,C:)G)打印指定文件要打印指定文件,可使用关键字 print:【示例 2.4.7 】AHK:Run, print MyFile.txtAU3:不适用!F)用“资源管理器”打开指定文件夹我们知道使用Run, explorer C: 或Run(explorer C:) 即可打开指定的文件夹,可是有时候我们需要在资源管理器中打开它,这时可使用关键字 explore:【示例 2.4.6 】AHK:Run, explore C:AU3:不适用!run(explorer.exe /e,d:)这样就可以做到你说的打开树状文件了注意:窗口标题和窗口文本参数总是对大小写敏感的。1、等待窗口系列

53、命令/函数AHK和AU3都提供了用法类似的一组窗口等待命令/函数:WinWait/WinWaitActive/WinWaitClose。它们分别用于等待窗口出现、等待窗口被激活、等待窗口被关闭。由于这些命令/函数的参数类似,现仅以WinWait为例说明。AHK:WinWait , 窗口标题, 窗口文本, 超时时间, 排除标题, 排除文本AU3:WinWait ( 窗口标题 , 窗口文本 , 超时时间 )WinWait 的作用是在目标窗口出现之前不再执行后面的所有语句。假设我们要运行记事本程序,并在其窗口出现时提示用户:【示例 3.1.1 】AHK:Run NotepadWinWait, 无标题

54、 - 记事本MsgBox 记事本窗口已被打开!AU3:Run(Notepad)WinWait(无标题 - 记事本)MsgBox(0, , 记事本窗口已被打开!)2、激活窗口相关命令/函数让目标窗口成为活动窗口的办法就是激活它,可用的命令/函数是WinActivate:AHK:WinActivate ,窗口标题, 窗口文本, 排除标题, 排除文本AU3:WinActivate ( 窗口标题 , 窗口文本 )3、关闭窗口关闭窗口有两种方式,一种是正常的关闭窗口(WinClose),另一种则是强行关闭窗口(WinKill):AHK:WinClose/WinKill ,窗口标题, 窗口文本, 超时时间

55、, 排除标题, 排除文本AU3:WinClose/WinKill ( 窗口标题 , 窗口文本 )现在我们已经可以实现一个比较简单的功能了,比如我们可以打开系统属性窗口并等待其出现,窗口出现后激活它,接着等待3秒再关闭它:【示例 3.1.2 】AHK:Run, Sysdm.cplWinWait, 系统属性WinActivate, 系统属性WinWaitActive, 系统属性Sleep, 3000WinClose, 系统属性WinWaitClose, 系统属性AU3:Run(Control Sysdm.cpl)WinWait(系统属性)WinActivate(系统属性)WinWaitActive

56、(系统属性)Sleep(3000)WinClose(系统属性)WinWaitClose(系统属性)建议:如果程序中频繁地出现要用到这些窗口标题的地方,会带来一个问题:脚本的可读性,也许你会想,这不是很直观吗?可问题是如果这个重复出现的窗口标题是个很长的字符串呢?这将严重影响整个代码的排版美观。而且我们也无从了解这些窗口标题的“来头”,不知道这个窗口标题究竟是怎么来的。而如果我们定义一个变量(假设变量名是“AppWindow1”)保存这个窗口标题,我们就能在命令/函数中用变量来表示它,这样就达到了让代码用意更清晰一点的目的。另外,就算目标软件因某些原因(比如升级)而改变了它的窗口标题,我们也能很

57、方便地作出修改。4、更准确的标识窗口的方法(主要针对AHK脚本)程序在运行时起码会有一个进程,如果能获得这个进程ID就能在一定程度上保证对窗口的准确标识。另外,每个窗口都有定义窗口类名(Class,比如说记事本窗口的类名就是Notepad),所以我们可以以此排除与目标窗口不同的其它窗口类。其实,我们还有一个更准确的方法:每个窗口(包括控件在内)都被Windows指派了一个可区别于其它窗口的唯一的标识符(ID),我们称之为窗口句柄(HWND)。直接给定窗口标题来表示窗口的一个缺点就是无法保证在脚本运行的过程中始终以该窗口为操作目标,因为在这个过程中很有可能会有其它“同名”窗口(或者说满足匹配条件

58、的窗口)出现,而如果我们使用这个标识符来表示窗口自然就能保证命令/函数的操作窗口总是同一个窗口了。我们先来了解一下获得窗口句柄的命令/函数:AHK:WinGet, 输出变量, ID, 窗口标题, 窗口文本, 排除标题, 排除文本AU3:WinGetHandle ( 窗口标题 , 窗口文本 )其中WinGet获得的窗口ID将通过“输出变量”返回,而WinGetHandle的返回值就是获得的窗口ID。我们在进行自动化操作时是要先运行某个程序,如何获得这个程序成功运行后显示的窗口句柄?一个比较保险的办法是先获得这个程序的进程ID,然后根据这个进程ID获得它的窗口句柄,AHK支持使用进程ID作为窗口标

59、题使用;但AU3不支持这样使用,只能先获得该窗口的类名再根据该类名来获得窗口句柄(不够保险):【示例 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)现在暂且先忘记了AU3吧,因为它的窗口函数一般都不支

60、持使用窗口句柄作为(窗口标题)参数。至于如何在AHK中使用窗口句柄,简单的说,凡是有“窗口标题”参数的命令就可以用窗口句柄来代替,比如:【示例 3.1.4 】AHK:Run, Notepad, , , ThisPID;先获得运行的记事本程序的进程IDWinWait, 无标题 - 记事本 ahk_pid %ThisPID%;等待该进程窗口的出现WinGet, ThisHWND, ID, 无标题 - 记事本 ahk_pid %ThisPID%;获得窗口句柄WinActivate, ahk_id %ThisHWND%;这里的ahk_id表明跟在后面的变量是窗口句柄WinWaitActive, ahk

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论