目录
1. AU3是什么?能做什么?
2. 乱学AU3中的命令(语言相关)?
3. 通过简单示例学习AU3?
4. 正则表达式的学习(对大小写敏感)
5.对于GUI的相关学习
1. AU3是什么?能做什么?
答:AU3是一个类似BASIC的免费脚本语言;AU3能进行GUI操作、能模拟键盘/鼠标事件、能对窗口及窗口中的标准控件进行互动操作(如窗口移动、控件响应等)、能直接调用外部DLL和WINAPI、支持COM和正则表达式、拥有大量功能函数、支持主流Microsoft OS、可编译成EXE独立运行。
2. 乱学AU3中的命令(语言相关)?
AU3的数据类型是Variant,可以是数值型、字符型或布尔型等。
窗口句柄(HWnd)是一个指针类型数据;
变量:理解成在内存中的某区域指针,可以根据这个指针对该内存区域进行读和写数据。$是变量的前缀,可以是字母、数字和_下划线的混合。
常量:可由Const关键字定义和Enum关键字枚举。用Enum枚举常量时,默认值为0,之后常量进行加1或指定步长操作,例Enum step +3 $Const1,$Const2,$Const3,则它们对应的值分别是0,3,6,当使用步进进行倍乘运算时,第1个常量必须是1,其余的倍乘于早先的常量,例Enum step *3 $Const1,$Const2,$Const3,则它们对应的值分别是1,3,9.
Enum $const1=1,$const2,$const3
MsgBox(0,"",$const1 & ":" &$const2 & ":" & $const3) ;1 2 3
Enum Step 2 $incr0,$incr2,$incr4
MsgBox(0,"",$incr0 & ":" &$incr2 & ":" & $incr4) ;0 2 4
Enum Step *2 $mult1,$mult2,$mult4
MsgBox(0,"",$mult1 & ":" &$mult2 & ":" & $mult4) ;1 2 4
数组:使用前必须用Dim定义它的维数。一个数组包含的数据类型可以不止一种,但尽量只包含一种,否则严重影响脚本运行速度。数组可以作为参数传递给函数,但必须使用ByRef。
宏:AU3定义的宏是只读的变量,以@为前缀。
% :是 字符串的前缀。
_ :空格 加上_即 _是“续行”的意思,就是一条语句可以在多行内书写。
注释符号:简短内容用 ; 分号注释,长篇大论用 #comments-start … #comments-end(缩写为#cs … #ce)注释,注意后者自己不能对自己进行注释。
#include :包含文件到脚本,语法 #include “[path]文件名” 或#include <文件名>,前一个文件名是用户定义的,后一个是AU3自带的库文件。执行时它们的搜索顺序不同。文件名只能是字符串不能是变量。
#include-once :如果某脚本被另一个脚本多次包含,别忘了在该脚本上使用该该关键字。
#NoTrayIcon :执行时不显示托盘图标。
Opt(“TrayIconHide”,1) :执行时显示托盘图标再隐藏;Opt(“TrayIconHide”,0) 显示托盘。
#OnAutoitStartRegister “函数” :注册AU3启动时调用的函数。
#NoAutoit3Execute :指定当前编译的脚本不能运行 /Autoit3ExecuteLine或 /Autoit3ExecuteScript参数运行。
#RequireAdmin :当前运行的脚本需要完整的管理员权限。
AutoitSetOption(“MustDeclareVars”,1) :变量使用前必须先声明。
ContinueLoop :继续While/Do/For循环,
例:For $i = 1 to 10
If $i = 7 Then ContinueLoop
MsgBox(0, "$i 的当前值为:", $i)
Next ;显示除7之外的9个数字
@ComSpec 该宏执行命令解释器的全路径,例:RunWait(@ComSpec&” /c dir c:”),参数/c是在命令解释器下执行后面的字符串命令“dir c:”。
Run 运行可单独执行的命令,例:Run(“notepad”),exe、bat、com、pif直接运行的文件由Run执行,诸如.txt、.msi文件不能单独执行,他们都是依靠其他程序执行,如.msi依靠msiexec.exe执行,因此Run(“msiexec example.msi”),也可以ShellExecCute(“example.msi”)。
StringFormat() 将多个变量插入到某个字符串中,例:
Local $var1=1,$var2=2,$var3=3,$var4=4,$var5=5
$msg = StringFormat("变量1是 %s, 变量2是 %s, 变量3是 %s, V变量4是 %s, 变量5是 %s", $var1, $var2, $var3, $var4, $var5)
MsgBox(0, "示例", $msg),注意字符串前必须有 % 。@是宏前缀,$是变量前缀,%是字符串前缀。
Send() 如用 Send发送带特殊符号的变量的内容,如!^+{SPACE},使用send的原文模式发送,例:DIM $Var=”!zgk” Send($Var,1),其flag为 1表示按原文模式发送。
#AutoIt3Wrapper_Icon=自定义一个图标 编译时可使用该语句自定义一个图标。
$CmdLine[] 当AU3接收命令行参数时会初始化一个特殊的数组就是$CmdLine[],$CmdLine[0] 表示接收的命令行参数的个数,$CmdLine[1]表示第1个接收的参数。
$CmdLineRaw 表示一个完整的未被拆分的语句,例:Autoit3.exe example.au3 参数1 “其他内”,那么$CmdLineRaw会返回:example.au3参数1 “其他内”,编译后,$CmdLineRaw会返回: 参数1 “其他内” ,注意example.au3没有返回。
#requireadmin :脚本默认执行权限是标准用户,如需管理员权限使用该语句。
@ScriptName :代表脚本的文件名。
HWND 表示控件句柄,由ControlGetHandle()函数确定。对控件可以进行多种操作,如ControlSend("无标题 - 记事本", "", "[CLASS:Edit; INSTANCE:1]", "这是测试文本") ;ControlClick("我的窗口", "", 254);ControlSetText("我的窗口", "", "[NAME:textBoxFolder]", "C:SomeFolder")。
Exit[返回值] :终止程序运行。[返回值]为整数,0表示脚本正常退出,1表示脚本异常终止,如被任务管理器终止。可书写为Exit、Exit0或Exit(1),但Exit()是错误的。
ExitLoop [等级] :退出循环。[等级]默认值为1,表示退出当前循环。
For <$变量> in <表达式> … Next :列出对象集合中的对象或数组中的元素。表达式可以是对象集合或数组,变量无须定义,自动生成Local变量,如下例中的$Window。
例:
$oShell=ObjCreate(“shell.application”) ;定义对象
$oShellWindows=$oShell.windows ;定义对象集合
if IsObj($oShellWindows) then
$string=””
for $Window in $oShellWindows
$string=$string & $Window.LocationName & @crlf
Next
Msgbox(0,””,”你打开了下列窗口: “&@crlf & $string)
Else
Msgbox(0,””,”你没有打开任何窗口”)
Endif
Func 函数名 … EndFunc :用户自定义函数。通过“返回值”和 @error 来判断函数是否执行成功,以 @error 为优先
判断。
3. 通过简单示例学习AU3?
例1:新建立一文本文件并保存指定内容?
代码如下:
Send("#r") ;# 表示Windows徽标,即发送 Win+R
WinWaitActive("运行") ;等待击活‘运行’窗口
Send("notepad.exe{Enter}") ;在‘运行’窗口输入notepad.exe并按回车
WinWaitActive("无标题 - 记事本") ;等待击活‘运行无标题 - 记事本’窗口
Send("这里是通过WIN+R打开运行窗口,再自动输入notepad.exe后,在打开记事本程序自动输入指定内容后保存并退出 {F5}")
;向打开的记事本输入内容
WinClose("无标题 - 记事本")
WinWaitActive("记事本")
Send("!Y")
WinWaitActive("另存为","保存在(&I):")
;ControlClick("另存为","保存在(&I):",1137)
ControlClick("另存为","保存在(&I):","ComboBox1")
ControlSetText("另存为","保存在(&I):","ComboBox1","c:")
ControlClick("另存为","保存在(&I):","ComboBox1")
;ControlClick("另存为","保存在(&I):",1137)
ControlSetText("另存为","保存在(&I):","Edit1","testautonotepad222.txt")
Send("!S")
#cs
我想用ControlSetText("另存为","保存在(&I):","ComboBox1","c:")设置存储路径
用ControlSetText("另存为","保存在(&I):","Edit1","testautonotepad1.txt")设置要建立的文件
但实际用 Send("c: estautonotepad.txt !S")就搞定了!
不过ControlSetText("另存为","保存在(&I):","ComboBox1","c:")根本没起作用?
在该语句前后都加上 ControlClick("另存为","保存在(&I):","ComboBox1")就OK!
#ce
补充方法:
Local $FileName="c:zgk.txt"
Local $FileContents="My name is zgk!Welcome to you!"
Local $Open=FileOpen($FileName,2) ;记住有2
FileWrite($Open,$FileContents)
FileClose($Open)
4. 正则表达式的学习(对大小写敏感)
语法:StringRegExp( "字符串" , "表达式" [, 标志 ] [, 偏移量 ]] )
就是在“字符串”中找到你希望能看到的“表达式”或者从“字符串”中返回你希望的 “值”。
[…]匹配其中的任何字符
例:MsgBox(0, "SRE 示例 2 结果", StringRegExp("text", 'te[sx]t'))
[^ ... ]不匹配其中的任何字符,如果要匹配^,用(^)
"{匹配的数量}" 或指定一个范围 "{最小,最大}".
例;MsgBox(0, "SRE 示例 3 结果", StringRegExp("text", 't{1}e{1}[sx]{1}t{1}'))
()分组,此时的标志 为 1,不仅能返回匹配的结果,还能将“分组”的 字符以数组形式返回
例:$asResult = StringRegExp("This is a test example", '(test)', 1)
If @error == 0 Then
MsgBox(0, "SRE 示例 4 结果", $asResult[0])
EndIf
$asResult = StringRegExp("This is a test example", '(te)(st)', 1)
; (te)(st)分2个组,但它们必须是“连续”的字符
;红色的1表示仅返回第一个匹配的结果
If @error == 0 Then
MsgBox(0, "SRE 示例 4 结果", $asResult[0] & "," & $asResult[1])
;分别返回第1个分组字符$asResult[0]和第2个分组字符$asResult[1]
EndIf
例:$Str = "You deflect 36 of Gnarly 25Monster's 279 damage 379 damage"
$sR = StringRegExp($Str, '([0-9]{1,3})(?: damage)', 3)
;红色的3表示返回所有匹配的结果
;$sR = StringRegExp($Str, '(d+)h+damage', 3)
If Not @Error Then MsgBox(0, 'SRE 示例 6 结果', $sR[0] & ',' & $sR[1])
5.对于GUI的相关学习
对于GUI操作必须使用库文件 #include <GUIConstantsEx.au3>
GUI响应事件有2种模式:消息循环(MessageLoop)和事件模式(OnEvent),默认是MessageLoop,可通过Opt(“GuiOnEventMode”,1)更改为OnEventMode。
MessageLoop模式 :当以GUI操作为第一要务时,建议用该模式,该模式下是通过GUIGetMsg()函数不断返回消息事件来响应,该函数返回的事件类型是“无事件、控件事件(如用GUICtrlCreateButton创建的控件响应的事件)、系统事件(如$GUI_EVENT_CLOSE、$GUI_EVENT_MINIMIZE等)。
GUIGetMsg()函数还可以在多窗口中操作,因为无论多少窗口它的ID是唯一的,此时可以使用GUIGetMsg(1),这里的1不仅代表被截获的各个事件(它们都存储于$array[0]中),还包括各个窗口的ID(他们都存储于$array[1]中)。
MessageLoop基本语法框架:
While 1
$nMsg=GUIGetMsg()
…具体代码
Wend
例:创建2个窗口,用GUIGetMsg(1)来操作
#include <GUIConstantsEx.au3>
;创建第1个窗口
$FirstWindow=GUICreate("第1个窗口",200,200,-1,-1)
GUICtrlCreateLabel("第一个窗口的LABEL: ",10,10,150,20)
$Button1=GUICtrlCreateButton("确定",10,30,50,20)
;创建第2个窗口
$SecondWindow=GUICreate("第2个窗口",200,200,-1,-1)
GUISwitch($FirstWindow) ;切换哪个窗口使用 GUI函数,本例将$FirstWindow设置为当前窗口进行各种操作GUISetState(@SW_SHOW) ;可以用GUISetState(@SW_SHOW,$FirstWindow)代替GUISwitch($FirstWindow)
While 1
Local $nMsgs=GUIGetMsg(1)
Select
Case $nMsgs[0]=$Button1
MsgBox(0,"选择的是第1个窗口的按钮","你按了“确定”按钮")
Case $nMsgs[0]=$gui_event_close And $nMsgs[1]=$FirstWindow
MsgBox(0,"第1窗口操作","你选择了关闭窗口操作,正在关闭")
ExitLoop
EndSelect
Wend
OnEvent模式:只有在事件被触发时才调用相关函数执行,执行后在返回主程序。返回的事件包括控件事件和系统事件,这2类事件发生时均调用用户自定义的函数,系统事件调用的函数是GUISetOnEvent(),控件事件调用的是GUICtrlSetOnEvent()。
OnEvent模式基本语法框架:
While 1
Sleep(1000)
Wend
Func Ownfunc()
具体代码
Endfunc
Func Ownfunc()
具体代码
Endfunc
例:
#include <GUIConstantsEx.au3>
;Opt("GUIONEVENTMODE",1)
Opt("GUIOnEventMode", 1) ; 切换为 OnEvent 模式
$FirstWindow=GUICreate("普通事件模式窗口调试",200,200,-1,-1)
GUISetOnEvent($GUI_EVENT_CLOSE,"CloseWindow")
GUICtrlCreateLabel("你好,OnEvent Mode: ",10,10)
$Button=GUICtrlCreateButton("OK!",20,30)
GUICtrlSetOnEvent($Button,"ClickOk")
$DummyWindow=GUICreate("虚拟窗口,不会被显示",200,200,-1,-1)
GUISetOnEvent($GUI_EVENT_CLOSE,"CloseWindow")
GUISetState(@SW_SHOW,$FirstWindow)
While 1
Sleep(1000) ; 不做任何事
Wend
Func ClickOk()
MsgBox(0,"OK!按钮","你点击了OK!按钮")
EndFunc
Func CloseWindow()
;注意: 此时 @GUI_CTRLID 的值将等于 $GUI_EVENT_CLOSE,
;而 @GUI_WINHANDLE 则等于 $FirstWindow
If @GUI_WinHandle=$FirstWindow Then
MsgBox(0, "窗口事件", "您选择了关闭!正在退出...")
Exit
EndIf
EndFunc
AU3学习笔记
[b]回复 [url=http://www.autoitx.com/redirect.php?goto=findpost&pid=196303&ptid=17702]1#[/url] [i]newuser[/i] [/b]
Zougk 2010-6-9重新学习基础知识
目录
一.基础部分
1.variables(变量)、constants(常量)、arrays(数组)、字符串变量与变量转换
2.#include和fileinstall()
3.消息循环模式和事件模式
4.函数(跳过)
5.条件与循环语句
6.程序运行为功能(CrossDoor)
7.函数的参数传递
8.函数的嵌套与递归
9.正则表达式(必须要理解啊!!!)
10.注册表操作
11.文件读写(包括对二进制文件内容的替换)
二.进阶部分
1.GUI操作示例讲解
2.AU3中的DLL应用
一.基础部分
1
Variables
在AU3中,变量使用前是否必须声明,没有严格限制,但如果强制变量声明,使用Opt("MustDeclareVars",1)。建议在用DEBUG代码时,必须显示声明所有变量,以方便调试程序,其实我根本就不会DEBUG,呵呵!
变量前缀必须是$,名称部分可由数字、字母和下划线 _ 组成,如$My_variable。
定义变量的关键字分别是Dim、Local、Global,注意它们所定义的变量范围。
例:Global定义的变量与函数内Dim定义的变量重名时,Glbal定义的变量将被复写
Global $FILE=@SCRIPTDIR & "win7book.exe"
FUNCTION()
FUNC FUNCTION()
DIM $FILE=@ScriptDir & "Exe2AutV3.exe"
EndFunc
RUN($FILE) ; 最终脚本执行的是Dim定义的变量
如果改成:
Global $FILE=@SCRIPTDIR & "win7book.exe"
DIM $FILE=@ScriptDir & "Exe2AutV3.exe"
RUN($FILE) ; 最终脚本执行的还是Dim定义的变量
将Global更改成Local,结果依旧。
加强理解:Global定义的变量是全局变量,在整个程序内都有效,如果在函数内有同名的变量且值被修改,那么Global定义的变量自然会发生变化。如果是局部变量,只是在自己负责的范围内有影响,而不管外部是否有与其通明的变量。
数组
AU3中,数组是存储一组相同类型或不同类型的数。通过下标来访问数组中的元素。
例:$Day可以是0-6中任意1个
Dim $Week[7]=["星期一","星期二","星期三","星期四","星期五","星期六","星期日"] ;定义一个一维的7个元素的数组来存储一周的每一天
Dim $Day=2;这个变量表示我们要查看哪个数组元素
If $Day > 6 Then $Day = 6
If $Day < 0 Then $Day = 0 ;以上2个if语句来判断$Day变量的大小是否超出数组
MsgBox(0,"今天是?",$Week[$Day])
例:
Dim $Week[4][3]=[["周一","周二","周三"],["语文","数学","数学"],["英语","语文","体育"],["历史","音乐","班会"]] ;定义一个二维数组
$Rows=UBound($Week,1) ;UBound ( 数组 [, 维度] ) 维度默认值为 1,表示第一维.此例表示 行数
$Cols=UBound($Week,2) ;此例表示 列数
$Dims=UBound($Week,0) ;若此参数为0,则返回数组的下标数(维数).
MsgBox(0,"当前"&$Dims&"维数组有",$Rows&" 行, "&$Cols&" 列")
例:二维数组的输出不完善?
Dim $sMsg3
Dim $Week[4][3]=[["周一","周二","周三"],["语文","数学","数学"],["英语","语文","体育"],["历史","音乐","班会"]]
ReDim $Week[5][3] ;上面是1天3节课,现在多加了1行,既每天增加了1节课
For $i=0 To 2
$Week[4][$i]="美术" ;因为行数是从0开始,新加的第5行下标自然就是[4],这里表示加的课都是美术
Next
For $x=0 To 2
For $y=0 To 4
MsgBox(0,"",$Week[$y][$x]&@CRLF)
Next
Next
例:修正上例-感谢3mile
Dim $Week[4][3]=[["周一","周二","周三"],["语文","数学","数学"],["英语","语文","体育"],["历史","音乐","班会"]]
ReDim $Week[5][3] ;上面是1天3节课,现在多加了1行,既每天增加了1节课
Local $str
For $i=0 To 2
$Week[4][$i]="美术" ;因为行数是从0开始,新加的第5行下标自然就是[4],这里表示加的课都是美术
Next
For $i=0 To 4
For $n=0 To 2
$str&=$week[$i][$n]&@TAB
Next
$str&=@CRLF
Next
MsgBox(0,0,$str)
例:同样是修正上例(行列互换就好多了)---感谢Kxing
Dim $Week[3][4]=[ _
["周一","语文","数学","数学"], _
["周二","英语","语文","体育"], _
["周三","历史","音乐","班会"]]
For $i=0 To 2
MsgBox(0,$Week[$i][0],$Week[$i][1]&" - "&$Week[$i][2]&" - "&$Week[$i][3])
Next
字符串部分(向CroosDoor学习):
例:
Dim $Var1="'zougk"
Dim $Var2='"zougk'
MsgBox(0,"","first value is: "&$Var1&@CRLF&"second value is: "&$Var2)
Dim $Var3=$Var1&$Var2
MsgBox(0,"",$Var3)
StringLen(字符串) :该函数获取的是“字符串的字符数而不是字节数”。
StringReplace(字符串,”被替换的字符”, ”用于替换的字符”,替换次数)
例:
Dim $var="love me for ever love"
MsgBox(0,"",StringReplace($var,"love","I love",1)) ;仅第一个love被替换成I love
StringSplit() :拆分字符串
例:
Dim $Var="中国人 韩国人 日本人,都是亚洲人"
$Split_Var=StringSplit($Var," ")
MsgBox(0,"","被拆分的字符串的数量是: "&$Split_Var[0]&";"&"它们依次是: "&$Split_Var[1]&" : "&$Split_Var[2]&" : "& _
$Split_Var[3])
;stringsplit()函数拆分成功后,将产生1个数组,第1个元素存储被拆分的字符串的数量,第2个元素是第一个被拆分的字符串,依次类推
$Split_Var1=StringSplit($Var,";")
MsgBox(0,"","被拆分的字符串的数量是: "&$Split_Var1[0]&";"&"它们依次是: "&$Split_Var1[1])
;stringsplit()函数拆分失败后,也将产生1个数组,第1个元素是1,第2个元素存储的是整个字符串
例:获取指定文件的相关属性(加强理解)
$Attrib=FileGetAttrib("F: emp卷C1.txt") ;获取脚本目录的文件夹属性
;MsgBox(0,"文件的属性分别有: ",$Attrib)
If @error Then
MsgBox(4096,"错误","无法获得属性")
Exit
EndIf
$Input=StringSplit("R,A,S,H,N,D,O,C,T",",")
$Output=StringSplit("只读/,存档/,系统/,隐藏/,普通/,目录/,脱机/,压缩/,临时/",",")
;以上2个变量只是为了在“替换字符串时将文件(夹)的英文属性标识转换成中文”
For $i=1 To 9
$Attrib=StringReplace($Attrib,$Input[$i],$Output[$i],0,1) ;stringreplace()中的1表示替换字符时区分大小写
Next
$Attrib=StringTrimRight($Attrib,1) ;移除末尾的反斜杠
MsgBox(0,"完整的文件属性: ",$Attrib)
变量转换(由字符串转换成其它类型变量)
转换为指针:
何谓指针:变量用来存储数据,数据被存放在内存中,为有效通过变量来访问内存中的数据,对变量进行编号,那么编号就是变量在内存中的地址,即这个编号就是指针。
何谓指针变量:就是存储变量地址的变量。
转换函数:Ptr(字符串)
转换为句柄:
通常指的是窗口句柄的转换。窗口句柄是一个整数,AU3中用一个十六进制数来表示它。
转换函数:HWND(字符串)。
例:句柄不能是字符串
窗口、控件、程序都有句柄
$hWnd=WinGetHandle("[class:Shell_TrayWnd]") ;获取任务栏句并
WinSetState($hWnd,"",@SW_HIDE) ;使用任务栏句炳隐藏任务栏
Sleep(1000) ;隐藏1秒
WinSetState($hWnd,"",@SW_SHOW)
MsgBox(0,"","把句炳转换成字符串后再进行以上操作")
$sWnd=String($hWnd)
WinSetState($sWnd,"",@SW_HIDE)
Sleep(1000)
WinSetState($sWnd,"",@SW_SHOW)
MsgBox(0,"","上面实验失败,说明句并不能是字符串,我们再把字符串转换成句柄试一下!")
$sWnd=HWnd($sWnd)
WinSetState($sWnd,"",@SW_HIDE)
Sleep(1000)
WinSetState($sWnd,"",@SW_SHOW) ;成功显示
转换为整数:
转换函数:Int(字符串)。
非数字字符串转换成整数时都是0。
转换为二进制数据:
二进制数据就是字符串编码。
转换函数:StringToBinary()和BinaryToString()。
Constants
常量就是值不能被更改的变量,也不能把已经存在的变量更改成常量。
常量通过Const定义,也可在Const前加Dim 、Local、 Global,例Const $Num=1 或
Dim Const $Num=1。
另外,常量也可以通过Enum关键字枚举,如不指定枚举的默认值通常是0,但如果用倍乘的话,默认值必须是1。
例:
Enum $const1=1,$const2,$const3
MsgBox(0,"",$const1 & ":" &$const2 & ":" & $const3) ;自加1,结果是1 2 3
Enum Step 2 $incr0,$incr2,$incr4
MsgBox(0,"",$incr0 & ":" &$incr2 & ":" & $incr4) ;自加指定步长,结果是0 2 4
Enum Step *2 $mult1,$mult2,$mult4
MsgBox(0,"",$mult1 & ":" &$mult2 & ":" & $mult4) ;1 2 4
Arrays
数组就是数的矩阵,矩阵里的元素应该是同类型和大小的,但在变体矩阵中,类型可以多种多样,但使用了变体数组尤其是在数组中套用了变体数组,那么在脚本执行过程中将是非常消耗资源和运行缓慢,依次不推荐使用变体数组。反正我是用不上它!
数组可以作为参数传递给函数,但必须使用ByRef。
2
#inclued 和 fileinstall()
它们很类似,都是将指定的文件在脚本编译的时候包含到被编译的脚本中。但使用fileinstall()预装需要包含的文件在编译后会导致脚本的体积过大。
#include可以将预先写好的函数或现有常量包含到脚本中,例#include <array.au3>或 #include <buttonconstants.au3>。
fileinstall的语法:fileinstall(“sourcefilepath”,”destinationpath”[,flag]) ,其中flag可是0或1,0表示如果目的路径下有相同文件不覆盖,反之覆盖。
3
消息循环模式
对于GUI操作必须使用库文件 #include <GUIConstantsEx.au3>
GUI响应事件有2种模式:消息循环(MessageLoop)和事件模式(OnEvent),默认是MessageLoop,可通过Opt(“GuiOnEventMode”,1)更改为OnEventMode。
MessageLoop模式 :当以GUI操作为第一要务时或GUI作为主焦点(main focus),建议用该模式,该模式下是通过GUIGetMsg()函数不断返回消息事件来响应,该函数返回的事件类型是“无事件、控件事件(如用GUICtrlCreateButton创建的控件响应的事件)、系统事件(如$GUI_EVENT_CLOSE、$GUI_EVENT_MINIMIZE等)。
GUIGetMsg()函数还可以在多窗口中操作,因为无论多少窗口它的ID是唯一的,此时可以使用GUIGetMsg(1),这里的1不仅代表被截获的各个事件(它们都存储于$array[0]中),还包括各个窗口的ID(他们都存储于$array[1]中)。
MessageLoop基本语法框架:
While 1
$nMsg=GUIGetMsg()
…具体代码
Wend
例:创建2个窗口,用GUIGetMsg(1)来操作
#include <GUIConstantsEx.au3>
;创建第1个窗口
$FirstWindow=GUICreate("第1个窗口",200,200,-1,-1)
GUICtrlCreateLabel("第一个窗口的LABEL: ",10,10,150,20)
$Button1=GUICtrlCreateButton("确定",10,30,50,20)
;创建第2个窗口
$SecondWindow=GUICreate("第2个窗口",200,200,-1,-1)
GUISwitch($FirstWindow) ;切换哪个窗口使用 GUI函数,本例将$FirstWindow设置为当前窗口进行各种操作GUISetState(@SW_SHOW) ;可以用GUISetState(@SW_SHOW,$FirstWindow)代替GUISwitch($FirstWindow)
While 1
Local $nMsgs=GUIGetMsg(1)
Select
Case $nMsgs[0]=$Button1
MsgBox(0,"选择的是第1个窗口的按钮","你按了“确定”按钮")
Case $nMsgs[0]=$gui_event_close And $nMsgs[1]=$FirstWindow
MsgBox(0,"第1窗口操作","你选择了关闭窗口操作,正在关闭")
ExitLoop
EndSelect
Wend
OnEvent模式:只有在事件被触发时才调用相关函数执行,执行后在返回主程序。返回的事件包括控件事件和系统事件,这2类事件发生时均调用用户自定义的函数,系统事件调用的函数是GUISetOnEvent(),控件事件调用的是GUICtrlSetOnEvent()。
OnEvent模式基本语法框架:
While 1
Sleep(1000)
Wend
Func Ownfunc()
具体代码
Endfunc
Func Ownfunc()
具体代码
Endfunc
例:
#include <GUIConstantsEx.au3>
;Opt("GUIONEVENTMODE",1)
Opt("GUIOnEventMode", 1) ; 切换为 OnEvent 模式
$FirstWindow=GUICreate("普通事件模式窗口调试",200,200,-1,-1)
GUISetOnEvent($GUI_EVENT_CLOSE,"CloseWindow")
GUICtrlCreateLabel("你好,OnEvent Mode: ",10,10)
$Button=GUICtrlCreateButton("OK!",20,30)
GUICtrlSetOnEvent($Button,"ClickOk") ;为指定控件的点击行为定义函数ClickOk
$DummyWindow=GUICreate("虚拟窗口,不会被显示",200,200,-1,-1)
GUISetOnEvent($GUI_EVENT_CLOSE,"CloseWindow")
GUISetState(@SW_SHOW,$FirstWindow)
While 1
Sleep(1000) ; 不做任何事
Wend
Func ClickOk()
MsgBox(0,"OK!按钮","你点击了OK!按钮")
EndFunc
Func CloseWindow()
;注意: 此时 @GUI_CTRLID 的值将等于 $GUI_EVENT_CLOSE,
;而 @GUI_WINHANDLE 则等于 $FirstWindow
If @GUI_WinHandle=$FirstWindow Then
MsgBox(0, "窗口事件", "您选择了关闭!正在退出...")
Exit
EndIf
EndFunc
4.函数(先跳过)
5.条件与循环语句
它们都可以多层嵌套。
利用条件和循环语句可以简化代码并完成复杂的任务。
条件语句
if…then…else