newuser 发表于 2010-6-24 10:58:11

向所有和CrossDoor一样的人致敬!

我的最新学习笔记,自我激励一下!
AU3学习笔记
Zougk2010-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个元素的数组来存储一周的每一天
Dim $Day=2;这个变量表示我们要查看哪个数组元素
If$Day > 6 Then $Day = 6
If$Day < 0 Then $Day = 0;以上2个if语句来判断$Day变量的大小是否超出数组
MsgBox(0,"今天是?",$Week[$Day])
例:
Dim $Week=[["周一","周二","周三"],["语文","数学","数学"],["英语","语文","体育"],["历史","音乐","班会"]];定义一个二维数组
$Rows=UBound($Week,1) ;UBound ( 数组 [, 维度] ) 维度默认值为 1,表示第一维.此例表示 行数
$Cols=UBound($Week,2) ;此例表示 列数
$Dims=UBound($Week,0) ;若此参数为0,则返回数组的下标数(维数).
MsgBox(0,"当前"&$Dims&"维数组有",$Rows&" 行, "&$Cols&" 列")
例:二维数组的输出不完善?
Dim $sMsg3
Dim $Week=[["周一","周二","周三"],["语文","数学","数学"],["英语","语文","体育"],["历史","音乐","班会"]]
ReDim $Week ;上面是1天3节课,现在多加了1行,既每天增加了1节课
For $i=0 To 2
        $Week[$i]="美术" ;因为行数是从0开始,新加的第5行下标自然就是,这里表示加的课都是美术
Next

For $x=0 To 2
        For $y=0 To 4
                MsgBox(0,"",$Week[$y][$x]&@CRLF)
        Next
Next
例:修正上例-感谢3mile
Dim $Week=[["周一","周二","周三"],["语文","数学","数学"],["英语","语文","体育"],["历史","音乐","班会"]]
ReDim $Week ;上面是1天3节课,现在多加了1行,既每天增加了1节课
Local $str
For $i=0 To 2
      $Week[$i]="美术" ;因为行数是从0开始,新加的第5行下标自然就是,这里表示加的课都是美术
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=[ _
["周一","语文","数学","数学"], _
["周二","英语","语文","体育"], _
["周三","历史","音乐","班会"]]

For $i=0 To 2
MsgBox(0,$Week[$i],$Week[$i]&" - "&$Week[$i]&" - "&$Week[$i])
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&";"&"它们依次是: "&$Split_Var&" : "&$Split_Var&" : "& _
$Split_Var)
;stringsplit()函数拆分成功后,将产生1个数组,第1个元素存储被拆分的字符串的数量,第2个元素是第一个被拆分的字符串,依次类推
$Split_Var1=StringSplit($Var,";")
MsgBox(0,"","被拆分的字符串的数量是: "&$Split_Var1&";"&"它们依次是: "&$Split_Var1)
;stringsplit()函数拆分失败后,也将产生1个数组,第1个元素是1,第2个元素存储的是整个字符串
例:获取指定文件的相关属性(加强理解)
$Attrib=FileGetAttrib("F:\temp\卷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("") ;获取任务栏句并
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,结果是123
Enum Step 2 $incr0,$incr2,$incr4
MsgBox(0,"",$incr0 & ":" &$incr2 & ":" & $incr4) ;自加指定步长,结果是024
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中),还包括各个窗口的ID(他们都存储于$array中)。

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=$Button1
         MsgBox(0,"选择的是第1个窗口的按钮","你按了“确定”按钮")
      Case $nMsgs=$gui_event_close And $nMsgs=$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选择语句
该选择语句1次只能进行一个条件的判断。
例:
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>
               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
        $Array="我"
        $Array="叫"
        $Array="邹"
        $Array="国"
        $Array="奎"
        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>
