找回密码
 立即注册

QQ登录

只需一步,快速开始

资讯系统 神州数码AutoIt快速开发指南

0
回复
3703
查看
[ 复制链接 ]

293

主题

6

回帖

4093

积分

管理员

积分
4093
file:///C:\Users\SUNJIA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image002.jpgAutoIt快速开发指南
神州数码系统集成服务有限公司
AutoIt快速开发指南... 1
1.    启动程序... 2
2.    窗口操作... 2
3.    菜单操作... 4
4.    工具栏操作... 4
5.    表单控件操作... 5
5.1      文本框... 5
5.2      选择控件... 6
6.    点击操作... 7
6.1      控件点击... 7
6.2      鼠标点击... 7
7.    键盘操作... 8
7.1      一般字符... 8
7.2      快捷操作... 8
8.    字符串处理... 8
9.    数组处理... 9
9.1      一般数组... 9
9.2      特殊数组... 9
10.      日期时间... 10
11.      像素捕获... 11
12.      文件操作... 11
12.1.      一般文件... 11
12.2.      ini文件... 12
13.      常用控件操作... 12
13.1.      ListBox控件... 12
13.2.      ListView控件... 13
14.      运行参数设置... 14
15.      加密解密... 14
15.1.      加密... 14
15.2.      解密... 15
16.      GUI操作... 15
17.      IE操作... 16
18.      自定义函数... 17
19.      附录... 27

1.      启动程序
启动exe类型文件,一般使用Run函数
Run(“路径”)
如:
  
Run(“D:\Java\MyEclipse  6\eclipse\eclipse.exe”)
  

如果运行该函数,程序还没有启动起来,请配置好程序运行的工作目录
Run(“路径”,”工作目录”)
如:
  
Run(“D:\Java\MyEclipse  6\eclipse\eclipse.exe”,” D:\Java\MyEclipse 6\eclipse”)
  
file:///C:\Users\SUNJIA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image004.jpg
注:有时程序的目录不一定和工作目录相同

启动lnk,txt等文件一般使用ShellExecute函数
该函数除了可以指定工作目录外,还可以设置启动参数

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

下面是一个例子,一般在很多地方用到,特别是程序启动或者运行到某个步骤,等待其他窗口处理,一般采用以下脚本判断
  
WinWait(“窗口标题”, "窗口文本", ”等待时间”)
  
If WinExists(“窗口标题”) Then
  
       WinActivate(“窗口标题”)
  
       ……
  
EndIf
  
不建议使用WinWaitActive(“窗口标题”,"窗口文本",”等待时间”),否则,如果该窗口处于非激活状态,会使脚本一直等待直到超时,按照非预设的流程解析运行下去,得不到预期结果。
3.      菜单操作
file:///C:\Users\SUNJIA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image006.jpg

菜单点击使用WinMenuSelectItem函数
  
WinMenuSelectItem(“窗口标题”,"", ”主菜单” , ”子菜单1”, ”子菜单2”  ……)
  
例如点击窗口菜单的文件=》保存
  
WinMenuSelectItem(“未命名 — 画图”,"", ”文件”  , ” 保存”)
  
当该函数无法操作菜单时候(一般为非标准的Windows GUI),可以在工具栏查找该菜单的快捷启动按钮或者通过发送快捷键进行控制

4.      工具栏操作
file:///C:\Users\SUNJIA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image008.jpg
对于工具栏快速按钮,可以使用ControlCommand函数处理,菜单操作中很多快捷方式一般都放在工具栏中,这种情况可以多一个选择。
  
ControlCommand(“窗口标题”, "窗口文本", ”工具栏控件名” , "SendCommandID", ”控件ID”)
  
ControlCommand只能操作ToolbarWindow32类型的控件。
控件ID需要通过Windows Info工具获取。

5.      表单控件操作5.1 文本框
file:///C:\Users\SUNJIA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image010.jpg
在文本框输入数据使用:
ControlSetText(“标题”,"",”控件名或ID” ,”输入的字符串数据”)
如果需要获取文本框的数据,则使用
ControlGetText(“标题”,"",”控件名或ID”)
ControlSetText和ControlGetText可以操作单行文本框,密码输入框,多行文本框等。
5.2 选择控件
file:///C:\Users\SUNJIA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image012.jpg
选择控件使用ControlCommand函数操作,可以操作单选多选以及单行多行下拉选择(ComboBox和ListBox)等控件。
如选择下拉框的某个选项:
  
ControlCommand(“窗口标题”, "", 控件类名或ID , "SelectString", 选中选项文本)
  
而针对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)
  
       ……
  
Next
  

6.      点击操作6.1 控件点击
控件点击一般使用:
  
ControlClick("窗口标题","","控件名或ID","按钮","点击次数")
  
按钮分左键(left),右键(right)等
此外还可以在函数后面添加坐标,这对于占用屏幕区域比较大的时候,精确点击某个位置触发其他操作比较重要
比如在一个表格中,需要右击某一行记录,弹出右键菜单的情况。


6.2 鼠标点击
  
MouseClick(“按钮”, “X坐标”,”Y坐标”,”点击次数”)
  
MouseClick函数对于任何点击操作都有效,
唯一不理想的是,它涉及坐标点的确定,降低了程序的通用性。
如果非要这么做,建议:
1)       将当前窗口激活,并最大化
  
WinActivate("窗口标题", "")
  
WinSetState("窗口标题", "", @SW_MAXIMIZE)
  
;接下来进行鼠标点击相关操作
  
……
  
2)       如果当前窗口禁用最大化,则使用当前窗口相对坐标进行操作
  
AutoItSetOption ( " MouseCoordMode" , 1)   ;这里指相对当前激活窗口的坐标
  
WinActivate("窗口标题", "")
  
;接下来进行鼠标点击相关操作
  
……
  

7.      键盘操作
键盘操作一般使用Send函数,想激活窗口发送模拟键盘操作
7.1 一般字符
这种情况指向当前激活窗口文本框,发送按键字符,如:
  
Send("向光标激活地方发送的字符串")
  

7.2 快捷操作
这种情况一般没有光标的输入,只是针对当前的激活窗口的一些快捷操作,比如按键”ctrl+S”是保存等,如
  
Send("^s")
  
另外一些快捷键如:
  
Ctrl=^
  
Alt=!
  
Win=#
  
Shift=+
  
其他如:
  
Send(“{ PRINTSCREEN}”)   截屏键
  
Send(“{ SPACE}”)         空格键
  
Send(“{ ENTER}”)         回车键
  
Send(“{ BACKSPACE}”)    退格键
  
……
  

8.      字符串处理
针对字符串的处理,一般常需要判断字符串是否存在,或对字符串进行拆分、替换等,下面用一个例子来说明一下:
一个用&&连接的子字符串,需要跟某段文字进行匹配,如果发现存在子存在,则替换成指定的字符串
  
$originalStr="………………"
  
$matchStr="政府&&奶奶的"
  
$array = StringSplit($matchStr,  '&&', 1)
  
