|
原创!挂羊头,呵呵!都是学习笔记,并且不够完整,没办法,学习总是没有持续的精神,但又想持续,大家多鼓励呀!
AU3学习笔记
Zougk 2010-6-9重新学习基础知识
目录
一.基础部分
1.variables(变量)、constants(常量)、arrays(数组)
2.#include和fileinstall()
3.消息循环模式和事件模式
4.函数(跳过)
5.条件与循环语句
二.进阶部分
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,结果依旧。
 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
例1:
Global $Num=2
 If @OSVersion="WIN_XP" Then
 If @UserName="Administrator" Then
 If $Num=2 Then
 MsgBox(0,"$Num值的判断消息","$Num的值是:" & $Num)
 Else
 MsgBox(0,"$Num值的判断消息","$Num的值不是2")
 Exit
 EndIf
 Else
 MsgBox(0,"","不是以Administrator用户身份登陆")
 EndIf
 Else
 MsgBox(0,"","该系统不是WIN_XP系统")
 EndIf
例2:
If @OSVersion="WIN_VISTA" Then
 MsgBox(0,"","你的系统是WIN_VISTA")
 ElseIf @OSVersion="WIN_2003" Then
 MsgBox(0,"","你的系统是WIN_2003")
 ElseIf @OSVersion="WIN_XP" Then
 MsgBox(0,"","你的系统是WIN_XP")
 ElseIf @OSVersion="WIN_2000" Then
 MsgBox(0,"","你的系统是WIN_2000")
 Else
 EndIf
select…case语句
例1:
Select
 Case @OSVersion="WIN_VISTA"
 MsgBox(0,"","你的系统是WIN_VISTA")
 Case @OSVersion="WIN_2003"
 MsgBox(0,"","你的系统是WIN_2003")
 Case @OSVersion="WIN_XP"
 MsgBox(0,"","你的系统是WIN_XP")
 Case @OSVersion="WIN_2000"
 MsgBox(0,"","你的系统是WIN_2000")
 Case Else
 EndSelect
switch…case选择语句
例:
Switch @OSVersion
 Case "WIN_VISTA"
 MsgBox(0,"","你的系统是WIN_VISTA")
 Case "WIN_2003"
 MsgBox(0,"","你的系统是WIN_2003")
 Case @OSVersion="WIN_XP"
 MsgBox(0,"","你的系统是WIN_XP")
 Case @OSVersion="WIN_2000"
 MsgBox(0,"","你的系统是WIN_2000")
 Case Else
 EndSwitch
循环语句(5种)
A.For…Next
语法结构:for <variable>=startvalue to <stop> [step]
statement
next
例:
For $x=10 To 1 Step -1 ;步长默认值为1
 SplashTextOn("标题",$x,100,50) ;splashtexton()用于创建一个自定义的文本闪平窗口
 Sleep(1000) ;延迟1秒
 Next
 ;SplashOff() ;当然是关闭闪屏窗口
 MsgBox(0,"闪屏10秒后...","大家好,我是邹国奎,很高兴通过AU3让我们在这里结识!希望我们能成为朋友")
B.For <variable> In <expression>
statements
…
next
该循环常用于“数据的阵列-an array of date”或“COM对象”,如果表达市不是以上两种类型,脚本结束并有错误提示,如果COM对象是一个没有任何元素的空对象集合,脚本会跳出循环执行下面语句。
了解COM Object,首先要了解COM的Object名称及它的properties(属性)和methods(方法)。
例:
Global $Array[5]
 $Array[0]="我"
 $Array[1]="叫"
 $Array[2]="邹"
 $Array[3]="国"
 $Array[4]="奎"
 For $Element In $Array
 For $x=3 To 1 Step -1
 SplashTextOn("",$x,100,50)
 Sleep(1000)
 Next
 SplashOff()
 MsgBox(0,"$Array every element is: ",$Element)
 WinActivate("$Array every element is: ")
 ;ControlClick("$Array every element is: ",$Element,"Button1")
 SendKeepActive("$Array every element is: ")
 Send("{Enter}")
 Next
C.Do
statements
… Until <expression>
例:
Dim $Variable=10
 Do
 SplashTextOn("标题",$Variable,100,50) ;splashtexton()用于创建一个自定义的文本闪平窗口
 $Variable -=1
 Sleep(1000) ;延迟1秒
 Until $Variable=0
 SplashOff()
 MsgBox(0,"闪屏10秒后...","大家好,我是邹国奎,很高兴通过AU3让我们在这里结识!希望我们能成为朋友")