该循环语句至少先执行1次循环体内的代码,再判断条件是否满足来决定是否继续执行循环体代码。
例:
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
6.程序运行为功能(CrossDoor)
即程序运行于其它帐户下。不是很理解,是以某个用户身份编写的AU3程序在其他用户身份不管是本地还是远程计算机上都可以执行的意思吗?
7.函数的参数传递
函数的参数传递有“值传递”和“址传递”2种。值就是数值传递,如下列形式:
Function(2,4)
fucn Function($X,$Y) … EndFunc
址传递
Dim $x
Function(2,4,$x)
func Function($x,$y,ByRef $x) … EndFunc
还是来个例子:
Dim $x
MsgBox(0,"","zhouchang is: " & fucntion(2,4,$x))
Func fucntion($y,$z,ByRef$x)
        $x=($y+$z)*2
        Return $x
EndFunc
8.函数的嵌套与递归
嵌套就是在某个函数中调用其它的函数;递归就是函数自己调用函数,借用CroosDoor 的例子:
MsgBox(0,"递归阶乘",_Dg(5))
Func _Dg($n)
        If $n=1 Then
                Return 1
        Else
                Return $n * _Dg($n-1)
        EndIf
EndFunc
第一步:$n=5 返回 5* _Dg(4)
第2步:$n=4 返回4* _Dg(3)
第3步:$n=3 返回 3* _Dg(4)
第4步:$n=2 返回4* _Dg(1)
第5步:$n=1 返回1
结果就是:5*4*3*2*1
9.正则表达式(必须要理解啊!!!)
正则表达式的目的:判断字符串是否符合某个语法规则和截获符合规则的字符串及对符合规则的字符串进行替换。
常用函数:StrintgRgeExp()和StringRegExpReplace()。

10.注册表操作
注意注册表中“键名”“值项”的理解
例:读取指定键名下具体值项的值
$var=RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion","ProgramFilesDir")
;绿色部分是键名,兰色部分是值项
MsgBox(4096,"Program files are in:", $var)
例:学习RegEnumVal()---枚举指定键名Run下的所有值项
For $i=1 To 100
        Dim $var=RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",$i)
        ;RegEnumVal("键名",序数) 序数默认值为1
        If @error <> 0 Then ExitLoop ;玫举指定“键名下的值项失败就退出循环”
        MsgBox(0,"第"&$i&"个"&"开机启动项是",$var)
Next
例:学习RegEnumKey---枚举指定键名下的所有子键
For $i=1 To 100
        $var=RegEnumKey("HKEY_LOCAL_MACHINE\SOFTWARE",$i)
        $var1=RegEnumKey("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services",$i)
        If @error<> 0 Then ExitLoop
        MsgBox(4096,"计算机上已经安装第"&$i&"个程序是:",$var)
        MsgBox(4096,"计算机上已经安装第"&$i&"个服务是:",$var1)
Next
写、读、删注册表
例:普通文件的读写常规操作
RegWrite("HKEY_CURRENT_USER\Software\Testzgk","testzgk1","REG_MULTI_SZ","My name is zgk!"&@LF&"Welcome to you!")
MsgBox(0,"新建新键名Testzgk,它包含的值项是testzgk1,类型是REG_SZ",RegRead("HKEY_CURRENT_USER\Software\Testzgk","testzgk1"))
RegDelete("HKEY_CURRENT_USER\Software\Testzgk")
11.文件读写
当对少量文件进行读写操作时,可以使用文件名,当对大量文件进行读写操作时,用文件句柄,文件句柄通过fileopen()函数获得,别忘了完成对文件的操作后用fileclose()关闭他,否则会严重影响脚本执行效率。
filewrite()和filewriteline()对不存在的文件操作时可以新建该文件,但如果文件路径错误的话,就不会建立新的文件。
例:FileWriteLine(@DesktopDir&"\testzgk.txt","第一行") ;按行写入并自动换行
FileWrite(@DesktopDir&"\testzgk.txt","test") ;按行写入
FileWrite(@DesktopDir&"\testzgk.txt","test1") ;接着按行写入
$var1=FileRead(@DesktopDir&"\testzgk.txt",4) ;读取testzgk.txt的前4个字节内容,默认读取整个文本内容
$var3=FileRead(@DesktopDir&"\testzgk.txt")
$var2=FileReadLine(@DesktopDir&"\testzgk.txt",2)
MsgBox(0,"前4个字节:",""&$var1&@LF&"第2行:"&$var2&@LF&"整个文本内容是:"&@LF&$var3)