If $i=1 To $array[0] Then
  
       If  StringInStr($originalStr,$array[$i])>0 Then
  
              $originalStr =  StringReplace($originalStr,$array[$i,"XXX")
  
       EndIf
  
EndIf
  
其他可以参考官方帮助文档。
9.      数组处理
数组可以包含不同数据类型的数据,处理起来有两种情况需要注意
9.1一般数组
这个跟其他程序语言无太大的差别,如下所示:
  
Dim $array[2]
  
$array[0]=1
  
$array[1]=2
  
注意下标从0开始
9.2特殊数组
特殊数组指某些函数的返回值为数组的情况,或是在运行脚本时候,传递给命令行的参数,AutoIT会初始化一个特殊的数组,这些数组下标也是从0开始,但是为0的项保存的是数组的个数。
l  命令行返回数组
对于脚本参数数组为$CmdLine,可以直接使用
$CmdLine[0] ;参数的数量
$CmdLine[1] ;第一个参数(脚本名称后面)
$CmdLine[2] ;第二个参数
...
$CmdLine[$CmdLine[0]] ;可以用来表示得到最后一个参数...

如果脚本是像下面这样被运行的话:
AutoIt3.exe myscript.au3 参数1 "这是 一个其它参数"
$CmdLine[0] 等价于...2
$CmdLine[1] 等价于...参数1
$CmdLine[2] 等价于...这是一个其它参数
@ScriptName 等价于...myscript.au3

l  函数返回数组
前面用到的StringSplit函数返回值也是一个数组,0位保存的是数组项的个数,数组内却是从1开始计数
  
$matchStr="11&&22&33"
  
$array = StringSplit($matchStr,  '&&', 1)
  
如上:
  
$array[0]  等于4
  
$array[1]  等于”11”
  
$array[2]  等于”22”
  
$array[3]  等于”33”  
  

其他还有另外一些特殊的函数,如FileGetTime,WinList等等很多函数,返回值都是数组的情况,具体用法可能有些差异,这些可以参考相关文档。
10.             日期时间
当前日期时间,可以直接从日期和时间宏中获取,如:
@SEC   当前时钟的秒值,值的范围是 00 到 59
@MIN  当前时钟的分值,值的范围是00 到 59
@HOUR 当前时钟的时值(24时制),值的范围是00 到 23
@MDAY 当天属本月的第几天,值的范围是 01 到 31
@MON  当前月份,值的范围是01到 12
@YEAR  当前年份(4位数)  

计算指定日期间隔后的新日期:
_DateAdd(“计算类型”,“间隔数”, “指定日期”)

计算两个指定日期的间隔:
_DateDiff(“计算类型”,“计算的开始日期”, “计算的结束日期”)

11.             像素捕获
像素捕获主要去获取屏幕某块区域像素点的色值,以此和给定的颜色色值来比较判断是否一致。
  
WinActivate("窗口标题")
  
$Handle = WinGetHandle("窗口标题","")
  
AutoItSetOption  ("PixelCoordMode",2)
  
$Color = PixelGetColor(X坐标,Y坐标,$Handle)
  
$ColorStr = Hex($Color,6)
  
在实际情况中,有时可能不止获取一个点的像素就够了,这时可以通过获取窗口的相关WinGetPos("窗口标题","")坐标位置,然后对某个区块进行扫描。

12.             文件操作12.1.      一般文件
对于一般文本文件的读取:可以使用FileOpen打开文件,在按照要求读取文件内容:
  
$fHandle = FileOpen("文件", 0)
  
if $fHandle <> -1 Then
  
       While  1
  
              $line  = FileReadLine($fHandle)
  
              If  @error = -1 Then ExitLoop
  
       Wend
  
EndIf
  
FileClose($fHandle)
  
如果文件被独占打开,进行FileOpen操作时候,获取不到文件操作句柄,无法对文件进行读写操作,这时,如果只是针对文件读,可以将独占打开的文件进行一下复制,然后用拷贝文件进行目标操作。
  
FileCopy("原文件", "目标文件或路径", 1)
  
12.2.      ini文件
对于ini类型文件,形如:
[字段名]
关键字=数值
文件中可以有多个不同的字段名,每个字段名下有多个关键字,不同字段名下的关键字可以相同。
读取ini文件:
  
IniRead ( "文件名", "字段名", "关键字", "默认值" )
  
写入ini文件:
  
IniWrite ( "文件名", "字段名", "键名", "值" )
  
删除ini文件:
  
IniDelete ( "文件名", "字段名" [, "关键字"] )
  

13.             常用控件操作13.1.      ListBox控件
ListBox控件,如图所示:
file:///C:\Users\SUNJIA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image014.jpg
在前面提到选择控件,ListBox也是其中一种,前面介绍了如何选中的某行选项,但是在真正的ListBox空间中,多半是记录相关软件运行时的一些状态参数记录,需要做的只判断其中打印的相关记录:
  
$hWnd = ControlGetHandle("窗口标题","",ListBox控件名)
  
$count =  _GUICtrlListBox_GetCount($hWnd)
  
For $i=0 To $count-1
  
       $hLabel  = _GUICtrlListBox_GetText($hWnd, $i)
  
Next
  
其中第一行是获取控件操作句柄,第二行根据句柄获取控件的记录条数,最后根据记录上遍历,获取每一条记录。
13.2.      ListView控件
ListView控件展示形如表格,如图所示:
file:///C:\Users\SUNJIA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image016.jpg
其操作如下
  
$rows = ControlListView("窗口标题","","ListView控件名","GetItemCount")
  
For $i=0 To $rows-1
  
       $iText  = ControlListView("窗口标题","","ListView控件名","GetText", $i, "列名序号")
  
Next
  
上面代码,我们首先获取行数,然后指定某列,获取其所有行的文本。
更多ListView操作可以参考ControlListView函数说明。

14.             运行参数设置
运行参数设置可以调整Autoit各种函数/参数的运作方式,可以通过Opt或者AutoItSetOption函数来设置:
  
AutoItSetOption ( "选项" [, 参数] )
  
如:
  
Opt ("PixelCoordMode",2)
  
或AutoItSetOption  ("PixelCoordMode",2)
  
常用的有:
  
Opt ("PixelCoordMode",2)    ;设置用于象素函数的坐标参照
  
Opt ("GUIEventOptions ",1)   ;修改特殊的 GUI 函数的返回值类型
  
Opt ("MouseClickDelay",500)  ;更改每个鼠标点击命令之间的延迟时间长度
  
Opt ("SendKeyDelay ",1000)   ;更改发送键击命令之间的延迟时间长度
  
Opt ("TrayIconDebug ",1)    ;在托盘图标上显示当前脚本执行到的那一行的相关信息(工具提示)以助调试
  
Opt ("WinWaitDelay ",500)  ;更改每次成功执行窗口相关操作后的延迟时间长度
  
更多运行参数设置可以参考AutoItSetOption帮助文档说明
15.             加密解密15.1.      加密
  
;$bEncrypted 为加密后字符串
  
_Crypt_Startup()
  
$hKey=_Crypt_DeriveKey("sop",$CALG_RC4)
  
$bEncrypted =_Crypt_EncryptData("待加密字符",$hKey,$CALG_USERKEY)
  
_Crypt_DestroyKey($hKey)
  
_Crypt_Shutdown()
  
这里加密的是一个16进制的字符串,其中加密匙可以自己设置,示例中为sop,其中加密算法为AutoIt内置的$CALG_RC4,还可以为$CALG_RC2等等其他。
15.2.      解密
  
;$ encrypt为解密后字符串
  
$bData = Binary(“加密的字符”)
  
$encrypt =  BinaryToString(_Crypt_DecryptData($bData, "sop", $CALG_RC4))
  
很简单的两行,不过其中的解密匙和解密算法要跟之前的加密参数对应。
16.             GUI操作
GUI操作包括创建窗口面板,在面板上创建表单控件及其互动事件处理等一系列连贯配置:
  
$hWnd=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_close
  
  
_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
  
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($hWinHandle,$iMsg,$wParam,$lParam)
  
       ……  
  
EndFunc
  
这里是针对按钮设置了点击触发事件。
17.             IE操作
IE操作,不像GUI界面一样,通过AutoIt Window Info就能得到相关控件,进而获取控件句柄进行操作。
我们在操作IE网页时候,需要事先获取HTML页面中的相关Dom节点或元素,所以需要对HTML有一些了解。下面是一个简单的例子:
  
$oIE = _IECreate  ("www.baidu.com",0,1,1,0)
  
_IEPropertySet ($oIE,  "statustext","欢迎访问")
  
$oForm = _IEFormGetObjByName ($oIE,  "f")   ; 查找表单名
  
$oQuery1 =  _IEFormElementGetObjByName ($oForm, "wd") ;查找表单控件
  
_IEFormElementSetValue ($oQuery1,  "赋值")   ;给控件赋值
  
_IEFormSubmit ($oForm,1)   ;点击提交表单请求
  
实例是一个简单操作,打开一个IE窗口,访问百度,然后在搜索网页表单,输入一个要查询的关键字,点击百度搜索。
一般网页很多超链接,对于这些链接的页面,都有很多的Dom节点嵌套,单纯的以对象名称不一定能够获取到某个操作的对象,这时需要从顶级Dom节点,一级一级缩小范围,直到获取到最终操作对象节点,如下所示:
  
$oIE = _IECreate ("www.url.com",0,1,1,0)
  
$iFrame = _IEFrameGetObjByName  ($oIE, "iFrame")
  
$oDiv = _IEGetObjById ($iFrame,  "divId")
  
$ohrefArray =  _IETagNameGetCollection ($oDiv,"a")
  
For $oLink In $ohrefArray
  
       If  $oLink.href = "http://bbs.url.com" then
  
              _IEAction($oLink,'click')
  
              ExitLoop
  
       EndIf
  
Next
  
这里实例主要是从一个打开的浏览器窗口,获取名为iFrame的frame页面,然后获取其中为Id为divId的节点,进而,取到divId节点下的所有超链接对象,最后一个一个判断,找到某个url,点击超链接。

18.             自定义函数
把一些常用而相关逻辑的操作,抽离出来,独立成一个模块,供脚本调用,这就需要涉及到自定义函数。
用户可通过使用 Func...EndFunc 语句来自定义函数,函数中可以有Return返回值,也可以无,下面我们列出了一些常用的自定义函数,供参考:
  
#include <include/String.au3>
  
#Include <include/date.au3>
  
#include <include/Array.au3>
  
#Include  <include/EventLog.au3>
  
#Include <include/File.au3>
  
#Include  <include/ScreenCapture.au3>
  
#include  <include/GUIListBox.au3>
  
#include <include/Crypt.au3>
  
  
;获取配置文件
  
Func GetConfigFile()
  
       Return  String("D:\Digitalchina\AutoAgent\scripts\ConfigParameter.ini")
  
EndFunc
  
  
;根据给定的日期格式字符串转换成当前日期格式
  
Func ReplaceDateStr($DateStr)
  
       Select
  
       Case  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  StringInStr($DateStr,"YYYY/MM/DD")
  
              Return  StringReplace($DateStr,"YYYY/MM/DD",DateYYYY()  &"/"& DateMM() &"/"& DateDD())
  
       Case  StringInStr($DateStr,"ABCDD-YYYY")
  
              ;ABC代表英文的短月份格式,如1月=Jan
  
              Return  StringReplace($DateStr,"ABCDD-YYYY",_DateToMonth(@MON,1) &  DateDD() &"-"& DateYYYY())
  
       Case  StringInStr($DateStr,"MMDD")
  
              Return  StringReplace($DateStr,"MMDD", DateMM() & DateDD())
  
       Case  Else
  
              Return  $DateStr
  
       EndSelect
  
EndFunc
  
  
;返回日期格式
  
Func DateYYYY()
  
       Return  String(@YEAR)
  
EndFunc
  
Func DateYY()
  
       Return  StringRight(String(@YEAR),2)
  
EndFunc
  
Func DateMM()
  
       Return  String(@MON)
  
EndFunc
  
Func DateDD()
  
       Return  String(@MDAY)
  
EndFunc
  
  
;写日志,截屏等操作
  
;$fileName 日志文件
  
;$flag 操作标识 1为成功,0为失败
  
;$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 Then
  
              SaveImage($File_jpg)
  
       EndIf
  
       ;脚本执行结果文件
  
       $file1=FileOpen($File_dat,2)
  
       FileWriteLine($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  = "画图"
  
       $saveWin  = "保存为"
  
       $imgFilePath  = StringReplace(GetConfigFile(),"scripts\ConfigParameter.ini",$imgFile)
  
       If  WinWait($picWin,"",10) Then
  
              WinActivate($picWin)
  
              Send("^v")
  
              If  WinActivate($warnWin) Then  ControlClick($warnWin,"","Button1")
  
              WinMenuSelectItem($picWin,"","文件","保存")
  
              If  WinWait($saveWin,"",5) Then
  
                     WinActivate($saveWin)
  
                     ControlSetText($saveWin,"","Edit1",$imgFilePath)
  
                     ControlCommand($saveWin,"","ComboBox3","SelectString",  "JPEG (*.JPG;*.JPEG;*.JPE;*.JFIF)")
  
                     ControlClick($saveWin,"","Button2")
  
                     If  WinWait($saveWin,"已存在",5) Then
  
                            ControlClick($saveWin,"已存在","Button1")
  
                     EndIf      
  
              EndIf
  
              WinWait($imgFile)
  
              If  WinExists($imgFile) Then WinClose($imgFile)
  
       EndIf
  
EndFunc
  
  
;判断窗口
  
;$win 窗口名称
  
;返回值 如果找存在返回1,否则返回0
  
Func ChkProgram($win)
  
       Dim  $ret
  
       $ret=-1
  
       If  WinExists($win) Then
  
              $ret  =1  
  
       Else
  
              $ret  =0         
  
       EndIf
  
       Return  $ret
  
EndFunc
  
  
;判断程序进程
  
;$process 进程名称
  
;返回值 如果找存在返回1,否则返回0
  
Func ChkService($process)
  
       Dim  $ret
  
       $ret=-1
  
       $flag  = ProcessExists($process)
  
       If  $flag=0 Then
  
              $ret  =0
  
       Else
  
              $ret  =1
  
       EndIf
  
       Return  $ret
  
EndFunc
  
  
;根据给定的字符串匹配ListBox控件中的数据
  
;$title 窗口标题
  
;$listBoxCmp ListBox控件
  
;$matchStr 匹配字符串.如果字符串以"&&"连接,则匹配所有,如果字符串以"||"连接则匹配部分
  
;返回值 如果找到匹配的字符串返回1,否则返回0
  
Func  MatchListBox($title,$listBoxCmp,$matchStr)
  
       Dim  $ret,$count
  
       $ret=0
  
       $num=0
  
       $flag=1
  
       WinActivate($title)
  
       If  StringInStr($matchStr,'||')>0 Then
  
              $array  = StringSplit($matchStr, '||', 1)
  
              $flag=0
  
       Else
  
              $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 + 1
  
                     If  $flag Then
  
                            If  $num = $array[0] Then
  
                                   $ret=1
  
                                   ExitLoop
  
                            EndIf
  
                     Else
  
                            $ret=1
  
                            ExitLoop
  
                     EndIf      
  
              EndIf      
  
       Next
  
       Return  $ret
  
EndFunc
  
  
;匹配ListView控件字符串
  
;$title 窗口标题
  
;$listViewCmp ListView控件
  
;$cols 要查找的列,从0开始
  
;$matchStr 匹配字符串
  
;返回值 如果找到匹配的字符串返回1,否则返回0
  
Func  MatchListView($title,$listViewCmp,$cols,$matchStr)
  
       Dim  $ret,$count,$rows
  
       $ret=0
  
       WinActivate($title)
  
       $rows  = ControlListView($Title,"",$listViewCmp,"GetItemCount")
  
       $count=0
  
       For  $i=0 To $rows-1
  
              $iText  = ControlListView($Title,"",$listViewCmp,"GetText", $i,  $cols)
  
              If  StringInStr($iText,$matchStr)>0 Then
  
                     $count=$count+1
  
              EndIf      
  
       Next
  
       If  $count=$rows Then $ret=1
  
       Return  $ret
  
EndFunc
  
  
;匹配日志文件字符串
  
;$logFile 日志文件
  
;$matchStr 匹配字符串.如果字符串以"&&"连接,则匹配所有,如果字符串以"||"连接则匹配部分
  
;返回值 如果找到匹配的字符串返回1,否则返回0
  
Func  MatchLogFile($logFile,$matchStr)
  
       Dim  $line,$array,$result,$count,$flag
  
       $result=0
  
       $count=0
  
       $flag=1
  
       If  StringInStr($matchStr,'||')>0 Then
  
              $array  = StringSplit($matchStr, '||', 1)
  
              $flag=0
  
       Else
  
              $array  = StringSplit($matchStr, '&&', 1)
  
       EndIf
  
       $file  = FileOpen($logFile, 0)
  
       if  $file = -1 Then
  
              Return  -1
  
       EndIf
  
       While  1
  
              $line  = FileReadLine($file)
  
              If  @error = -1 Then
  
                     ExitLoop
  
              EndIf
  
              If  MatchStrArray($line,$array) Then
  
                     $count  = $count+1
  
                     If  $flag Then
  
                            If  $count=$array[0] Then
  
                                   $result  = 1
  
                                   ExitLoop      
  
                            EndIf
  
                     Else
  
                            $result  = 1
  
                            ExitLoop
  
                     EndIf
  
              EndIf
  
       Wend
  
       FileClose($file)
  
       Return  $result
  
EndFunc
  
  
;匹配子字符串是否存在
  
;$str 目标字符串
  
;$arr 匹配字符串
  
;返回值 如果找到匹配的字符串返回1,否则返回0
  
Func MatchStrArray($str,$arr)
  
       $flag  = 0
  
       For  $i=1 To $arr[0]
  
              If  StringInStr($str,$arr[$i])>0 Then
  
                     $flag  = 1
  
                     ExitLoop
  
              EndIf      
  
       Next
  
       Return  $flag
  
EndFunc
  
  
Func DecryptPwd($encryptStr)
  
       $pwdStr  = ""
  
       If  $encryptStr<>"" Then
  
              $bEncrypted  = Binary($encryptStr)
  
              $pwdStr  = BinaryToString(_Crypt_DecryptData($bEncrypted, "sop", $CALG_RC4))
  
       EndIf      
  
       Return  $pwdStr
  
EndFunc
  
上面实例函数用到了AutoIt内部函数库,通过
#include 关键字包含了进来。

19.             Windows锁屏处理办法
锁屏解释:
1、  当windows操作系统被锁屏时,实际上是在所有窗口(包括隐藏的)的前面再新开了一个窗口,完全遮挡住先前的窗口,这样大家就看不到了,autoit说这个窗口叫“Always on TOP”。
2、  被遮挡的窗口虽然看不到了,但是还在,只是变成了隐藏模式,找到他们,是可以执行快捷方式命令的;但窗口界面操作是不行的,主要原因是没法激活


Send 和 ControlSend 命令
Send 命令必须要在激活窗口的条件下才能正确执行
ControlSend命令可以不需要激活窗口就能执行


20.             附录
实例介绍,相关说明请参考代码中的注释:
  
;导入需要用到的外部参数
  
#include <inc.au3>
  
#include <guiCmp.au3>
  
  
;定义变量
  
Dim  $yyyymd1,$yyyymd2,$yyyymd3,$flag,$ret
  
给变量赋值
  
$flag = 0
  
$ret = 0
  
  
;从ini文件中,获取相关配置数据
  
$programPath =  IniRead(GetConfigFile(),"HQZR","programPath","")
  
$showDataFile =  IniRead(GetConfigFile(),"HQZR","showDataFile","")
  
$hqDataFile =  IniRead(GetConfigFile(),"HQZR","hqDataFile","")
  
$xxDataFile =  IniRead(GetConfigFile(),"HQZR","xxDataFile","")
  
  
;调用JudgeTime函数
  
;如果当前时间不到9:20 则暂停10秒后继续判断,直到9:20
  
While JudgeTime()<0
  
       Sleep(10000)
  
WEnd
  
  
;获取文件的修改时间,并按照一定的格式组合
  
$d1 = FileGetTime($showDataFile, 0)
  
$yyyymd1 =  $d1[0]&$d1[1]&$d1[2]
  
  
$d2 = FileGetTime($hqDataFile, 0)
  
$yyyymd2 =  $d2[0]&$d2[1]&$d2[2]
  
  
$d3 = FileGetTime($xxDataFile, 0)
  
$yyyymd3 =  $d3[0]&$d3[1]&$d3[2]
  
  
;将组合的日期格式代入函数MathDate中,判断其是否是当前日期
  
;这里有三个文件的判断,都需要成立
  
If MathDate($yyyymd1)=1 And  MathDate($yyyymd2)=1 And MathDate($yyyymd3)=1 Then
  
       $flag  = 1
  
EndIf
  
  
;根据给定的路径,启动程序
  
Run($programPath)
  
;等待程序启动,并出现窗口
  
WinWait($hqzrWinTitle,"",$WaitWinTime)
  
;判断程序窗口是否存在
  
If WinExists($hqzrWinTitle) Then
  
       ;根据前面的条件判断,如果成立则执行以下步骤
  
       If  $flag=1 Then
  
              ;激活程序窗口
  
              WinActivate($hqzrWinTitle)
  
              ;点击窗口的某个按钮
  
              ControlClick($hqzrWinTitle,"",$hqzrExecuteBtn,"left",1)
  
              ;置标志位,并暂停脚本1秒钟,继续执行
  
              $ret  = 1
  
              Sleep(1000)
  
       EndIf      
  
EndIf
  
  
;根据前面给定的标志位判断,然后调用WriteLog函数,执行文件写入和截屏操作
  
If $flag = 1 And $ret = 1 Then
  
       WriteLog($CmdLine[1],"1","行情转入启动成功")
  
Else
  
       WinClose($hqzrWinTitle,"")
  
       WriteLog($CmdLine[1],"0","行情转入启动有误")
  
EndIf
  
  
;根据给定的字符串与日期组合的字符串进行判断
  
;$matchDate 给定的字符串
  
;返回值:如果给定的字符串和日期组合字符串相同,则返回1,否则返回0
  
Func MathDate($matchDate)
  
       $ret  = 0
  
       $curDate  = DateYYYY()&DateMM()&DateDD()
  
       If  $matchDate = $curDate Then
  
              $ret  = 1
  
       EndIf      
  
       Return  $ret
  
EndFunc
  
  
;根据时间组合字符串判断是否大于9:20
  
;返回值:如果当前时间大于9:20,则返回1,否则返回0
  
Func JudgeTime()
  
       $ret  =0
  
       $curTime  = String(@HOUR)&String(@MIN)
  
       If  $curTime>="0920" Then
  
              $ret  = 1
  
       EndIf
  
       Return  $ret
  
EndFunc
  


回复

使用道具 举报

293

主题

6

回帖

4093

积分

管理员

积分
4093
file:///C:\Users\SUNJIA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image002.jpgAutoIt快速开发指南
神州数码系统集成服务有限公司
AutoIt快速开发指南... 1
1.    启动程序... 2
2.    窗口操作... 2
3.    菜单操作... 4
4.    工具栏操作... 4
5.    表单控件操作... 5
5.1      文本框... 5
5.2      选择控件... 6
6.    点击操作... 7
6.1      控件点击... 7
6.2      鼠标点击... 7
7.    键盘操作... 8
7.1      一般字符... 8
7.2      快捷操作... 8
8.    字符串处理... 8
9.    数组处理... 9
9.1      一般数组... 9
9.2      特殊数组... 9
10.      日期时间... 10
11.      像素捕获... 11
12.      文件操作... 11
12.1.      一般文件... 11
12.2.      ini文件... 12
13.      常用控件操作... 12
13.1.      ListBox控件... 12
13.2.      ListView控件... 13
14.      运行参数设置... 14
15.      加密解密... 14
15.1.      加密... 14
15.2.      解密... 15
16.      GUI操作... 15
17.      IE操作... 16
18.      自定义函数... 17
19.      附录... 27

1.      启动程序
启动exe类型文件,一般使用Run函数
Run(“路径”)
如:
  
Run(“D:\Java\MyEclipse  6\eclipse\eclipse.exe”)
  

如果运行该函数,程序还没有启动起来,请配置好程序运行的工作目录
Run(“路径”,”工作目录”)
如:
  
Run(“D:\Java\MyEclipse  6\eclipse\eclipse.exe”,” D:\Java\MyEclipse 6\eclipse”)
  
file:///C:\Users\SUNJIA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image004.jpg
注:有时程序的目录不一定和工作目录相同

启动lnk,txt等文件一般使用ShellExecute函数
该函数除了可以指定工作目录外,还可以设置启动参数

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

下面是一个例子,一般在很多地方用到,特别是程序启动或者运行到某个步骤,等待其他窗口处理,一般采用以下脚本判断
  
WinWait(“窗口标题”, "窗口文本", ”等待时间”)
  
If WinExists(“窗口标题”) Then
  
       WinActivate(“窗口标题”)
  
       ……
  
EndIf
  
不建议使用WinWaitActive(“窗口标题”,"窗口文本",”等待时间”),否则,如果该窗口处于非激活状态,会使脚本一直等待直到超时,按照非预设的流程解析运行下去,得不到预期结果。
3.      菜单操作
file:///C:\Users\SUNJIA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image006.jpg

菜单点击使用WinMenuSelectItem函数
  
WinMenuSelectItem(“窗口标题”,"", ”主菜单” , ”子菜单1”, ”子菜单2”  ……)
  
例如点击窗口菜单的文件=》保存
  
WinMenuSelectItem(“未命名 — 画图”,"", ”文件”  , ” 保存”)
  
当该函数无法操作菜单时候(一般为非标准的Windows GUI),可以在工具栏查找该菜单的快捷启动按钮或者通过发送快捷键进行控制

4.      工具栏操作
file:///C:\Users\SUNJIA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image008.jpg
对于工具栏快速按钮,可以使用ControlCommand函数处理,菜单操作中很多快捷方式一般都放在工具栏中,这种情况可以多一个选择。
  
ControlCommand(“窗口标题”, "窗口文本", ”工具栏控件名” , "SendCommandID", ”控件ID”)
  
ControlCommand只能操作ToolbarWindow32类型的控件。
控件ID需要通过Windows Info工具获取。

5.      表单控件操作5.1 文本框
file:///C:\Users\SUNJIA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image010.jpg
在文本框输入数据使用:
ControlSetText(“标题”,"",”控件名或ID” ,”输入的字符串数据”)
如果需要获取文本框的数据,则使用
ControlGetText(“标题”,"",”控件名或ID”)
ControlSetText和ControlGetText可以操作单行文本框,密码输入框,多行文本框等。
5.2 选择控件
file:///C:\Users\SUNJIA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image012.jpg
选择控件使用ControlCommand函数操作,可以操作单选多选以及单行多行下拉选择(ComboBox和ListBox)等控件。
如选择下拉框的某个选项:
  
ControlCommand(“窗口标题”, "", 控件类名或ID , "SelectString", 选中选项文本)
  
而针对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)
  
       ……
  
Next
  

6.      点击操作6.1 控件点击
控件点击一般使用:
  
ControlClick("窗口标题","","控件名或ID","按钮","点击次数")
  
按钮分左键(left),右键(right)等
此外还可以在函数后面添加坐标,这对于占用屏幕区域比较大的时候,精确点击某个位置触发其他操作比较重要
比如在一个表格中,需要右击某一行记录,弹出右键菜单的情况。


6.2 鼠标点击
  
MouseClick(“按钮”, “X坐标”,”Y坐标”,”点击次数”)
  
MouseClick函数对于任何点击操作都有效,
唯一不理想的是,它涉及坐标点的确定,降低了程序的通用性。
如果非要这么做,建议:
1)       将当前窗口激活,并最大化
  
