autoit快速开发指南
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Autoit快速开发指南
2012年9月6日
Autoit开发指南
启动程序
启动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”)
注:有时程序的目录不一定和工作目录相同
启动lnk,txt等文件一般使用ShellExecute函数
该函数除了可以指定工作目录外,还可以设置启动参数
1.窗口操作
窗口处理一般都是针对Windows GUI窗口的操作,常用的如下:
;窗口是否存在
还有其他一些处理函数,这个可以直接去查找AutoIt的帮助文档。
下面是一个例子,一般在很多地方用到,特别是程序启动或者运行到某个步骤,等待其他窗口处理,一般采用以下脚本判断
不建议使用WinWaitActive(“窗口标题”,"窗口文本",”等待时间”),否则,如果该窗口处于非激活状态,会使脚本一直等待直到超时,按照非预设的流程解析运行下去,得不到预期结果。
1.菜单操作
菜单点击使用WinMenuSelectItem函数
WinMenuSelectItem(“窗口标题”,"", ”主菜单”, ”子菜单1”, ”子菜单2”……)
例如点击窗口菜单的文件=》保存
WinMenuSelectItem(“未命名—画图”,"", ”文件”, ”保存”)
当该函数无法操作菜单时候(一般为非标准的Windows GUI),可以在工具栏查找该菜单的快捷启动按钮或者通过发送快捷键进行控制
3.工具栏操作
对于工具栏快速按钮,可以使用ControlCommand函数处理,菜单操作中很多快捷方式一般都放在工具栏中,这种情况可以多一个选择。
ControlCommand(“窗口标题”, "窗口文本", ”工具栏控件名”, "SendCommandID", ”
控件ID”)
ControlCommand只能操作ToolbarWindow32类型的控件。
控件ID需要通过Windows Info工具获取。
5.1文本框
在文本框输入数据使用:
ControlSetText(“标题”,"",”控件名或ID”,”输入的字符串数据”)
如果需要获取文本框的数据,则使用
ControlGetText(“标题”,"",”控件名或ID”)
ControlSetText和ControlGetText可以操作单行文本框,密码输入框,多行文本框等。
5.2选择控件
选择控件使用ControlCommand函数操作,可以操作单选多选以及单行多行下拉选择(ComboBox和ListBox)等控件。
如选择下拉框的某个选项:
ControlCommand(“窗口标题”, "", 控件类名或ID , "SelectString", 选中选项文本)
而针对Radio,CheckBox等选择类型的控件
ControlCommand(“窗口标题”, "",控件类名或ID ,"check", ””)
而对于ListBox类型的选择框,则需要通过一系列组合来操作选项,如下面是获取所有选项数据的例子:
1.点击操作
6.1控件点击
控件点击一般使用:
按钮分左键(left),右键(right)等
此外还可以在函数后面添加坐标,这对于占用屏幕区域比较大的时候,精确点击某个位置触发其他操作比较重要
比如在一个表格中,需要右击某一行记录,弹出右键菜单的情况。
6.2鼠标点击
MouseClick函数对于任何点击操作都有效,
唯一不理想的是,它涉及坐标点的确定,降低了程序的通用性。
如果非要这么做,建议:
1)将当前窗口激活,并最大化
2)如果当前窗口禁用最大化,则使用当前窗口相对坐标进行操作
2.键盘操作
键盘操作一般使用Send函数,想激活窗口发送模拟键盘操作
7.1一般字符
这种情况指向当前激活窗口文本框,发送按键字符,如:
7.2快捷操作
这种情况一般没有光标的输入,只是针对当前的激活窗口的一些快捷操作,比如按键”ctrl+S”是保存等,如
另外一些快捷键如:
3.字符串处理
针对字符串的处理,一般常需要判断字符串是否存在,或对字符串进行拆分、替换等,下面用一个例子来说明一下:
一个用&&连接的子字符串,需要跟某段文字进行匹配,如果发现存在子存在,则替换成指定的字符串
其他可以参考官方帮助文档。
4.数组处理
数组可以包含不同数据类型的数据,处理起来有两种情况需要注意
9.1一般数组
这个跟其他程序语言无太大的差别,如下所示:
注意下标从0开始
9.2特殊数组
特殊数组指某些函数的返回值为数组的情况,或是在运行脚本时候,传递给命令行的参数,AutoIT会初始化一个特殊的数组,这些数组下标也是从0开始,但是为0的项保存的是数组的个数。
命令行返回数组
对于脚本参数数组为$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
函数返回数组
前面用到的StringSplit函数返回值也是一个数组,0位保存的是数组项的个数,数组内却是从1开始计数
如上:
其他还有另外一些特殊的函数,如FileGetTime,WinList等等很多函数,返回值都是数组的情况,具体用法可能有些差异,这些可以参考相关文档。
5.日期时间
当前日期时间,可以直接从日期和时间宏中获取,如:
@SEC 当前时钟的秒值,值的范围是00 到59
@MIN 当前时钟的分值,值的范围是00 到59
@HOUR 当前时钟的时值(24时制),值的范围是00 到23
@MDAY 当天属本月的第几天,值的范围是01 到31
@MON 当前月份,值的范围是01到12
@YEAR 当前年份(4位数)
计算指定日期间隔后的新日期:
_DateAdd(“计算类型”, “间隔数”, “指定日期”)
计算两个指定日期的间隔:
_DateDiff(“计算类型”, “计算的开始日期”, “计算的结束日期”)
6.像素捕获
像素捕获主要去获取屏幕某块区域像素点的色值,以此和给定的颜色色值来比较判断是否一致。
在实际情况中,有时可能不止获取一个点的像素就够了,这时可以通过获取窗口的相关WinGetPos("窗口标题","")坐标位置,然后对某个区块进行扫描。
7.文件操作
12.1.一般文件
对于一般文本文件的读取:可以使用FileOpen打开文件,在按照要求读取文件内容:
如果文件被独占打开,进行FileOpen操作时候,获取不到文件操作句柄,无法对文件进行读写操作,这时,如果只是针对文件读,可以将独占打开的文件进行一下复制,然后用拷贝文件进行目标操作。
12.2.ini文件
对于ini类型文件,形如:
[字段名]
关键字=数值
文件中可以有多个不同的字段名,每个字段名下有多个关键字,不同字段名下的关键字可以相同。
读取ini文件:
写入ini文件:
删除ini文件:
8.常用控件操作
13.1.ListBox控件
ListBox控件,如图所示:
在前面提到选择控件,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控件展示形如表格,如图所示:
其操作如下
上面代码,我们首先获取行数,然后指定某列,获取其所有行的文本。
更多ListView操作可以参考ControlListView函数说明。
9.运行参数设置
运行参数设置可以调整Autoit各种函数/参数的运作方式,可以通过Opt或者AutoItSetOption函数来设置:
常用的有:
更多运行参数设置可以参考AutoItSetOption帮助文档说明
10.加密解密
15.1.加密
这里加密的是一个16进制的字符串,其中加密匙可以自己设置,示例中为sop,其中加密算法为AutoIt 内置的$CALG_RC4,还可以为$CALG_RC2等等其他。
15.2.解密
很简单的两行,不过其中的解密匙和解密算法要跟之前的加密参数对应。
11.GUI操作
GUI操作包括创建窗口面板,在面板上创建表单控件及其互动事件处理等一系列连贯配置:
上面是一个简单界面包装,一旦界面检测到$WM_COMMAND事件响应,即触发自定义函数WM_COMMAND,窗口包括两个简单的文本编辑控件。
我们还可以设置其他控件的事件处理:
这里是针对按钮设置了点击触发事件。
12.IE操作
IE操作,不像GUI界面一样,通过AutoIt Window Info就能得到相关控件,进而获取控件句柄进行操作。
我们在操作IE网页时候,需要事先获取HTML页面中的相关Dom节点或元素,所以需要对HTML有一些了解。
下面是一个简单的例子:
实例是一个简单操作,打开一个IE窗口,访问百度,然后在搜索网页表单,输入一个要查询的关键字,点击百度搜索。
一般网页很多超链接,对于这些链接的页面,都有很多的Dom节点嵌套,单纯的以对象名称不一定能够获取到某个操作的对象,这时需要从顶级Dom节点,一级一级缩小范围,直到获取到最终操作对象节点,如下所示:
这里实例主要是从一个打开的浏览器窗口,获取名为iFrame的frame页面,然后获取其中为Id为divId 的节点,进而,取到divId节点下的所有超链接对象,最后一个一个判断,找到某个url,点击超链接。
13.自定义函数
把一些常用而相关逻辑的操作,抽离出来,独立成一个模块,供脚本调用,这就需要涉及到自定义函数。
用户可通过使用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
上面实例函数用到了AutoIt内部函数库,通过
#include 关键字包含了进来。
14.Windows锁屏处理办法
锁屏解释:
1、当windows操作系统被锁屏时,实际上是在所有窗口(包括隐藏的)的前面再新开了一个窗口,完
全遮挡住先前的窗口,这样大家就看不到了,autoit说这个窗口叫“Always on TOP”。
2、被遮挡的窗口虽然看不到了,但是还在,只是变成了隐藏模式,找到他们,是可以执行快捷方式命令
的;但窗口界面操作是不行的,主要原因是没法激活
Send 和ControlSend 命令
Send 命令必须要在激活窗口的条件下才能正确执行
ControlSend命令可以不需要激活窗口就能执行
实例介绍,相关说明请参考代码中的注释:
;导入需要用到的外部参数
#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)
;获取文件的修改时间,并按照一定的格式组合
$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
;根据给定的字符串与日期组合的字符串进行判断
二、运行程序或打开文件
1、运行程序
Run t命令或者函数用来运行外部可执行文件,AHK还可利用它来直接打开文件。
AHK:
Run, 目标文件[, 工作目录, Max|Min|Hide|UseErrorLevel, 输出PID变量]
AU3:
Run ( "文件名" [, "工作目录" [, 标志]] )
【示例2.1.1 】
AHK:
Run, Notepad.exe
AU3:
Run("Notepad.exe")
上面的示例中都没有给出程序“Notepad.exe”的路径,为什么仍能执行?这是因为它们都会自动在脚本所在目录下搜寻目标文件,如有则运行,否则就到系统文件夹(%PATH%)中搜寻。
注意:
A)某些程序必须给定“工作目录”才能成功运行!
B)给出完整的文件路径有助于轻微提高程序的可靠性。
C)AHK的Run命令可以用来运行程序和直接打开文件,而AU3的Run函数则只能用来运行程序(可执行文件)或传递参数让某个程序打开目标文件。
当然,运行程序的功能还不仅仅是这么简单,我们还可以指定运行程序的初始状态,比如让运行的记事本窗口以最大化状态显示(或者最小化、隐藏):
【示例2.1.2 】
AHK:
Run, Notepad.exe, , Max
AU3:
Run("Notepad.exe", "", @SW_MAXIMIZE)
2、打开文件
前面已经提到,AHK的Run命令可以直接打开文件,而AU3的Run函数则只能用来运行程序,因此在打开文件的方式上有点不同:AHK脚本中可直接给出目标文件,而AHK将自动运行该文件的关联程序来打开它;而AU3则必须由用户自己传递参数让某个程序打开目标文件。
【示例2.2.1 】
AHK:
Run, MyFile.txt
Run, Notepad.exe MyFile.txt
AU3:
Run("Notepad.exe MyFile.txt")
3、以命令行形式运行程序
可以考虑运行系统的命令行解释器(cmd.exe/),然后指定要执行的命令并传递参数。
假设我们要执行命令“dir C:\WINDOWS\system 32”,用以列出指定目录的所有文件及子目录。
【示例2.3.1 】
AHK:
Run, %ComSpec% /k dir C:\WINDOWS\system32
AU3:
Run(@ComSpec & " /k dir C:\WINDOWS\system32")
注意:
A)ComSpec是脚本内建的用以指示命令行解释器位置的变量或宏。
B)/k 参数表示“执行字符串指定的命令但保留”,若改为/c 则表示“执行字符串指定的命令然后终断”。
对此比较直观的解释是/k 将在执行完命令后保留命令提示窗口,而/c 则将在执行完命令之后关闭命令提示窗口。
C)符号“&”是AU3定义的字符串连接符。
4、特殊应用
A)打开网页
【示例2.4.1 】
AHK:
Run,
Run, %A_ProgramFiles%\Internet Explorer\IEXPLORE.EXE
AU3:
Run(@ProgramFilesDir & "\Internet Explorer\IEXPLORE.EXE ")
B)打开特殊文件夹
系统的某些特殊文件夹被定义了相应的CLSID(请查看帮助文档),我们可利用它来打开相应的文件夹,比如打开回收站:
【示例2.4.2 】
AHK:
Run ::{645ff040-5081-101b -9f 08-00aa 002f 954e}
AU3:
不适用!
C)运行控制面板工具
微软已经为我们提供了通过命令行打开控制面板某个工具或项目的方式,比如打开系统属性窗口:【示例2.4.3 】
AHK:
Run control sysdm.cpl
AU3:
Run("control sysdm.cpl")
关于访问控制面板项目的详细介绍请查看此文:文章地址。
D)指定搜索位置并打开搜索窗口
假设我们要打开一个搜索窗口,而且要指定搜索位置,比如C:\:
【示例2.4.4 】
AHK:
Run, find C:\
AU3:
不适用!
E)显示指定文件的属性窗口
假设我们要打开文件“MyFile.txt”的属性窗口,则使用关键字properties 然后接上目标文件即可:【示例2.4.5 】
AHK:
Run, properties MyFile.txt
AU3:
不适用!
注意:AHK在退出前将自动关闭打开的属性窗口!
F)用“资源管理器”打开指定文件夹
我们知道使用Run, explorer C: 或Run("explorer C:") 即可打开指定的文件夹,可是有时候我们需要在资源管理器中打开它,这时可使用关键字explore:
【示例2.4.6 】
AHK:
Run, explore C:
AU3:
run("explorer.exe /e,C:\")
G)打印指定文件
要打印指定文件,可使用关键字print:
【示例2.4.7 】
AHK:
Run, print MyFile.txt
AU3:
不适用!
F)用“资源管理器”打开指定文件夹
我们知道使用Run, explorer C: 或Run("explorer C:") 即可打开指定的文件夹,可是有时候我们需要在资源管理器中打开它,这时可使用关键字explore:
【示例2.4.6 】
AHK:
Run, explore C:
AU3:
不适用!
run("explorer.exe /e,d:\")
这样就可以做到你说的打开树状文件了
注意:窗口标题和窗口文本参数总是对大小写敏感的。
1、等待窗口系列命令/函数
AHK和AU3都提供了用法类似的一组窗口等待命令/函数:WinWait/WinWaitActive/WinWaitClose。
它们分别用于等待窗口出现、等待窗口被激活、等待窗口被关闭。
由于这些命令/函数的参数类似,现仅以WinWait为例说明。
AHK:
WinWait [, 窗口标题, 窗口文本, 超时时间, 排除标题, 排除文本]
AU3:
WinWait ( "窗口标题" [, "窗口文本" [, 超时时间]] )
WinWait 的作用是在目标窗口出现之前不再执行后面的所有语句。
假设我们要运行记事本程序,并在其窗口出现时提示用户:
【示例3.1.1 】
AHK:
Run Notepad
WinWait, 无标题- 记事本
MsgBox 记事本窗口已被打开!
AU3:
Run("Notepad")
WinWait("无标题- 记事本")
MsgBox(0, "", "记事本窗口已被打开!")
2、激活窗口相关命令/函数
让目标窗口成为活动窗口的办法就是激活它,可用的命令/函数是WinActivate:
AHK:
WinActivate [,窗口标题, 窗口文本, 排除标题, 排除文本]
AU3:
WinActivate ( "窗口标题" [, "窗口文本"] )
3、关闭窗口
关闭窗口有两种方式,一种是正常的关闭窗口(WinClose),另一种则是强行关闭窗口(WinKill):AHK:
WinClose/WinKill [,窗口标题, 窗口文本, 超时时间,, 排除标题, 排除文本]
AU3:
WinClose/WinKill ( "窗口标题" [, "窗口文本"] )
现在我们已经可以实现一个比较简单的功能了,比如我们可以打开系统属性窗口并等待其出现,窗口出现后激活它,接着等待3秒再关闭它:
【示例3.1.2 】
AHK:
Run, Sysdm.cpl
WinWait, 系统属性
WinActivate, 系统属性
WinWaitActive, 系统属性
Sleep, 3000
WinClose, 系统属性
WinWaitClose, 系统属性
AU3:
Run("Control Sysdm.cpl")
WinWait("系统属性")
WinActivate("系统属性")
WinWaitActive("系统属性")
Sleep(3000)
WinClose("系统属性")
WinWaitClose("系统属性")
建议:如果程序中频繁地出现要用到这些窗口标题的地方,会带来一个问题:脚本的可读性,也许你会想,这不是很直观吗?可问题是如果这个重复出现的窗口标题是个很长的字符串呢?这将严重影响整个代码的排版美观。
而且我们也无从了解这些窗口标题的“来头”,不知道这个窗口标题究竟是怎么来的。
而如果我们定义一个变量(假设变量名是“AppWindow1”)保存这个窗口标题,我们就能在命令/函数中用变量来表示它,这样就达到了让代码用意更清晰一点的目的。
另外,就算目标软件因某些原因(比如升级)而改变了它的窗口标题,我们也能很方便地作出修改。
4、更准确的标识窗口的方法(主要针对AHK脚本)
程序在运行时起码会有一个进程,如果能获得这个进程ID就能在一定程度上保证对窗口的准确标识。
另外,每个窗口都有定义窗口类名(Class,比如说记事本窗口的类名就是Notepad),所以我们可以以此排除与目标窗口不同的其它窗口类。
其实,我们还有一个更准确的方法:
每个窗口(包括控件在内)都被Windows指派了一个可区别于其它窗口的唯一的标识符(ID),我们称之为窗口句柄(HWND)。
直接给定窗口标题来表示窗口的一个缺点就是无法保证在脚本运行的过程中始终以该窗口为操作目标,因为在这个过程中很有可能会有其它“同名”窗口(或者说满足匹配条件的窗口)出现,而如果我们使用这个标识符来表示窗口自然就能保证命令/函数的操作窗口总是同一个窗口了。
我们先来了解一下获得窗口句柄的命令/函数:
AHK:
WinGet[, 输出变量, ID, 窗口标题, 窗口文本, 排除标题, 排除文本]
AU3:
WinGetHandle ( "窗口标题" [, "窗口文本"] )
其中WinGet获得的窗口ID将通过“输出变量”返回,而WinGetHandle的返回值就是获得的窗口ID。
我们在进行自动化操作时是要先运行某个程序,如何获得这个程序成功运行后显示的窗口句柄?一个比较保险的办法是先获得这个程序的进程ID,然后根据这个进程ID获得它的窗口句柄,AHK支持使用进程ID 作为窗口标题使用;但AU3不支持这样使用,只能先获得该窗口的类名再根据该类名来获得窗口句柄(不够保险):
【示例3.1.3 】
AHK:
Run, NotePad, , , ThisPID
WinWait, ahk_pid %ThisPID%
;这里的ahk_pid表明跟在后面的变量是进程ID
WinGet, ThisID, ID, ahk_pid %ThisPID%
;ThisID将保存获得的窗口句柄
AU3:
Opt("WinTitleMatchMode", 4)
Run("Notepad")
$handle = WinGetHandle("classname=Notepad")
现在暂且先忘记了AU3吧,因为它的窗口函数一般都不支持使用窗口句柄作为(窗口标题)参数。
至于如何在AHK中使用窗口句柄,简单的说,凡是有“窗口标题”参数的命令就可以用窗口句柄来代替,比如:
【示例3.1.4 】
AHK:
Run, Notepad, , , ThisPID
;先获得运行的记事本程序的进程ID
WinWait, 无标题- 记事本ahk_pid %ThisPID%
;等待该进程窗口的出现
WinGet, ThisHWND, ID, 无标题- 记事本ahk_pid %ThisPID%
;获得窗口句柄
WinActivate, ahk_id %ThisHWND%
;这里的ahk_id表明跟在后面的变量是窗口句柄
WinWaitActive, ahk_id %ThisHWND%
Sleep, 3000
WinClose, ahk_id %ThisHWND%
WinWaitClose, ahk_id %ThisHWND%
1、模拟鼠标点击(按钮等)控件
既然是模拟用户操作,自然就包括了模拟鼠标点击在内。
适用命令/函数:Click/MouseClick/ControlClick
其中Click/MouseClick用来模拟用户的物理操作(点击),把鼠标点击事件发送到指定坐标位置(相对当前窗口或绝对位置)上,但这种方法并不能保证100%的准确性,屏幕分辨率、用户干扰和系统环境等都会影响到它们的执行结果,而ControlClick则直接把鼠标点击事件发送到目标窗口的目标控件上,因而更准确,一般我们不考虑使用坐标位置方式的点击,下面仅以ControlClick为例说明:。