注意fileopen(文件名,模式)的选择,有只读模式和写入到文件末尾模式及删除原文见内容再写模式等。
例:没有写和读模式并存的可能性吗?
$file=FileOpen(@DesktopDir&"\testzgk.txt",2+8)
;注意第2个参数,2表示先清除原文件内容在进行写操作,8表示打开的文件不存在将强行建立
;0是只读模式,1是接着原文件内容进行写操作
;检查打开的文件是否 可读
If $file = -1 Then
        MsgBox(0,"错误","不能打开文件")
        Exit
EndIf
FileWriteLine($file,"行") ;写入一个字符串并以换行符结尾,也就是按行写
FileWrite($file,"t")
MsgBox(0,"全部数据",FileRead($file)) ;句并是写模式,所以读取数据会失败
FileClose($file)

至于.ini文件的读写,记住Iniread() iniwrite() inidelete()
IniReadSection("INI文件名","字段") ;从某标准配置文件(*.ini)中读取某个节中的所有关键字或值.
IniReadSectionNames( "文件名" ) ;从某标准配置文件(*.ini)中读取所有字段的信息.





二.进阶部分
1.GUI操作示例讲解
例:读取控件输入框内容并显示
#include <guiconstants.au3>
Opt("GUIOnEventMode",1)
GUICreate("我的第一个窗口")
GUISetOnEvent($GUI_EVENT_CLOSE,"_Exit")
$Input=GUICtrlCreateInput("1111",10,35,300,20)
$Btn=GUICtrlCreateButton("读取输入框",40,75,90,20)
GUICtrlSetOnEvent($Btn,"_ReadInput")
GUISetState(@SW_SHOW)
While 1
        Sleep(1000)
WEnd
Func_Exit()
        Exit
EndFunc
Func _ReadInput()
        $Message=GUICtrlRead($Input)
        MsgBox(0,"","读取的输入框的信息是:"&$Message)
EndFunc
例:读取输入框内容并随机显示窗口背景颜色
#include <guiconstants.au3>
;Global Const $GUI_EVENT_CLOSE=-3 ;窗口关闭消息的值
Opt("GUIOnEventMode",1) ;从默认的消息模式更改为事件模式
GUICreate("创建我的第一个窗口")
GUISetOnEvent($GUI_EVENT_CLOSE,"main");点击窗口的关闭后函数main进行处理
$Input=GUICtrlCreateInput("1111",10,35,300,20)
$Btn=GUICtrlCreateButton("读取输入框",40,75,90,20)
GUICtrlSetOnEvent($Btn,"main") ;点击按钮后函数main负责响应处理
GUISetState(@SW_SHOW)

While 1
        GUISetBkColor(RandomColor())
        Sleep(3000)
WEnd

Func main()
        Switch @GUI_CtrlId ;根据宏@GUI_CtrlId来判断消息
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Btn
                        $D=GUICtrlRead($Input)
                        MsgBox(0,"输入框的数据是",$D)
        EndSwitch
EndFunc

FuncRandomColor()
        Return "0x"&Hex(Random(0,255,1),2)&Hex(Random(0,255,1),2)&Hex(Random(0,255,1),2)