WinActivate("窗口标题", "")
  
WinSetState("窗口标题", "", @SW_MAXIMIZE)
  
;接下来进行鼠标点击相关操作
  
……
  
2)       如果当前窗口禁用最大化,则使用当前窗口相对坐标进行操作
  
AutoItSetOption ( " MouseCoordMode" , 1)   ;这里指相对当前激活窗口的坐标
  
WinActivate("窗口标题", "")
  
;接下来进行鼠标点击相关操作
  
……
  

7.      键盘操作
键盘操作一般使用Send函数,想激活窗口发送模拟键盘操作
7.1 一般字符
这种情况指向当前激活窗口文本框,发送按键字符,如:
  
Send("向光标激活地方发送的字符串")
  

7.2 快捷操作
这种情况一般没有光标的输入,只是针对当前的激活窗口的一些快捷操作,比如按键”ctrl+S”是保存等,如
  
Send("^s")
  
另外一些快捷键如:
  
Ctrl=^
  
Alt=!
  
Win=#
  
Shift=+
  
其他如:
  
Send(“{ PRINTSCREEN}”)   截屏键
  
Send(“{ SPACE}”)         空格键
  
Send(“{ ENTER}”)         回车键
  
Send(“{ BACKSPACE}”)    退格键
  
……
  