D.While <expression>
statements
…
Wend
例:
Dim $Variable=10
 While $Variable>0
 SplashTextOn("标题",$Variable,100,50) ;splashtexton()用于创建一个自定义的文本闪平窗口
 $Variable -=1
 Sleep(1000) ;延迟1秒
 WEnd
 SplashOff()
 MsgBox(0,"闪屏10秒后...","大家好,我是邹国奎,很高兴通过AU3让我们在这里结识!希望我们能成为朋友")
F.With <expression>
注意expression表达式必须是Object类型
…
EndWith
该语句常被用来简化脚本代码
例:
#cs
 下列代码没有使用With...EndWith语句
 #ce
 $Object=ObjCreate("InternetExplorer.Application.1")
 $Object.visible=1
 $Object.height=768
 $Object.width=1024
 $Object.navigate("http://www.baidu.com")
用With…EndWith简化后
$Object=ObjCreate("InternetExplorer.Application.1")
 With $Object
 .visible=1
 .height=768
 .width=1024
 .navigate("http://www.baidu.com")
 EndWith
二.进阶部分
1.GUI操作示例讲解
例1:
#include <guiconstants.au3> ;包含了所有与GUI有关系的常量,比如$Gui_Event_Close
#NoTrayIcon ;隐藏脚本运行时在任务栏tray显示的图标icon
Global $SS_CENTER
Opt('GuiOnEventMode',1) ;从循环消息模式更改到事件模式
GUICreate("Ai Smart Homes - Saint Louis,Missouri",400,300) ;创建主窗口
GUISetIcon("sysleak.ico") ;创建窗口图标,就是在窗口标题前显示的哪个图标
GUISetOnEvent($GUI_EVENT_CLOSE,'GUIExit') ;点击窗口右上角的叉时,调用函数GuiExit()
GUICtrlCreatePic("080402070.jpg",120,5,156,160) ;在GUI上创建图片控件
GUICtrlCreateLabel("Please Choose an Option Below:",98,180,300,15) ;在GUI上创建静态标记控件,$SS_CENTER表示该控件的样式
GUICtrlSetColor(-1,0Xff0000) ;设置控件颜色,-1表示为当前控件
GUICtrlCreateButton("Visit Our Website",100,210,200,30) ;在GUI上创建按钮控件
GUICtrlSetOnEvent(-1,'website') ;为指定的控件点击行为定义用户函数
GUICtrlCreateButton("Send an Email",100,250,200,30)
GUICtrlSetOnEvent(-1,'email')
GUISetState(@SW_SHOW) ;显示当前窗口
Func website()
GUISetState(@SW_HIDE) ;隐藏当前窗口
Run("c:\program files\internet explorer\iexplore.exe 10.64.240.131")
EndFunc
Func email()
GUISetState(@SW_HIDE)
Run("mailto:zougk@petrochina.com.cn")
Exit
EndFunc
While 1
Sleep(500)
WEnd
Func GUIExit()
Exit
EndFunc
例2:所有控件应用
#include <guiconstants.au3>
Global $ACS_AUTOPLAY
GUICreate("GUI Control Examples",500,420)
GUISetIcon(@WindowsDir & "\explorer.exe",0)
$FileMenu=GUICtrlCreateMenu("File")
GUICtrlCreateMenuItem("Example File Menu Item",$FileMenu)
$ContextMenu=GUICtrlCreateContextMenu()
GUICtrlCreateMenuItem("Example1",$ContextMenu)
GUICtrlCreateMenuItem("",$ContextMenu)
GUICtrlCreateMenuItem("Example2",$ContextMenu)
GUICtrlCreateTab(0,0,500,400)
GUICtrlCreateTabItem("AVI,Button,Checkbox,ComboBox")
GUICtrlCreateAvi(@WindowsDir & "\CLOCK.avi",-1,10,30,321,321,$ACS_AUTOPLAY)
GUICtrlCreateLabel("AVI Example",140,355,60,15)
GUICtrlCreateButton("Button Example",350,30,120,30)
GUICtrlCreateCheckbox("Checkbox Example",350,70,120,30)
GUICtrlCreateCombo("ComboBox Example",350,110,120,30)
GUICtrlCreateTabItem("Group,Date,Dummy,Edit,Icon,Input,List,ListView")
GUICtrlCreateGroup("Group Example",20,40,460,60)
GUICtrlCreateDate("",30,60,200,25)
$DummyButton=GUICtrlCreateButton("Dummy Example",270,60,200,25)
$Dummy=GUICtrlCreateDummy()
GUICtrlCreateGroup("",-99,-99,1,1)
GUICtrlCreateEdit("Edit Example",30,120,440,60)
GUICtrlCreateIcon(@WindowsDir & "\cursors\drum,ani",-1,30,200,32,32)
GUICtrlCreateLabel("Icon Example",70,210,80,20)
GUICtrlCreateInput("Input Example",160,205,300,20)
GUICtrlCreateList("List Example",30,240,440,80)
$ListView=GUICtrlCreateListView("List View Example",30,330,440,60)
GUICtrlCreateListViewItem("List View Item Example",$ListView)
GUICtrlCreateTabItem("ActiveX Object")
GUICtrlCreateLabel("ActiveX Object Example",10,30,140,20)
$IE=ObjCreate("Shell.Explorer.2")
$GUIActiveX=GUICtrlCreateObj($IE,10,50,480,340)
$IE.navigate("http://www.aismarthomes.com")
GUICtrlCreateTabItem("Picture,Progress,Radio,Slider,TreeView,Updown")
GUICtrlCreatePic(@WindowsDir & "\blue lace 16.bmp",10,30,40,40)
GUICtrlCreateLabel("Picture Example",55,45,80,20)
GUICtrlCreateLabel("Process Example",400,70,90,20)
$Progress=GUICtrlCreateProgress(10,90,480,25)
GUICtrlSetData($Progress,33)
GUICtrlCreateRadio("Radio Example",10,140,90,20)
GUICtrlCreateLabel("Slider Example",290,170,100,20)
GUICtrlCreateSlider(180,130,280,30)
GUICtrlCreateLabel("Tree View Example",10,200,120,20)
$TreeView=GUICtrlCreateTreeView(10,220,480,60)
$TreeTopLevel=GUICtrlCreateTreeViewItem("Tree View Example",$TreeView)
GUICtrlCreateTreeViewItem("Subitem1",$TreeTopLevel)
GUICtrlCreateTreeViewItem("Subitem2",$TreeTopLevel)
GUICtrlCreateLabel("Example Updown",10,300,100,20)
$UpDownInput=GUICtrlCreateInput("0",10,320,480,60)
GUICtrlCreateUpdown($UpDownInput)
GUICtrlCreateTabItem("")
GUISetState(@SW_SHOW)
While 1
$GuiMsg=GUIGetMsg()
Select
Case $GuiMsg=$DummyButton
GUICtrlSendToDummy($Dummy)
Case $GuiMsg=$Dummy
MsgBox(0,"Dummy Example","You have clicked the dummy button.")
Case $GuiMsg=$GUI_EVENT_CLOSE
Exit
EndSelect
WEnd
例3:读取控件内容并运行指定程序
#include <guiconstants.au3>
GUICreate("Combo Example",200,80)
GUISetIcon(@WindowsDir & "\explorer.exe",0)
$ComboBox=GUICtrlCreateCombo("Notepad",10,10,120,20)
GUICtrlSetData(-1,"Paint|Commad Prompt")
$Button=GUICtrlCreateButton("Go",10,40,60,20)
GUISetState(@SW_SHOW)
While 1
$GuiMsg=GUIGetMsg()
Select
Case $GuiMsg=$Button
MsgBox(0,"","You Choose is" & GUICtrlRead($ComboBox) & ".")
Select
Case GUICtrlRead($ComboBox)="Notepad"
Run("notepad.exe")
Exit
Case GUICtrlRead($ComboBox)="Paint"
Run("mspaint.exe")
Exit
Case GUICtrlRead($ComboBox)="Command Prompt"
Run("cmd.exe")
Exit
EndSelect
Case $GuiMsg=$GUI_EVENT_CLOSE
Exit
EndSelect
Wend
2. AU3中的DLL应用
语法: DllCall("dll","return type","function"[,"type1",param1[,"typen",param n[])
dll :就是函数function()所对应或存在于的那个Dll file,例1中我要用DllCall()代替Sleep(),而sleep()存在于 kerner32.dll中。
Retrun type :返回类型,sleep()没有返回值,所以应该是”none”
function :函数,例1就是sleep。
type : 参数类型,MSDN规定是DWORD,在AU3中简化为dword。
例1:使用DLLCALL()代替sleep()延迟1秒
MsgBox(0,"","i",2) ;2秒后显示的i消失
;Sleep(1000)
DllCall("kernel32.dll","none","Sleep","dword",1000) ;延迟1秒
MsgBox(0,"","love",2)
DllCall("kernel32.dll","none","Sleep","dword",1000)
MsgBox(0,"","you",2)
DllCall("kernel32.dll","none","Sleep","dword",1000)
例2:使用DllCall()实现MessageBoxW()函数功能
DllCall("user32.dll","int","MessageBoxW","hwnd",0,"wstr","Hello from Dll tutoorial!","wstr","info","uint",0)
;MessageBox()函数存在于user32.dll中
;返回类型为int
;因为显示的字符串信息,常用的字符编码方式是ANSI(美国的工业化标准)和Unicod(统一字符标准)
;所以需要在其function名称后加A或W,常用Unicode,所以MessageBox写成MessageBoxW
;hwnd是窗口句柄类型,因为没有窗口,所以是0
;第1个wstr表示消息窗口所显示的信息,如果将wstr改写成str就显示乱码了,这可能就是字符编码的问题了!
;第2个wstr表示消息窗口的标题
;uint表示消息窗口的显示风格
按ASCII码显示(wstr可改成str了):
DllCall("user32.dll","int","MessageBoxA","hwnd",0,"str","Hello from Dll tutoorial!","str","info","uint",0)
例3:使用Dllcall()实现GetDiskFreeSpace()函数功能
问题:这里参数的类型为什么是 dword* 而不是 dword?如果拿掉 * 显示结果为 0 显然是错的!
;Variable to pass as referecne 变量作为参考来传递
Local $SectorsPerCluster ;每个簇的扇区数
Local $BytesPerSector ;每个扇区的字节数
Local $NumberOfFreeClusters ;自由簇的数量
Local $TotalNumberOfClusters ;总的簇数
$calldata=DllCall("Kernel32.dll","int","GetDiskFreeSpaceW","wstr","D:\","dword*",$SectorsPerCluster,"dword*",$BytesPerSector,"dword*",$NumberOfFreeClusters,"dword*",$TotalNumberOfClusters)
;获取D盘相关以上信息
;The data is returned as an array,even the changed values of the variables
$SectorsPerCluster=$calldata[2]
$BytesPerSector=$calldata[3]
$NumberOfFreeClusters=$calldata[4]
$TotalNumberOfClusters=$calldata[5]
MsgBox(0,"","Total number of clusters:" & $TotalNumberOfClusters)
在windows的 所有DLLS中和有关AU3的DLLS的调用协议或惯例calling conventions(我还不懂它):
一种是:
;With stdcall 所有windows dlls使用the stdcall calling conventions
DllCall(“SomeDll”,”int”,”Func”)
另一种是:
;With cdecl
DllCall(“SomeDll.dll”,”int:cdecl”,”Func”)
例4:用DllCall()实现GetSystemTime()
问题:获得的时间是上午时间?
ushort :无符号的16位整数
Word: 无符号的16位整数
int: 32位整数
Ptr: 常规指针(void *)
$SYSTEMTIME=DllStructCreate("ushort wYear;ushort wMonth;ushort wDayOfWeek;ushort wDay;ushort wHour;ushort wMinute;ushort wSecond;ushort wMilliseconds")
DllCall("Kernel32.dll","none","GetSystemTime","ptr",DllStructGetPtr($SYSTEMTIME))
MsgBox(0,"现在的时间是:",DllStructGetData($SYSTEMTIME,"wYear")&":"&DllStructGetData($SYSTEMTIME,"wMonth") _
&":"&DllStructGetData($SYSTEMTIME,"wDay")&" "&DllStructGetData($SYSTEMTIME,"wHour")&":"&DllStructGetData($SYSTEMTIME,"wMinute"))该例应用了DllStructCreate()来创建Dll的结构,所谓DllStruct可以理解为“数据的压缩包,包里所有变量在内存中互相挨着”,
补充一例子:显示系统图标与索引
; *******************************************************
; 示例 3 - 显示系统更改图标窗口
; *******************************************************
$sFileName = @SystemDir & '\shell32.dll'
; 创建一个数据结构储存图标索引
$stIcon = DllStructCreate("int")
$stString = DLLStructCreate("wchar[260]")
$structsize = DllStructGetSize($stString)/2
DllStructSetData($stString, 1, $sFileName)
; 运行更改图标窗口 - '62' 是这个函数的顺序值
DllCall("shell32.dll", "none", 62, "hwnd", 0, "ptr", DllStructGetPtr($stString), "int", $structsize, "ptr", DllStructGetPtr($stIcon))
$sFileName = DllStructGetData($stString, 1)
$nIconIndex = DllStructGetData($stIcon, 1)
; 显示文件名和图标索引
Msgbox(0, "信息", "最后选择的文件: " & $sFileName & @LF & "图标索引: " & $nIconIndex |
评分
-
查看全部评分
|