EndFunc ;产生一个随机的RGB颜色值
; Hex(表达式[,长度])
; Random([最小值[,最大值[,标志]]]) 标志为1表示返回整数,默认返回浮点数
例:读取输入框内容并随机显示窗口背景颜色
本例重点理解:对已知Windows消息代码的拦截
同时注意学习GUIRegisterMsg()和WinSetTrans()函数的学习
注释:对自己编写的脚本代码中的窗口可以容易的进行窗口消息的拦截,但对于外部程序的窗口进行消息拦截就必须注入到对方的进程中去
;#include <guiconstants.au3>
Global Const $GUI_EVENT_CLOSE=-3 ;窗口关闭消息的值
Global Const $WM_ENTERSIZEMOVE=0X0231 ;窗口移动消息的值
Global Const $WM_EXITSIZEMOVE=0X0232 ;窗口结束移动消息的值
Opt("GUIOnEventMode",1) ;从默认的消息模式更改为事件模式
$Gui=GUICreate("创建我的第一个窗口")
GUISetOnEvent($GUI_EVENT_CLOSE,"main");点击窗口的关闭后函数main进行处理
$Input=GUICtrlCreateInput("1111",10,35,300,20)
$Btn=GUICtrlCreateButton("读取输入框",40,75,90,20)
GUICtrlSetOnEvent($Btn,"main") ;点击按钮后函数main负责响应处理
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_ENTERSIZEMOVE,"WM_ENTERSIZEMOVE") ;当有窗口移动消息产生时,用自定义的函数WM_ENTERSIZEMOVE来响应处理
;GUIRegisterMsg(msgID,自定义函数) 该函数是为“已知的Windows消息代码注册一个用户自定义函数”,我理解是“用户自定义一个函数
;来响应窗口GUI所产生的已知的Windows消息代码,比如窗口移动、关闭或对控件各种点击动作等
GUIRegisterMsg($WM_EXITSIZEMOVE,"WM_EXITSIZEMOVE") ;当有结束窗口移动消息产生时,用自定义的函数WM_EXITSIZEMOVE来响应处理

While 1
        GUISetBkColor(RandomColor())
        Sleep(3000)
WEnd

Func main()
        Switch @GUI_CtrlId ;根据宏@GUI_CtrlId来判断消息
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Btn
                        $D=GUICtrlRead($Input)
                        MsgBox(0,"输入框的数据是",$D)
        EndSwitch
EndFunc

FuncRandomColor()
        Return "0x"&Hex(Random(0,255,1),2)&Hex(Random(0,255,1),2)&Hex(Random(0,255,1),2)
EndFunc ;产生一个随机的RGB颜色值
; Hex(表达式[,长度])
; Random([最小值[,最大值[,标志]]]) 标志为1表示返回整数,默认返回浮点数

Func WM_ENTERSIZEMOVE($hWndGUI,$MsgID,$WParam,$LParam)
        WinSetTrans($Gui,"",130) ;设置指定窗口的透明度 WinSetTrans("窗口标题","窗口文本",透明度)
EndFunc ;窗口移动时,设置窗口透明值为130

Func WM_EXITSIZEMOVE($hWndGUI,$MsgID,$WParam,$LParam)
        WinSetTrans($Gui,"",255)
EndFunc ;窗口结束移动时,设置窗口透明值为255,也就是不透明
例:父窗口与子窗口的学习
此处要加强(控件)标识和(控件)句柄的理解
;#include <guiconstants.au3>
Global Const $GUI_EVENT_CLOSE=-3 ;窗口关闭消息的值
Dim $Child_Gui ;定义一个变量存储子窗口的句柄
Opt("GUIOnEventMode",1) ;从默认的消息模式更改为事件模式
$Gui=GUICreate("创建我的第一个窗口") ;该窗口是 === 父窗口
GUISetOnEvent($GUI_EVENT_CLOSE,"main");点击窗口的关闭后函数main进行处理
$Input=GUICtrlCreateInput("1111",10,35,300,20)
$Btn=GUICtrlCreateButton("读取输入框",40,75,90,20)
GUICtrlSetOnEvent($Btn,"main") ;点击按钮后函数main负责响应处理
$Show_Child_Btn=GUICtrlCreateButton("显示子窗口",40,100,90,20) ;点击该按钮显示 --- 子窗口
GUICtrlSetOnEvent($Show_Child_Btn,"main")
GUISetState(@SW_SHOW)

While 1
        GUISetBkColor(RandomColor()) ;GUISetBkColor ( 背景色 [, 窗口句柄] )
        Sleep(3000)
WEnd