8.      字符串处理
针对字符串的处理,一般常需要判断字符串是否存在,或对字符串进行拆分、替换等,下面用一个例子来说明一下:
一个用&&连接的子字符串,需要跟某段文字进行匹配,如果发现存在子存在,则替换成指定的字符串
  
$originalStr="………………"
  
$matchStr="政府&&奶奶的"
  
$array = StringSplit($matchStr,  '&&', 1)
  
If $i=1 To $array[0] Then
  
       If  StringInStr($originalStr,$array[$i])>0 Then
  
              $originalStr =  StringReplace($originalStr,$array[$i,"XXX")
  
       EndIf
  
EndIf
  
其他可以参考官方帮助文档。
9.      数组处理
数组可以包含不同数据类型的数据,处理起来有两种情况需要注意
9.1一般数组
这个跟其他程序语言无太大的差别,如下所示:
  
Dim $array[2]
  
$array[0]=1
  
$array[1]=2
  
注意下标从0开始
9.2特殊数组
特殊数组指某些函数的返回值为数组的情况,或是在运行脚本时候,传递给命令行的参数,AutoIT会初始化一个特殊的数组,这些数组下标也是从0开始,但是为0的项保存的是数组的个数。
l  命令行返回数组
对于脚本参数数组为$CmdLine,可以直接使用
$CmdLine[0] ;参数的数量
$CmdLine[1] ;第一个参数(脚本名称后面)
$CmdLine[2] ;第二个参数
...
$CmdLine[$CmdLine[0]] ;可以用来表示得到最后一个参数...

如果脚本是像下面这样被运行的话:
AutoIt3.exe myscript.au3 参数1 "这是 一个其它参数"
$CmdLine[0] 等价于...2
$CmdLine[1] 等价于...参数1
$CmdLine[2] 等价于...这是一个其它参数
@ScriptName 等价于...myscript.au3

l  函数返回数组
前面用到的StringSplit函数返回值也是一个数组,0位保存的是数组项的个数,数组内却是从1开始计数
  
$matchStr="11&&22&33"
  
$array = StringSplit($matchStr,  '&&', 1)
  
如上:
  
$array[0]  等于4
  
$array[1]  等于”11”
  
$array[2]  等于”22”
  
$array[3]  等于”33”  
  

其他还有另外一些特殊的函数,如FileGetTime,WinList等等很多函数,返回值都是数组的情况,具体用法可能有些差异,这些可以参考相关文档。
10.             日期时间
当前日期时间,可以直接从日期和时间宏中获取,如:
@SEC   当前时钟的秒值,值的范围是 00 到 59
@MIN  当前时钟的分值,值的范围是00 到 59
@HOUR 当前时钟的时值(24时制),值的范围是00 到 23
@MDAY 当天属本月的第几天,值的范围是 01 到 31
@MON  当前月份,值的范围是01到 12
@YEAR  当前年份(4位数)  

计算指定日期间隔后的新日期:
_DateAdd(“计算类型”,“间隔数”, “指定日期”)

计算两个指定日期的间隔:
_DateDiff(“计算类型”,“计算的开始日期”, “计算的结束日期”)

11.             像素捕获
像素捕获主要去获取屏幕某块区域像素点的色值,以此和给定的颜色色值来比较判断是否一致。
  
WinActivate("窗口标题")
  
$Handle = WinGetHandle("窗口标题","")
  
AutoItSetOption  ("PixelCoordMode",2)
  
$Color = PixelGetColor(X坐标,Y坐标,$Handle)
  
$ColorStr = Hex($Color,6)
  
在实际情况中,有时可能不止获取一个点的像素就够了,这时可以通过获取窗口的相关WinGetPos("窗口标题","")坐标位置,然后对某个区块进行扫描。

12.             文件操作12.1.      一般文件
对于一般文本文件的读取:可以使用FileOpen打开文件,在按照要求读取文件内容:
  
$fHandle = FileOpen("文件", 0)
  
if $fHandle <> -1 Then
  
       While  1
  
              $line  = FileReadLine($fHandle)
  
              If  @error = -1 Then ExitLoop
  
       Wend
  
EndIf
  
FileClose($fHandle)
  
如果文件被独占打开,进行FileOpen操作时候,获取不到文件操作句柄,无法对文件进行读写操作,这时,如果只是针对文件读,可以将独占打开的文件进行一下复制,然后用拷贝文件进行目标操作。
  
FileCopy("原文件", "目标文件或路径", 1)
  
12.2.      ini文件
对于ini类型文件,形如:
[字段名]
关键字=数值
文件中可以有多个不同的字段名,每个字段名下有多个关键字,不同字段名下的关键字可以相同。
读取ini文件:
  
IniRead ( "文件名", "字段名", "关键字", "默认值" )
  
写入ini文件:
  
IniWrite ( "文件名", "字段名", "键名", "值" )
  
删除ini文件:
  
IniDelete ( "文件名", "字段名" [, "关键字"] )
  

13.             常用控件操作13.1.      ListBox控件
ListBox控件,如图所示:
file:///C:\Users\SUNJIA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image014.jpg
在前面提到选择控件,ListBox也是其中一种,前面介绍了如何选中的某行选项,但是在真正的ListBox空间中,多半是记录相关软件运行时的一些状态参数记录,需要做的只判断其中打印的相关记录:
  
$hWnd = ControlGetHandle("窗口标题","",ListBox控件名)
  
$count =  _GUICtrlListBox_GetCount($hWnd)
  
For $i=0 To $count-1
  
       $hLabel  = _GUICtrlListBox_GetText($hWnd, $i)
  
Next
  
其中第一行是获取控件操作句柄,第二行根据句柄获取控件的记录条数,最后根据记录上遍历,获取每一条记录。
13.2.      ListView控件
ListView控件展示形如表格,如图所示:
file:///C:\Users\SUNJIA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image016.jpg
其操作如下
  
$rows = ControlListView("窗口标题","","ListView控件名","GetItemCount")
  
For $i=0 To $rows-1
  
       $iText  = ControlListView("窗口标题","","ListView控件名","GetText", $i, "列名序号")
  
Next
  
上面代码,我们首先获取行数,然后指定某列,获取其所有行的文本。
更多ListView操作可以参考ControlListView函数说明。

14.             运行参数设置
运行参数设置可以调整Autoit各种函数/参数的运作方式,可以通过Opt或者AutoItSetOption函数来设置:
  
AutoItSetOption ( "选项" [, 参数] )
  
如:
  
Opt ("PixelCoordMode",2)
  
或AutoItSetOption  ("PixelCoordMode",2)
  
常用的有:
  
Opt ("PixelCoordMode",2)    ;设置用于象素函数的坐标参照
  
Opt ("GUIEventOptions ",1)   ;修改特殊的 GUI 函数的返回值类型
  
Opt ("MouseClickDelay",500)  ;更改每个鼠标点击命令之间的延迟时间长度
  
Opt ("SendKeyDelay ",1000)   ;更改发送键击命令之间的延迟时间长度
  
Opt ("TrayIconDebug ",1)    ;在托盘图标上显示当前脚本执行到的那一行的相关信息(工具提示)以助调试
  
Opt ("WinWaitDelay ",500)  ;更改每次成功执行窗口相关操作后的延迟时间长度
  
更多运行参数设置可以参考AutoItSetOption帮助文档说明
15.             加密解密15.1.      加密
  
;$bEncrypted 为加密后字符串
  
_Crypt_Startup()
  
$hKey=_Crypt_DeriveKey("sop",$CALG_RC4)
  
$bEncrypted =_Crypt_EncryptData("待加密字符",$hKey,$CALG_USERKEY)
  
_Crypt_DestroyKey($hKey)
  
_Crypt_Shutdown()
  
这里加密的是一个16进制的字符串,其中加密匙可以自己设置,示例中为sop,其中加密算法为AutoIt内置的$CALG_RC4,还可以为$CALG_RC2等等其他。
15.2.      解密
  
;$ encrypt为解密后字符串
  
$bData = Binary(“加密的字符”)
  
$encrypt =  BinaryToString(_Crypt_DecryptData($bData, "sop", $CALG_RC4))
  
很简单的两行,不过其中的解密匙和解密算法要跟之前的加密参数对应。
16.             GUI操作
GUI操作包括创建窗口面板,在面板上创建表单控件及其互动事件处理等一系列连贯配置:
  
$hWnd=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_close
  
  
_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
  
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($hWinHandle,$iMsg,$wParam,$lParam)
  
       ……  
  
EndFunc
  
这里是针对按钮设置了点击触发事件。
17.             IE操作
IE操作,不像GUI界面一样,通过AutoIt Window Info就能得到相关控件,进而获取控件句柄进行操作。
我们在操作IE网页时候,需要事先获取HTML页面中的相关Dom节点或元素,所以需要对HTML有一些了解。下面是一个简单的例子:
  
$oIE = _IECreate  ("www.baidu.com",0,1,1,0)
  
_IEPropertySet ($oIE,  "statustext","欢迎访问")
  
$oForm = _IEFormGetObjByName ($oIE,  "f")   ; 查找表单名
  
$oQuery1 =  _IEFormElementGetObjByName ($oForm, "wd") ;查找表单控件
  
_IEFormElementSetValue ($oQuery1,  "赋值")   ;给控件赋值
  
_IEFormSubmit ($oForm,1)   ;点击提交表单请求
  
实例是一个简单操作,打开一个IE窗口,访问百度,然后在搜索网页表单,输入一个要查询的关键字,点击百度搜索。
一般网页很多超链接,对于这些链接的页面,都有很多的Dom节点嵌套,单纯的以对象名称不一定能够获取到某个操作的对象,这时需要从顶级Dom节点,一级一级缩小范围,直到获取到最终操作对象节点,如下所示:
  
$oIE = _IECreate ("www.url.com",0,1,1,0)
  
$iFrame = _IEFrameGetObjByName  ($oIE, "iFrame")
  
$oDiv = _IEGetObjById ($iFrame,  "divId")
  
$ohrefArray =  _IETagNameGetCollection ($oDiv,"a")
  
For $oLink In $ohrefArray
  
       If  $oLink.href = "http://bbs.url.com" then
  
              _IEAction($oLink,'click')
  
              ExitLoop
  
       EndIf
  
Next
  
这里实例主要是从一个打开的浏览器窗口,获取名为iFrame的frame页面,然后获取其中为Id为divId的节点,进而,取到divId节点下的所有超链接对象,最后一个一个判断,找到某个url,点击超链接。

18.             自定义函数
把一些常用而相关逻辑的操作,抽离出来,独立成一个模块,供脚本调用,这就需要涉及到自定义函数。
用户可通过使用 Func...EndFunc 语句来自定义函数,函数中可以有Return返回值,也可以无,下面我们列出了一些常用的自定义函数,供参考:
  
#include <include/String.au3>
  
#Include <include/date.au3>
  
#include <include/Array.au3>
  
#Include  <include/EventLog.au3>
  
#Include <include/File.au3>
  
#Include  <include/ScreenCapture.au3>
  
#include  <include/GUIListBox.au3>
  
#include <include/Crypt.au3>
  
  
;获取配置文件
  
Func GetConfigFile()
  
       Return  String("D:\Digitalchina\AutoAgent\scripts\ConfigParameter.ini")
  
EndFunc
  
  
;根据给定的日期格式字符串转换成当前日期格式
  
Func ReplaceDateStr($DateStr)
  
       Select
  
       Case  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  StringInStr($DateStr,"YYYY/MM/DD")
  
              Return  StringReplace($DateStr,"YYYY/MM/DD",DateYYYY()  &"/"& DateMM() &"/"& DateDD())
  
       Case  StringInStr($DateStr,"ABCDD-YYYY")
  
              ;ABC代表英文的短月份格式,如1月=Jan
  
              Return  StringReplace($DateStr,"ABCDD-YYYY",_DateToMonth(@MON,1) &  DateDD() &"-"& DateYYYY())
  
       Case  StringInStr($DateStr,"MMDD")
  
              Return  StringReplace($DateStr,"MMDD", DateMM() & DateDD())
  
       Case  Else
  
              Return  $DateStr
  
       EndSelect
  
EndFunc
  
  
;返回日期格式
  
Func DateYYYY()
  
       Return  String(@YEAR)
  
EndFunc
  
Func DateYY()
  
       Return  StringRight(String(@YEAR),2)
  
EndFunc
  
Func DateMM()
  
       Return  String(@MON)
  
EndFunc
  
Func DateDD()
  
       Return  String(@MDAY)
  
EndFunc
  
  
;写日志,截屏等操作
  
;$fileName 日志文件
  
;$flag 操作标识 1为成功,0为失败
  
;$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 Then
  
              SaveImage($File_jpg)
  
       EndIf
  
       ;脚本执行结果文件
  
       $file1=FileOpen($File_dat,2)
  
       FileWriteLine($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  = "画图"
  
       $saveWin  = "保存为"
  
       $imgFilePath  = StringReplace(GetConfigFile(),"scripts\ConfigParameter.ini",$imgFile)
  
       If  WinWait($picWin,"",10) Then
  
              WinActivate($picWin)
  
              Send("^v")
  
              If  WinActivate($warnWin) Then  ControlClick($warnWin,"","Button1")
  
              WinMenuSelectItem($picWin,"","文件","保存")
  
              If  WinWait($saveWin,"",5) Then
  
                     WinActivate($saveWin)
  
                     ControlSetText($saveWin,"","Edit1",$imgFilePath)
  
                     ControlCommand($saveWin,"","ComboBox3","SelectString",  "JPEG (*.JPG;*.JPEG;*.JPE;*.JFIF)")
  
                     ControlClick($saveWin,"","Button2")
  
                     If  WinWait($saveWin,"已存在",5) Then
  
                            ControlClick($saveWin,"已存在","Button1")
  
                     EndIf      
  
              EndIf
  
              WinWait($imgFile)
  
              If  WinExists($imgFile) Then WinClose($imgFile)
  
       EndIf
  
EndFunc
  
  
;判断窗口
  
;$win 窗口名称
  
;返回值 如果找存在返回1,否则返回0
  
Func ChkProgram($win)
  
       Dim  $ret
  
       $ret=-1
  
       If  WinExists($win) Then
  
              $ret  =1  
  
       Else
  
              $ret  =0         
  
       EndIf
  
       Return  $ret
  
EndFunc
  
  
;判断程序进程
  
;$process 进程名称
  
;返回值 如果找存在返回1,否则返回0
  
Func ChkService($process)
  
       Dim  $ret
  
       $ret=-1
  
       $flag  = ProcessExists($process)
  
       If  $flag=0 Then
  
              $ret  =0
  
       Else
  
              $ret  =1
  
       EndIf
  
       Return  $ret
  
EndFunc
  
  
;根据给定的字符串匹配ListBox控件中的数据
  
;$title 窗口标题
  
;$listBoxCmp ListBox控件
  
;$matchStr 匹配字符串.如果字符串以"&&"连接,则匹配所有,如果字符串以"||"连接则匹配部分
  
;返回值 如果找到匹配的字符串返回1,否则返回0
  
Func  MatchListBox($title,$listBoxCmp,$matchStr)
  
       Dim  $ret,$count
  
       $ret=0
  
       $num=0
  
       $flag=1
  
       WinActivate($title)
  
       If  StringInStr($matchStr,'||')>0 Then
  
              $array  = StringSplit($matchStr, '||', 1)
  
              $flag=0
  
       Else
  
              $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 + 1
  
                     If  $flag Then
  
                            If  $num = $array[0] Then
  
                                   $ret=1
  
                                   ExitLoop
  
                            EndIf
  
                     Else
  
                            $ret=1
  
                            ExitLoop
  
                     EndIf      
  
              EndIf      
  
       Next
  
       Return  $ret
  
EndFunc
  
  
;匹配ListView控件字符串
  
;$title 窗口标题
  
;$listViewCmp ListView控件
  
;$cols 要查找的列,从0开始
  
;$matchStr 匹配字符串
  
;返回值 如果找到匹配的字符串返回1,否则返回0
  
Func  MatchListView($title,$listViewCmp,$cols,$matchStr)
  
       Dim  $ret,$count,$rows
  
       $ret=0
  
       WinActivate($title)
  
       $rows  = ControlListView($Title,"",$listViewCmp,"GetItemCount")
  
       $count=0
  
       For  $i=0 To $rows-1
  
              $iText  = ControlListView($Title,"",$listViewCmp,"GetText", $i,  $cols)
  
              If  StringInStr($iText,$matchStr)>0 Then
  
                     $count=$count+1
  
              EndIf      
  
       Next
  
       If  $count=$rows Then $ret=1
  
       Return  $ret
  
EndFunc
  
  
;匹配日志文件字符串
  
;$logFile 日志文件
  
;$matchStr 匹配字符串.如果字符串以"&&"连接,则匹配所有,如果字符串以"||"连接则匹配部分
  
;返回值 如果找到匹配的字符串返回1,否则返回0
  
Func  MatchLogFile($logFile,$matchStr)
  
       Dim  $line,$array,$result,$count,$flag
  
       $result=0
  
       $count=0
  
       $flag=1
  
       If  StringInStr($matchStr,'||')>0 Then
  
              $array  = StringSplit($matchStr, '||', 1)
  
              $flag=0
  
       Else
  
              $array  = StringSplit($matchStr, '&&', 1)
  
       EndIf
  
       $file  = FileOpen($logFile, 0)
  
       if  $file = -1 Then
  
              Return  -1
  
       EndIf
  
       While  1
  
              $line  = FileReadLine($file)
  
              If  @error = -1 Then
  
                     ExitLoop
  
              EndIf
  
              If  MatchStrArray($line,$array) Then
  
                     $count  = $count+1
  
                     If  $flag Then
  
                            If  $count=$array[0] Then
  
                                   $result  = 1
  
                                   ExitLoop      
  
                            EndIf
  
                     Else
  
                            $result  = 1
  
                            ExitLoop
  
                     EndIf
  
              EndIf
  
       Wend
  
       FileClose($file)
  
       Return  $result
  
EndFunc
  
  
;匹配子字符串是否存在
  
;$str 目标字符串
  
;$arr 匹配字符串
  
;返回值 如果找到匹配的字符串返回1,否则返回0
  
Func MatchStrArray($str,$arr)
  
       $flag  = 0
  
       For  $i=1 To $arr[0]
  
              If  StringInStr($str,$arr[$i])>0 Then
  
                     $flag  = 1
  
                     ExitLoop
  
              EndIf      
  
       Next
  
       Return  $flag
  
EndFunc
  
  
Func DecryptPwd($encryptStr)
  
       $pwdStr  = ""
  
       If  $encryptStr<>"" Then
  
              $bEncrypted  = Binary($encryptStr)
  
              $pwdStr  = BinaryToString(_Crypt_DecryptData($bEncrypted, "sop", $CALG_RC4))
  
       EndIf      
  
       Return  $pwdStr
  
EndFunc
  
上面实例函数用到了AutoIt内部函数库,通过
#include 关键字包含了进来。

19.             Windows锁屏处理办法
锁屏解释:
1、  当windows操作系统被锁屏时,实际上是在所有窗口(包括隐藏的)的前面再新开了一个窗口,完全遮挡住先前的窗口,这样大家就看不到了,autoit说这个窗口叫“Always on TOP”。
2、  被遮挡的窗口虽然看不到了,但是还在,只是变成了隐藏模式,找到他们,是可以执行快捷方式命令的;但窗口界面操作是不行的,主要原因是没法激活


Send 和 ControlSend 命令
Send 命令必须要在激活窗口的条件下才能正确执行
ControlSend命令可以不需要激活窗口就能执行


20.             附录
实例介绍,相关说明请参考代码中的注释:
  
;导入需要用到的外部参数
  
#include <inc.au3>
  
#include <guiCmp.au3>
  
  
;定义变量
  
Dim  $yyyymd1,$yyyymd2,$yyyymd3,$flag,$ret
  
给变量赋值
  
$flag = 0
  
$ret = 0
  
  
;从ini文件中,获取相关配置数据
  
$programPath =  IniRead(GetConfigFile(),"HQZR","programPath","")
  
$showDataFile =  IniRead(GetConfigFile(),"HQZR","showDataFile","")
  
$hqDataFile =  IniRead(GetConfigFile(),"HQZR","hqDataFile","")
  
$xxDataFile =  IniRead(GetConfigFile(),"HQZR","xxDataFile","")
  
  
;调用JudgeTime函数
  
;如果当前时间不到9:20 则暂停10秒后继续判断,直到9:20
  
While JudgeTime()<0
  
       Sleep(10000)
  
WEnd
  
  
;获取文件的修改时间,并按照一定的格式组合
  
$d1 = FileGetTime($showDataFile, 0)
  
$yyyymd1 =  $d1[0]&$d1[1]&$d1[2]
  
  
$d2 = FileGetTime($hqDataFile, 0)
  
$yyyymd2 =  $d2[0]&$d2[1]&$d2[2]
  
  
$d3 = FileGetTime($xxDataFile, 0)
  
$yyyymd3 =  $d3[0]&$d3[1]&$d3[2]
  
  
;将组合的日期格式代入函数MathDate中,判断其是否是当前日期
  
;这里有三个文件的判断,都需要成立
  
If MathDate($yyyymd1)=1 And  MathDate($yyyymd2)=1 And MathDate($yyyymd3)=1 Then
  
       $flag  = 1
  
EndIf
  
  
;根据给定的路径,启动程序
  
Run($programPath)
  
;等待程序启动,并出现窗口
  
WinWait($hqzrWinTitle,"",$WaitWinTime)
  
;判断程序窗口是否存在
  
If WinExists($hqzrWinTitle) Then
  
       ;根据前面的条件判断,如果成立则执行以下步骤
  
       If  $flag=1 Then
  
              ;激活程序窗口
  
              WinActivate($hqzrWinTitle)
  
              ;点击窗口的某个按钮
  
              ControlClick($hqzrWinTitle,"",$hqzrExecuteBtn,"left",1)
  
              ;置标志位,并暂停脚本1秒钟,继续执行
  
              $ret  = 1
  
              Sleep(1000)
  
       EndIf      
  
EndIf
  
  
;根据前面给定的标志位判断,然后调用WriteLog函数,执行文件写入和截屏操作
  
If $flag = 1 And $ret = 1 Then
  
       WriteLog($CmdLine[1],"1","行情转入启动成功")
  
Else
  
       WinClose($hqzrWinTitle,"")
  
       WriteLog($CmdLine[1],"0","行情转入启动有误")
  
EndIf
  
  
;根据给定的字符串与日期组合的字符串进行判断
  
;$matchDate 给定的字符串
  
;返回值:如果给定的字符串和日期组合字符串相同,则返回1,否则返回0
  
Func MathDate($matchDate)
  
       $ret  = 0
  
       $curDate  = DateYYYY()&DateMM()&DateDD()
  
       If  $matchDate = $curDate Then
  
              $ret  = 1
  
       EndIf      
  
       Return  $ret
  
EndFunc
  
  
;根据时间组合字符串判断是否大于9:20
  
;返回值:如果当前时间大于9:20,则返回1,否则返回0
  
Func JudgeTime()
  
       $ret  =0
  
       $curTime  = String(@HOUR)&String(@MIN)
  
       If  $curTime>="0920" Then
  
              $ret  = 1
  
       EndIf
  
       Return  $ret
  
EndFunc
  


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

返回顶部