Func main()
        Switch @GUI_CtrlId ;根据宏@GUI_CtrlId标识来判断消息
                Case $GUI_EVENT_CLOSE
                        Switch @GUI_WinHandle ;根据宏@GUI_WinHandle来判断产生关闭消息的窗口信息
                                Case $Gui ;如果当前窗口句柄是$Gui,退出脚本
                                        Exit
                                Case $Child_Gui ;如果当前窗口句柄是子窗口$Child_Gui,删除子窗口
                                        GUIDelete($Child_Gui)
                        EndSwitch
                Case $Btn
                        $D=GUICtrlRead($Input)
                        MsgBox(0,"输入框的数据是",$D)
                Case $Show_Child_Btn
                        Child_Gui()
        EndSwitch
EndFunc

Func Child_Gui()
        $Child_Gui=GUICreate("",200,40,-1,-1,-1,-1,$Gui) ;GUICreate()里的最后一个参数$Gui表示新建立的窗口是该变量所存储的窗口句柄的子窗口
        GUISetOnEvent($GUI_EVENT_CLOSE,"main")
        GUISetState(@SW_SHOW)
EndFunc

FuncRandomColor()
        Return "0x"&Hex(Random(0,255,1),2)&Hex(Random(0,255,1),2)&Hex(Random(0,255,1),2)
EndFunc ;产生一个随机的RGB颜色值
; Hex(表达式[,长度])
; Random([最小值[,最大值[,标志]]]) 标志为1表示返回整数,默认返回浮点数

Func WM_ENTERSIZEMOVE($hWndGUI,$MsgID,$WParam,$LParam)
        WinSetTrans($Gui,"",130) ;设置指定窗口的透明度 WinSetTrans("窗口标题","窗口文本",透明度)
EndFunc ;窗口移动时,设置窗口透明值为130

Func WM_EXITSIZEMOVE($hWndGUI,$MsgID,$WParam,$LParam)
        WinSetTrans($Gui,"",255)
EndFunc ;窗口结束移动时,设置窗口透明值为255,也就是不透明
例:父窗口与子窗口的学习(注意:子窗口无法移出到父窗口以外)
Run("notepad.exe")
WinWaitActive("无标题 - 记事本")
$Gui=GUICreate("创建的窗口被嵌入到记事本",240,120)
GUISetState()
DllCall("user32.dll","int","SetParent","hwnd",$Gui,"hwnd",WinGetHandle("无标题 - 记事本"))
Do
Until GUIGetMsg()=-3 Or Not WinExists("无标题 - 记事本") ;当窗口消息等于退出消息或记事本窗口不存在时,就退出DO循环

例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

FuncGUIExit()
        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 FileMenu 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("IconExample",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("ActiveXObject")

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 ViewExample",$TreeView)
GUICtrlCreateTreeViewItem("Subitem1",$TreeTopLevel)
GUICtrlCreateTreeViewItem("Subitem2",$TreeTopLevel)

GUICtrlCreateLabel("ExampleUpdown",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("ComboExample",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
Wend2. 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","Hellofrom 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","Hellofrom 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 anarray,eventhe changed valuesof the variables
$SectorsPerCluster=$calldata
$BytesPerSector=$calldata
$NumberOfFreeClusters=$calldata
$TotalNumberOfClusters=$calldata
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()
问题:获得的时间是上午时间?
解:&DllStructGetData($SYSTEMTIME,"wHour")+8,注意多了 +8   (感谢C.L)
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")
$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

zps26 发表于 2010-6-24 11:04:12

本帖最后由 zps26 于 2010-9-17 15:49 编辑

向默默引领我们前进的人致敬!!!帖子很好!

t87564833 发表于 2010-6-24 14:43:45

恩不错·学习楼主精神!

newuser 发表于 2010-6-25 11:34:43

回复 1# newuser
顶的人不多啊,自己来吧,呵呵!

andersonljw 发表于 2010-6-27 11:19:34

支持,顶下来。

jjxwc 发表于 2010-6-27 19:17:14

不错不错~ ,楼主有心

newuser 发表于 2010-6-29 16:34:24

回复 1# newuser
自己再顶!

ashfinal 发表于 2011-2-5 19:35:45

原创笔记是得好好看下 {:face (356):}
页: [1]
查看完整版本: 向所有和CrossDoor一样的人致敬!