找回密码
 加入
搜索
查看: 17307|回复: 23

[原创] 笔记杂烩

 火.. [复制链接]
发表于 2010-8-18 10:49:06 | 显示全部楼层 |阅读模式
还是笔记!好长时间 停滞了 !
《AU3帮助》学习笔记
2010-4-29
目录
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:\Some\Folder")。
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:\testautonotepad.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学习笔记
 楼主| 发表于 2010-8-18 10:50:45 | 显示全部楼层
回复 1# newuser
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
&#61548;        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:\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("[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()。

&#61548;        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
&#61548;        Arrays
数组就是数的矩阵,矩阵里的元素应该是同类型和大小的,但在变体矩阵中,类型可以多种多样,但使用了变体数组尤其是在数组中套用了变体数组,那么在脚本执行过程中将是非常消耗资源和运行缓慢,依次不推荐使用变体数组。反正我是用不上它!
数组可以作为参数传递给函数,但必须使用ByRef。
2
&#61548;        #inclued 和 fileinstall()
它们很类似,都是将指定的文件在脚本编译的时候包含到被编译的脚本中。但使用fileinstall()预装需要包含的文件在编译后会导致脚本的体积过大。
#include可以将预先写好的函数或现有常量包含到脚本中,例#include <array.au3>或 #include <buttonconstants.au3>。
fileinstall的语法:fileinstall(“sourcefilepath”,”destinationpath”[,flag]) ,其中flag可是0或1,0表示如果目的路径下有相同文件不覆盖,反之覆盖。
3
&#61548;        消息循环模式
对于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
&#61548;        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.条件与循环语句
    它们都可以多层嵌套。
    利用条件和循环语句可以简化代码并完成复杂的任务。
&#61548;        条件语句
if…then…else
例1:
Global  $Num=2
&#61548;        If @OSVersion="WIN_XP" Then
&#61548;                If @UserName="Administrator" Then
&#61548;                        If $Num=2 Then
&#61548;                                MsgBox(0,"$Num值的判断消息","$Num的值是:" & $Num)
&#61548;                        Else
&#61548;                                MsgBox(0,"$Num值的判断消息","$Num的值不是2")
&#61548;                                Exit
&#61548;                        EndIf
&#61548;                Else
&#61548;                        MsgBox(0,"","不是以Administrator用户身份登陆")
&#61548;                EndIf
&#61548;        Else
&#61548;                MsgBox(0,"","该系统不是WIN_XP系统")
&#61548;        EndIf
例2:
If @OSVersion="WIN_VISTA" Then
&#61548;                MsgBox(0,"","你的系统是WIN_VISTA")
&#61548;            ElseIf @OSVersion="WIN_2003" Then
&#61548;                    MsgBox(0,"","你的系统是WIN_2003")
&#61548;                ElseIf @OSVersion="WIN_XP" Then
&#61548;                MsgBox(0,"","你的系统是WIN_XP")
&#61548;                ElseIf @OSVersion="WIN_2000" Then
&#61548;                        MsgBox(0,"","你的系统是WIN_2000")
&#61548;        Else
&#61548;        EndIf
select…case语句
该选择语句同时能进行多个条件的判断。
例1:
Select
&#61548;            Case        @OSVersion="WIN_VISTA"
&#61548;                MsgBox(0,"","你的系统是WIN_VISTA")
&#61548;            Case @OSVersion="WIN_2003"
&#61548;                    MsgBox(0,"","你的系统是WIN_2003")
&#61548;                Case @OSVersion="WIN_XP"
&#61548;                MsgBox(0,"","你的系统是WIN_XP")
&#61548;                Case @OSVersion="WIN_2000"
&#61548;                        MsgBox(0,"","你的系统是WIN_2000")
&#61548;        Case Else
&#61548;        EndSelect
switch…case选择语句
该选择语句1次只能进行一个条件的判断。
例:
Switch @OSVersion
&#61548;                Case "WIN_VISTA"
&#61548;                        MsgBox(0,"","你的系统是WIN_VISTA")
&#61548;                Case "WIN_2003"
&#61548;                        MsgBox(0,"","你的系统是WIN_2003")
&#61548;                Case @OSVersion="WIN_XP"
&#61548;                        MsgBox(0,"","你的系统是WIN_XP")
&#61548;                Case @OSVersion="WIN_2000"
&#61548;                        MsgBox(0,"","你的系统是WIN_2000")
&#61548;                Case Else
&#61548;        EndSwitch
循环语句(5种)
A.For…Next
语法结构:for <variable>=startvalue to <stop>  [step]
               statement
           next
例:
For $x=10 To 1 Step -1  ;步长默认值为1
&#61548;                SplashTextOn("标题",$x,100,50) ;splashtexton()用于创建一个自定义的文本闪平窗口
&#61548;                Sleep(1000)  ;延迟1秒
&#61548;        Next
&#61548;            ;SplashOff() ;当然是关闭闪屏窗口
&#61548;                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]
&#61548;        $Array[0]="我"
&#61548;        $Array[1]="叫"
&#61548;        $Array[2]="邹"
&#61548;        $Array[3]="国"
&#61548;        $Array[4]="奎"
&#61548;        For $Element In $Array
&#61548;                For $x=3 To 1 Step -1
&#61548;                        SplashTextOn("",$x,100,50)
&#61548;                        Sleep(1000)
&#61548;                Next
&#61548;                SplashOff()
&#61548;                MsgBox(0,"$Array every element is: ",$Element)
&#61548;                WinActivate("$Array every element is: ")
&#61548;                ;ControlClick("$Array every element is: ",$Element,"Button1")
&#61548;                SendKeepActive("$Array every element is: ")
&#61548;                Send("{Enter}")
&#61548;        Next
C.Do
  statements
  … Until <expression>
该循环语句至少先执行1次循环体内的代码,再判断条件是否满足来决定是否继续执行循环体代码。
例:
Dim $Variable=10
&#61548;        Do
&#61548;                SplashTextOn("标题",$Variable,100,50) ;splashtexton()用于创建一个自定义的文本闪平窗口
&#61548;                $Variable -=1
&#61548;                Sleep(1000)  ;延迟1秒
&#61548;        Until $Variable=0
&#61548;        SplashOff()
&#61548;        MsgBox(0,"闪屏10秒后...","大家好,我是邹国奎,很高兴通过AU3让我们在这里结识!希望我们能成为朋友")
D.While <expression>
  statements
  …
  Wend
该循环语句先判断条件再决定是否执行循环体内的代码,可以一次循环体代码都不执行。
例:
Dim $Variable=10
&#61548;        While $Variable>0
&#61548;                SplashTextOn("标题",$Variable,100,50) ;splashtexton()用于创建一个自定义的文本闪平窗口
&#61548;                $Variable -=1
&#61548;                Sleep(1000)  ;延迟1秒
&#61548;        WEnd
&#61548;        SplashOff()
&#61548;        MsgBox(0,"闪屏10秒后...","大家好,我是邹国奎,很高兴通过AU3让我们在这里结识!希望我们能成为朋友")
F.With <expression>
  注意expression表达式必须是Object类型
  …
  EndWith
  该语句常被用来简化脚本代码
  例:
  #cs
&#61548;        下列代码没有使用With...EndWith语句
&#61548;        #ce
&#61548;        $Object=ObjCreate("InternetExplorer.Application.1")
&#61548;        $Object.visible=1
&#61548;        $Object.height=768
&#61548;        $Object.width=1024
&#61548;        $Object.navigate("http://www.baidu.com")
用With…EndWith简化后
$Object=ObjCreate("InternetExplorer.Application.1")
&#61548;        With $Object
&#61548;                .visible=1
&#61548;            .height=768
&#61548;            .width=1024
&#61548;                .navigate("http://www.baidu.com")
&#61548;        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)
例:对某文件的IP地址进行二进制的替换(文本内容仅1行:10.600.58.32)
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>

Global $sFile, $hFile, $sText, $nBytes, $tBuffer


$sFile = @DesktopDir & '\test.txt' ;要读取文件的路径
$sText = Binary(FileRead($sFile)) ;读文件内容并将内容转换成二进制
$tBuffer = DllStructCreate("byte[" & StringLen($sText) & "]") ;创建1个C/C++样式数据结构供dllcall()使用
;语法:DllStructCreate ( "数据结构" [,指针] )
$Search=StringTrimLeft(Binary("58.32"),2) ;将文本中准备替换的内容转换成二进制并从字符串左开始删除指定数量的字符
$Replace=StringTrimLeft(Binary("85.23"),2)
$re=BinaryToString(StringReplace($sText,$Search,$Replace)) ;实现替换过程并将替换后的内容转换成字符
;MsgBox(0,0,$re)
DllStructSetData($tBuffer, 1, $re) ;设置数据结构中部分元素的数据。语法:DllStructSetData ( 数据结构, 元素, 值 [, 索引 ] )
$hFile = _WinAPI_CreateFile($sFile, 2) ;为其它设备创建或者打开一个文件.
_WinAPI_WriteFile($hFile, DllStructGetPtr($tBuffer), StringLen($re), $nBytes) ;写入数据到文件指定位置
_WinAPI_CloseHandle($hFile) ;关闭打开文件的句柄


至于.ini文件的读写,记住Iniread() iniwrite() inidelete()
IniReadSection("INI文件名","字段") ;从某标准配置文件(*.ini)中读取某个节中的所有关键字或值.
IniReadSectionNames( "文件名" ) ;从某标准配置文件(*.ini)中读取所有字段的信息.
 楼主| 发表于 2010-8-18 10:52:25 | 显示全部楼层
回复 2# newuser
二.进阶部分
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

Func  RandomColor()
        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

Func  RandomColor()
        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

Func  RandomColor()
        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

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
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","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()
问题:获得的时间是上午时间?
解:&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[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
AutoIt基础实践练习笔记一
1.列出本机驱动器个数并分别显示出来?
代码如下:
$drivetotal=DriveGetDrive("all")
If Not @error Then
        MsgBox(0,"所有驱动器类型", "总共有" & $drivetotal[0] & "个驱动器")
          For $x=1 To $drivetotal[0]
                  MsgBox(0,"第" & $x & "个驱动器是:",$drivetotal[$x])
          Next
EndIf
注意:应进行if错误判断
2.创建一个新文件,并逐行写入内容?
代码如下:
$accordlinewrite=FileOpen("c:\zgktest.txt",1)
If @error Then
        MsgBox(0,"error","文件未打开或创建新文件失败")
Else
        FileWrite($accordlinewrite,"往第1行写的内容")
        FileWrite($accordlinewrite,"继续往第1行写内容" & @CRLF)
        FileWrite($accordlinewrite,"往第2行写入的内容")
EndIf
FileClose($accordlinewrite)
注意:fileopen()并不是通常的“打开文件”,而是AutoIt3后台打开并进行操作
3.逐行读去文件内容?
代码如下:
HotKeySet("{F2}","_Copy")
;定义F2为热键,按下F2后,执行函数“ _Copy  "

Global $LineNum=1
Global $IniFile=FileOpenDialog("选择要读取的文本文件","","(*)")
If @Error Then Exit
;"选择要读取的文本文件"是"打开文件窗口的标题"
;" "是你指定"打开文件的路径",空默认为"系统根目录下"
;(*)是"打开的文件类型"

While 1
Sleep(500)
WEnd
;不清楚,等待什么呢?我把它拿掉也没影响什么?不过我也是刚学AU3不到1个月,还没摸到门呢?

Func _Copy()
$GetLine=FileReadLine($IniFile,$LineNum)
If @Error=-1 Then
$LineNum=1
Else
ClipPut($GetLine)
Send("^{V}")
$LineNum+=1
EndIf
EndFunc
;if @Error=-1 如果到文件末尾,在返回文件首行
;ClipPut($GetLine) 将读取到的内容放到剪贴板上,在 Send("^{V}") 进行粘贴,再 $LineNum+=1 进入下一行
4.播放AVI文件?
#include <GUIConstants.au3>
$x=ObjCreate("WMPlayer.OCX")
$Form1 = GUICreate("AForm1", 500,400, 193, 200)
$Button1 = GUICtrlCreateButton("开始", 104, 344, 97, 33, 0)
$Button2 = GUICtrlCreateButton("停止", 272, 336, 121, 41, 0)
$sky=GUICtrlCreateObj($x, 100,50,500,500)
GUISetState(@SW_SHOW)
$x.uimode="none"
$x.url="F:\家庭录象\yiyan\liuyi107.avi"
$x.Controls.play

;MsgBox(0,"",$sky)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
   Case $GUI_EVENT_CLOSE
    Exit

EndSwitch
Wend
5.自动建立文本文件并保存?
代码如下:
Send("#r")
;#表示Windows徽标,即发送Win+R
WinWaitActive("运行")
Send("notepad.exe{Enter}")
;发送notepad.exe到运行窗口并回车
WinWaitActive("无标题 - 记事本")
Send("这里是通过WIN+R打开运行窗口,再自动输入notepad.exe后,在打开记事本程序自动输入指定内容后保存并退出 {F5}")
;Send("现在的时间/日期是 {F5}")
WinClose("无标题 - 记事本")
WinWaitActive("记事本")
Send("!Y")
WinWaitActive("另存为")
Send("testautosave.txt!S")
;将新建立的文本文件命名为testautosave.txt并存储
遗留问题(已解决-感谢C.L):无法存储到指定路径?
Send("#r")
WinWaitActive("运行","打开(&O)")
ControlSetText("运行","打开(&O)","Edit1","notepad.exe")
ControlClick("运行","打开(&O)","Button2")
WinWaitActive("无标题 - 记事本")
Send("用于测试对于ComboBox的操作,其中还包括测试controlcommand下的setcurrentselection  selectstring")

WinClose("无标题 - 记事本")
;Send("!F")
;Send("!X")

WinWaitActive("记事本","文件 无标题 的文字已经改变。")
ControlClick("记事本","文件 无标题 的文字已经改变。","Button1")
WinWaitActive("另存为","保存在")

;ControlCommand("另存为","保存在","ComboBox1","SelectString","本地磁盘 (C:)")
;ControlCommand("另存为","保存在","ComboBox1","SetCurrentSelection",5)

ControlSetText("另存为","保存在","Edit1","testComboBox.txt")
;其实改成ControlSetText("另存为","保存在","Edit1","c:\testComboBox.txt")就OK了
ControlClick("另存为","保存在","Button2")

新问题:
1. ControlCommand("另存为","保存在","ComboBox1","SelectString","本地磁盘 (C:)")
为什么不好使?(已解决-感谢afan)
是" 本地磁盘 (C:)"前的图标没有捕获造成的吗?可能是“该图标造成字符串不匹配最终造成ControlCommand()失效!
在该语句前/后分别加上:ControlClick("另存为","保存在","ComboBox1")就确保ControlCommand()成功
我的理解:因为她特殊,controlclick()先让它获得焦点,在利用controlcommand()下的selectstring命令选中希望的存储路径,再controlclick()返回到到ComboBox上,这样理解容易些!
2. ControlCommand("另存为","保存在","ComboBox1","SetCurrentSelection",5)
为什么不好使?
它不涉及图标的问题啊!
方法补充一(条条大路同罗马):
$newfilename="c:\zgknew.txt"
$newfilecontents="C盘下新建立一个文件zgknew.txt,写入内容后自动保存"
$temp=FileOpen($newfilename,2)
FileWrite($temp,$newfilecontents)
FileClose($temp)
6.求某正数的立方?
代码如下:
Dim $x,$y
While 1
$x=InputBox("inputbox","请输入一个正整数:","","",50,50,"","",10)
$y=$x^3
  Select
        Case @error=0  
                MsgBox(0,"inputbox  成功",$x & "的3次方是:"  & $y)
        Case @error=1
                MsgBox(0,"canel","你按了取消按钮")
                ExitLoop
        Case @error=2
                MsgBox(0,"delay","时间超时")
                ExitLoop
  EndSelect
Wend
注意:当使用inputbox()输入时,一定要验证“当按下Cancel按钮时的动作”
7.对输入的学生分数进行评价?
代码如下:
Dim $score
While 1
$score=InputBox("分数输入","请输入每名学生的分数:")
;$score=InputBox("分数输入","请输入每名学生的分数:","","",100,50,150,250,50)
;"default"是InputBox内默认的值

;If @error=1 Then MsgBox(0,"取消","你按了取消按钮")

If @error=1 Or $score="" Then
        MsgBox(0,"发生错误","你按了取消按钮或输入值为空")
        Exit
EndIf
If @error=2  Then MsgBox(0,"超时了","在规定时间内你没有输入学生分数")


Select
        Case $score>90 And $score<=100
                MsgBox(0,"优秀类","该名学生成绩优秀")
        Case $score>80 And $score<=90
                MsgBox(0,"良好类","该名学生成绩良好")
        Case $score>=60  And $score<=80
                MsgBox(0,"优秀","该名学生成绩及格")
        Case $score>=0 And $score<60
                MsgBox(0,"优秀","该名学生成绩很差")
        Case Else
                MsgBox(0,"输入错误","输入了不正确的分数")
EndSelect
Wend
我的错误:把If @error=1 Or $score="" 中的红色部分写成了@error=””,这样无论输入什么样的分数都先执行 MsgBox(0,"发生错误","你按了取消按钮或输入值为空") 再进行case判断。
8.
;目的:随意输入4位以内的整数,判断它是多少位,每一位数分别是什么,并把它们反向排列成一个新数
;技巧:把十位 百位 千位 都当 个位 来处理
  
Dim $Unit=0,$Ten=0,$Hundred=0,$Thousand=0
Dim $Digit=1
Dim $Num,$NewNum
$Num=InputBox("输入框","请输入4为数以内的整数")
If @error=1 Or $Num="" Then
        MsgBox(0,"发生错误","按了Cancel按钮或输入值为空")
        Exit
EndIf
Select
        Case $Num>=0 And $Num<10
                $Digit=1
                $Unit=Mod($Num,10)
                $NewNum=$Unit
        Case $Num>=10 And $Num<100
                $Digit=2
                $Unit=Mod($Num,10)
                $Ten=Mod(($Num-$Unit)/10,10)
                $NewNum=$Ten+$Unit*10
        Case $Num>=100 And $Num<1000
                $Digit=3
                $Unit=Mod($Num,10)
                $Ten=Mod(($Num-$Unit)/10,10)
                $Hundred=Mod(($Num-$Ten*10-$Unit)/100,10)
                $NewNum=$Hundred+$Ten*10+$Unit*100
        Case $Num>=1000 And $Num<=9999
                $Digit=4
                $Unit=Mod($Num,10)
                $Ten=Mod(($Num-$Unit)/10,10)
                $Hundred=Mod(($Num-$Ten*10-$Unit)/100,10)
                $Thousand=Mod(($Num-$Hundred*100-$Ten*10-$Unit)/1000,10)
                $NewNum=$Thousand+$Hundred*10+$Ten*100+$Unit*1000
        EndSelect
        MsgBox(0,"digit","这是一个"&$Digit&"位数"&@CRLF _
        &"个位:"&$Unit&@CRLF&"十位:"&$Ten&@CRLF&"百位:"&$Hundred&@CRLF  _
        &"千位:"&$Thousand&@CRLF&"重组的新数:"&$NewNum)
9.突然想用AutoIt3自动MSTSC?
代码如下:
Run("mstsc")
WinWaitActive("远程桌面连接","连接(&N)")
ControlSetText("远程桌面连接","连接(&N)","Edit1","要登陆的IP")
ControlClick("远程桌面连接","连接(&N)","Button1")
WinWaitActive("要登陆的IP - 远程桌面")
;注意上面的窗口标题我改了
Send("password{Enter}")
补充(感谢cnhfg):
send(("+{tab}"))
send("administrator")
send("{tab}")
send("123")
send("{enter}")
10.输出一个3行5列矩阵?
代码如下:
Dim $i,$j
;分别定义了对 行 和 列  操作的2个变量
Dim $s=""
;定义了用于输出目的的变量
For $i=1 To 3
        For $j=1 To 5
                $s=$s&" " & ($i*10+$j)
        Next
    $s=$s & @CRLF
Next
MsgBox(0,"从第1到第3逐行输出:",$s)

;错误:$s=$s&" " & ($i*10+$j)
;首先输出的数字是连着的,原因是将 " "写成了""
;其次是将($i*10+$j)写成了"$i*10+$j
11.要求只能用20张10元、20元、50元的人民币组成总额为600元,问总共有多少组法?
代码如下:
Dim $Ten,$Twenty,$Fifty
;分别定义 10   20    50 人民币的张数 变量
Dim $Sum=""
;定义了成功组合的结果 变量
For $ten=0 To 20
        For $Twenty=0 To 20
                For  $Fifty=0 To 12
                        If  $Ten+$Twenty+$Fifty=20 And $Ten*10+$Twenty*20+$Fifty*50=600 Then
                                $Sum=$Sum&"10元人民币是:"&$Ten&"张 "&"20元人民币的是:"&$Twenty&"张 "&"50元人民币是:"&$Fifty&"张 "&@CRLF
                        EndIf
                Next
        Next
Next
;因为限定了只能用20张人民币
;而可能使用的10元人民币张数在0-60之间;可能使用的20元人民币张数在0-30之间;可能使用的50元人民币张数在0-12之间;
;以上2个条件必须同时符合,所以10元在0-20之间;20元在0-20之间;50元在0-12之间才行
MsgBox(0,"显示组合结果",$Sum)
;我的错误 $Sum="10元人民币是:"&$Ten&"张 "&"20元人民币的是:"&$Twenty&"张 "&"50元人民币是:"&$Fifty&"张 "&@CRLF
;少了$Sum=$Sum&"10元人民币是:"&$Ten&"张 "&"20元人民币的是:"&$Twenty&"张 "&"50元人民币是:"&$Fifty&"张 "&@CRLF,这是个致命错误,没有使用初始状态的$Sum,当然只能显示最后一次成功组合的信息,照猫画猫是不行的啊!!!
12.关于ASCII的了解?
ASCII列表就是“字符串与ASCII值一一对应的关系表”。
ASC(字符串) :将字符串转换成对应的ASCII值
Chr(ASCII值) :将ASCII值转换成字符串
@CR 对应13 ;@LF  对应10 ;@TAB 对应 9
A-Z 分别对应65-90  ;a-z 分别对应 97-122
具体示例代码1:
Dim $i,$s
$s=""
For $i=65 To 90
        $s=$s&Chr($i)&" "
Next
MsgBox(0,"依次显示ASCII值从65-90所对应的字符串值",$s)
具体示例代码2:
Dim $Char
While 1
$Char=InputBox("判定输入是否是字母","请输入字符")
If @error=1 Or  $Char=""  Then
        MsgBox(0,"输入非法","你输入的不是字符或输入为空")
        Exit
EndIf
If (Asc($Char)>=65 And Asc($Char)<=90) Or (Asc($Char)>=97 And Asc($Char)<=122) Then
        MsgBox(0,"输入正确","你输入的是A-Z或a-z中的字母"&"中的 "&$Char)
Else
        MsgBox(0,"输入错误","你输入的不是A-Z或a-z中的字母")
        Exit
EndIf
Wend
13.乘法口诀?
方法1:
Dim $i,$j
Dim $s=""
For $i=1 To 9
        For $j=1  To 9
                $s&=StringFormat ("%2d *%2d=%-2d",$i,$j,$i*$j)&"  "
        Next
        $s=$s&@CRLF
Next
;$s = StringReplace ($s,"=0","=  ")     修改了StringFormat(),该行可以省略掉了   
MsgBox(0,"乘法口诀列式",$s)

;感谢C.L
;StringFormat("格式控制字符串",变量1[,...变量32])
;返回根据“格式控制字符串”参数定义中的“变量格式”格式化后的字符串
;好绕嘴,就是根据“格式控制字符串定义的格式进行后续变量的输出
; % 格式控制字符串标识
; 2d 以整数类型输出,2是输出的宽度
; - 在指定的宽度左对齐,默认是右对齐
;我将$s&=StringFormat ("%2d*%2d=%2d",$i,$j,$i*$j)&"  " 改成 $s&=StringFormat ("%2d *%2d=%-2d",$i,$j,$i*$j)&"  "

;StringReplace("字符串","搜索串"或起始位置,"替换串"[,数量[区分大小写]]
;$text = StringReplace("this is a line of text", " ", "-")
;$numreplacements = @extended

;@extended 扩展函数返回值,常用于StringReplace()

;MsgBox(0, "替换后:", $text)
;MsgBox(0, "替换操作次数:", $numreplacements)

方法2:@TAB 制表符
;感谢lpxx
Dim $i,$j
Dim $s=""
For $i=1 To 9
        For $j=1  To 9
                $s=$s&$i&"*"&$j&"="&($i*$j)&" "& @TAB
        Next
        $s=$s&@CRLF
Next
MsgBox(0,"乘法口诀列式",$s)
方法3:设置内循环
;感谢netegg
Dim $i,$j
Dim $s=""
For $i=1 To 9
        For $j=1  To  $i ;精华所在
                $s=$s&$j&"*"&$i&"="&($j*$i)&" "& @TAB
        Next
        $s=$s&@CRLF
Next
MsgBox(0,"乘法口诀列式",$s)
 楼主| 发表于 2010-8-18 10:53:52 | 显示全部楼层
回复 3# newuser

14.字符串相关函数了解?
代码如下:
Dim $Name="My name is zougk! Welcome to my style"
Dim $Str1,$Str2,$Str3,$Str4,$Str5,$Str6,$Str7,$Str8,$Str9,$Str10,$Str11,$Str12
Dim $Len
$Str1=StringLeft($Name,16)
MsgBox(0,"StringLeft'use",$Str1)
$Str2=StringRight($Name,19)
MsgBox(0,"StringRight'use",$Str2)
$Str3=StringMid($Name,12,5)
MsgBox(0,"StrintgMid'use",$Str3)
$Len=StringLen($Name)
MsgBox(0,"变量$Name的长度","字符串"&$Name&"的长度是:"&$Len&"位")
$Str4=StringUpper($Name)
MsgBox(0,"小写字母变大写",$str4)
$Str5=StringLower($Name)
MsgBox(0,"大写字母变小写",$Str5)
$Str6=StringReplace($Name,"zougk","zouyy")
MsgBox(0,"字符串指定内容替换",$Str6)
$Str7=StringSplit($Name," ",0)
MsgBox(0,"字符串按空格进行分割","第1个字母"&$Str7[1]&" "&"第2个字母"&$Str7[2]) ;之后省略吧
$Str8=StringSplit($Name,"",1)
MsgBox(0,"字符串按单词逐个分割","第1个字母"&$Str8[1]&" "&"第2个字母"&$Str8[2]) ;之后省略吧

; [已解决]谁能告诉我 StringSplit($Name," ",0) 和 StringSplit($Name," ",1) 的区别?
Dim $Name="My name is zougk, Welcome to my style"
Dim $Str1,$Str2,$Str3,$Str4,$Str5,$Str6,$Str7,$Str8,$Str9,$Str10,$Str11,$Str12
Dim $Len
$Str1=StringSplit($Name,", ",0)
MsgBox(0,"test stringsplit","第1个被分割的子字符串"&$Str1[1]&@CRLF&"第2个被分割的子字符串"&$Str1[2]& _
@CRLF&"第3个被分割的子字符串"&$Str1[3]&@CRLF&"第4个被分割的子字符串"&$Str1[4]&@CRLF& _
"第5个被分割的子字符串"&$Str1[5]&@CRLF&"第6个被分割的子字符串"&$Str1[6]&" ")
$Str2=StringSplit($Name,", ",1)
MsgBox(0,"test2 stringsplit",$Str2[1])

;感谢afn
;分割符是对分割符前的”子字符串"进行分割,到了第5个分割符前的子字符串是空
;对于只有1个分割符的StringSplit("字符串","分割符",flag),flag为0或1都一样
;对于大于等于2个分割符的StringSplit("字符串","分割符",flag),flag为0表示“分割符以 个体形式  参与到分割字符串的行动中来
;对于大于等于2个分割符的StringSplit("字符串","分割符",flag),flag为1表示“分割符以 整体形式  参与到分割字符串的行动中来

$Str9=StringStripWS($Name,8)
MsgBox(0,"去掉字符串中的所有空格空格",$str9) ;StringStripWS("字符串",标志) 标志为8是去掉所有空格,还可以设置为1 2  4
$Str10=StringTrimLeft($Name,17)
MsgBox(0,"从左截掉指定数量的字符后剩余的字符串",$Str10)
$Str11=StringTrimRight($Name,19)
MsgBox(0,"从右截掉指定数量的字符后剩余的字符串",$Str11)
$Str12=StringIsAlNum($Name)  ;判定$Name是否完全是字母或数字,是返回1,因有  空格  和 ! ,所以返回0
;StringIsAlpha("string") 判定string是否完全是字母
MsgBox(0,"字符串是否完全是字母",$Str12)
$Str13=StringInStr($Name,"my",0)
;StringInStr("字符串","子字符串",是否区分大小写 0是不区分大小写,出现次序
MsgBox(0,"检查字符串中是否包含指定的子字符串",$Str13)
$Str14=StringInStr($Name,"my",1,1)
MsgBox(0,"检查字符串中是否包含指定的子字符串",$Str14)
15._arraydisplay  函数的应用?
代码如下:
#include <array.au3>
Dim $HomeMember[3][3]=[["zgk","1970",40],["yhh","1980",30],["zyy","2000",10]]
_ArrayDisplay($HomeMember,"家庭信息")
;我的错误是["yhh","1980,30]少了一个双引号,还以为是在中英输入状态下的[ ]出了问题呢?
16.打开指定网页?
错误:run(“iexplore.exe http://sohu.com”)
原因:iexplore.exe路径有问题,run无法找到它,Run("C:\Program Files\Internet Explorer\iexplore.exe http://10.64.240.131")解决
补充:Run("Notepad.exe", "", @SW_MAXIMIZE),最大化的运行记事本
Run("C:\Program Files\Internet Explorer\iexplore.exe http://10.64.240.131","",@SW_HIDE),打开指定网站并隐藏
Run(“control  sysdm.cpl”),打开“控制面板”下的“系统属性”
ShellExecute("rundll32.exe","shell32.dll,#61"),打开“开始”“运行”
ShellExecute("rundll32.exe","shell32.dll,#60"),打开“关闭Windows”窗口

遗留问题(2010.3.11):
如何将C:\Program Files换成%ProgramFiles%而变的通用?
解决(2010.3.11):
run(@ProgramFilesDir  & “\Internet  Explorer\iexplore.exe http://10.64”,””,@SW_Maximize)
@ProgramFilesDir  AutoIt3系统变量,指定C:\Program Files具体位置
&  字符串连接符号
如何打开指定的文件夹?
解  决 (2010.3.11):
Run(“explorer c:\program files”)
Run(“explorer /e,c:\program files”) ,以“资源管理器”的方式打开指定的文件夹
17.如何用ControlCommand去掉软件安装中的某插件或快捷方式?
语法:ControlCommand ( "窗口标题", "窗口文本", 控件ID, "命令", "选项")
18.打开记事本自动输入定制内容后在自动关闭记事本程序?
原码:
Run('notepad.exe')
WinWait("无标题 - 记事本","")
WinWaitActive("无标题 - 记事本","")
Send("自动向记事本输入指定内容后并自动关闭它")
WinClose("无标题 - 记事本","")
WinWait("记事本","")
WinWaitActive("记事本","")
Send('&n')
错误:将winclose放到最后一行,那肯定不对,先要关闭记事本后才出现“是否存储内容”的窗口。
19.winzip自动化安装遇到的问题?

错误:捕捉到的“标题”是WinZip&reg; 14.0 Setup,但是复制到编辑器@变成了? ,这样在winwaitactive中没有成功捕捉到该窗口,controlclick  Setup当然错误。
20.创建GUI截面遇到的关于” “和“”的错误?
原码:
#include <GUIConstants.au3>

GUICreate("GUI图形窗口",200,100)
GUICtrlCreateLabel("邹国奎创建",20,20,70)
$okButton=GUICtrlCreateButton("还OK吧",40,40,60)
GUISetState(@SW_SHOW)

While 1
        $msg=GUIGetMsg()
       
        Select
      Case $msg=$GUI_EVENT_CLOSE
            MsgBox(0,"GUIs事件","你选择了关闭!正在退出")
      Case $msg=$okButton
            MsgBox(0, "GUI 事件", "您按下了“还OK吧”按钮!")
        ExitLoop
    EndSelect
Wend
注意:红色的“还OK吧”,不应该是在英文状态输入的” “。
21.学习GUI的onEvent模式遇到的问题?
代码如下:
#include <GUIConstants.au3>
Opt("GUIonEventMode",1)
$mainwindow=GUICreate("主窗口-邹国奎",200,100,200,100)
GUISetOnEvent($gui_event_close,"CLOSEClick")
GUICtrlCreateLabel("最近过的如何!",10,20)
$Button=GUICtrlCreateButton("还OK!",20,40,60)
GUICtrlSetOnEvent($Button,"BUTTON")

$secondwindow=GUICreate("这是一个测试的非主窗口,不会显示",200,100)
GUISetOnEvent($gui_event_close,"CLOSEClick")

GUISwitch($mainwindow)
GUISetState(@SW_SHOW)
;GUISetState(@SW_SHOW,$mainwindow)也可以
While 1
        Sleep(1000)
WEnd

Func BUTTON()
        MsgBox(0,"GUI事件","你按下了“还OK!”按钮")
EndFunc

Func CLOSEClick()
        If @GUI_WinHandle=$mainwindow Then
                MsgBox(0,"GUI事件","你选择了关闭主窗口,正在关闭中...")
                Exit
               
        EndIf
EndFunc
注意红色部分,我点击按钮事件没反应啊?原来我是用了GUISetonEvent,而按钮是控件应该是GUICtrlSetonEvent()啊!机械学习不灵活呀!
22.使用#include多次包含同一个自定义的AU3文件错误?
代码如下:
;;; 下面是脚本 TIME.AU3 的代码 ;;;
MsgBox(0,"", "现在时间是: " & @HOUR & ":" & @MIN & ":" & @SEC)

;;; 下面是脚本 SCRIPT.AU3 的代码 ;;;
#include "TIME.AU3"
MsgBox(0,"", "示例")
#include "TIME.AU3"
Exit

; 运行 script.au3 将会输出以下三个消息框:
; 第一个报时,第二个是“示例”,第三个也是报时。
注意:在SCRIPT.AU3中使用#include多次包含TIME.AU3时,要在被包含的TIME.AU3文件头部添加#inclued-once,即
;;; 下面是脚本 TIME.AU3 的代码 ;;;
#inclued-once
MsgBox(0,"", "现在时间是: " & @HOUR & ":" & @MIN & ":" & @SEC)
;如果不加#include-once,会发生TIME.AU3已经包含错误提示,但“继续执行”同样会输出3个消息框
代码补充:
;;; 下面是脚本 LIBRARY.AU3 的代码 ;;;
#include-once

Func myFunc()
    MsgBox(0,"", "此对话框由 library.au3 内的函数调出")
EndFunc

;;; 下面是脚本 SCRIPT.AU3 的代码 ;;;
#include "Library.au3"
#include "Library.au3"  ;若LIBRARY.AU3为使用 #include-once指令则会抛出一个错误

MsgBox(0, "示例", "此对话框从 script.au3 中调出")
myFunc()
Exit
; 运行 script.au3 将会输出以下两个消息框:
; 第一个是“此对话框从 script.au3 中调出”
; 第二个是“此对话框由 library.au3 内的函数调出”
注意:虽然在script.au3中2次使用#include "Library.au3",但在执行script.au3时,只弹出2个信息框,说明“自定义函数-myFunc()”只用在被调用时才执行其特定的功能。
遗留问题:在scirpt.au3中的多个#include "Library.au3"是不是每一个都执行了呢?如果将以上代码改成
;;; 下面是脚本 LIBRARY.AU3 的代码 ;;;
#include-once
MsgBox(0,"", "此对话框由 library.au3 内的函数调出")
Func myFunc()
    MsgBox(0,"", "此对话框由 library.au3 内的函数调出")
EndFunc

;;; 下面是脚本 SCRIPT.AU3 的代码 ;;;
#include "Library.au3"
MsgBox(0, "示例", "此对话框从 script.au3 中调出")
#include "Library.au3"  ;若LIBRARY.AU3为使用 #include-once指令则会抛出一个错误
myFunc()
Exit
那么还是显示2个消息框分别是:
"此对话框由 library.au3 内的函数调出"和"此对话框从 script.au3 中调出",感觉script.au3中第1个#include "Library.au3"执行了,可后一个#include "Library.au3" 和myFunc()没起作用啊???
23.交换数据错误?
代码如下:
dim $first=1,$second=2
swap($first,$second)
msgbox(0,"$first和$second交换后: ","$first= " &  $first)
func swap( $x, $y)
local $t
$t=$x
$x=$y
$y=$t
endfunc
注意:无法完成交换,改成func swap(ByRef $x,ByRef $y)则可以完成交换,ByRef指定函数swap()所接受的参数必须是变量且可以被函数swap()修改。
知识补充:
主体程序的参数是实际参数,函数中的参数是形式参数。它们之间的值传递有2中形式:值传递和址传递。
如果不加ByRef,就是值传递,相当于主体参数将它的值传递给形式参数后,他们就没有任何关系了 ,无论形式参数怎么交换都不会影响实际参数的值,所以无法实现交换。
址传递是将代表变量的内存空间的地址进行传递,就好象映射一样,修改了形式参数,他所对应的实际参数也会变化。

24.for…next问题?
代码如下:
For 1 To $y Step 1
MsgBox(0,"显示寻麻疹文档内容:",$x)
Next
注意:For <控制变量> = <初始值> To <终值> [Step <步长>],基础不牢啊!
25.soundplay(“music”,0)任务栏的AU3图标一闪而过,将0改1就OK!0是不等歌曲播完直接执行下一语句,可下面什么都没有所以就退出了,1则是等歌曲播放完再退出。不细心看帮助啊!!!
26.关于@error的困惑?
代码如下:
$var = IniReadSection("C:\Temp\myfile.ini", "section2")
If @error Then
    MsgBox(4096, "", "发生错误,可能目标文件并非标准的INI文件.")
Else
    For $i = 1 To $var[0][0]
        MsgBox(4096, "", "关键字:" & $var[$i][0] & @CRLF & "数值:" & $var[$i][1])
    Next
EndIf
注意:总把 if @error 当成 if @error=0,0当然是没错误,实际它是“如果有错怎么怎么样”,IniReadSection()读取的返回的数组元素的数量默认都存储到$var[0][0]是规定!
27.GUICtrlCreateAVI()的问题?
注意:不支持有声AVI文件。
外置的一样可以。但是网上的视频AVI又不行。郁闷。AU3安装目录自带的却行。
原因还在研究中。但是可以不用GUICtrlCreateAvi
直接用GUICtrlCreateObj。只是这个加载对象的,运行程序的时候感觉有点慢。
找到原因了。。。帮助没说明GUICtrlCreateAvi ()

上MSDN才查到原因。而帮助里边_GUICtrlAVI_Open才说有。FUCK

GUICtrlCreateAvi () 与_GUICtrlAVI_Open是一样不支持有声AVI的。

MSND说明:
Open does not support sound in an AVI clip; you can open only silent AVI clips.

两个都是只支持无声AVI,有声的用ObjCreate("WMPlayer.OCX")吧。
 楼主| 发表于 2010-8-18 10:55:08 | 显示全部楼层
回复 4# newuser
28.for…next从1加到100的问题?
代码如下:
Dim $Sum,$i
$Sum=0
$i=1
For $i=1 To 100  [Step 1]
        $Sum=$Sum+$i
Next
MsgBox(0,"从1一直加到100","总和:"&$Sum)
我的错误:在for循环内又加了 个$i=$i+1,真是多余+错误,for本身已经加了吗 !
29.ToolLip居中显示:ToolTip("测试ToolLip居中显示文字", @DesktopWidth/2 -100, @DesktopHeight/2 -100,"正在执行安装...")
30.random()取随机数?
#include <array.au3>
;在1-100之间随机的取出10个数并比较大小
Dim  $Num=11 ;定义数组的下标
Dim  $i,$RadomArray[$Num]
Dim  $Min,$Max
For $i=1  To $Num-1
        $RadomArray[$i]=Random(1,100,1)
Next
_ArrayDisplay($RadomArray,"显示1-100之间的随机数")
;Random(最小值,最大植,flag) flag默认取”浮点数“,设置为1,取整数
$Min=$RadomArray[1]
$Max=$RadomArray[1]
For $i=2 To $Num-1
        If $RadomArray[$i]>$Max  Then
                $Max=$RadomArray[$i]
        EndIf
        If  $RadomArray[$i]<$Min Then
                $Min=$RadomArray[$i]
        EndIf
Next
MsgBox (0,"显示 1-100之间最小和最大的随即数","最小的随机数是:"&$Min&@CRLF&"最大的随机数是:"&$Max)
31.生成10个不重复的随机数?从小到大显示随机数?
;在1-10生成不重复的10个随机数
#include <array.au3>
Const $N=11 ;定义数组的下标,因为要选10个随机数,所以下标为11
Dim $RadomArray[$N] ;定义随机数组
Dim $Num ;判断生成的随机数是否相同中间过度变量
Dim $i,$j ;用于2个循环使用的中间过度变量
Dim $Flag ;用于判定是否有生成相同随机数的标志变量,0表示没有
$i=1
While $i<$N ;当条件成立,进入第1层循环
        $Num=Random(1,10,1) ;首先生成1个随机数
        $Flag=0 ;因为目前只有1个随机数,所以$Flag=0
        $j=1  ;赋值$j,为 进入 第2个循环设置初始条件
        While $j<$i ;判定进入第2个循环是否符合条件,首次肯定不执行,因为$i=$j,所以直接跳入到下一个 if判断语句
                If $Num=$RadomArray[$j] Then
                        $Flag=1
                        ExitLoop
                Else
                        $j +=1
                EndIf
        WEnd
        If  $Flag=0 Then  ;首次$Flag肯定为0
                $RadomArray[$i]=$Num   ;成功为随机数组元素进行第1次赋值
                $i +=1 ;成功首次赋值后,第1个循环的中间过度变量加1,进行第2次的第1层循环
        EndIf
WEnd
_ArrayDisplay($RadomArray,"显示不重复的随机数")
;当$i=2时,符合第1层循环条件,进入第1层循环,再次生成第2个随机数$Num
;当$i=2时,$j<$i符合进入第2层循环,将之前的已生成的第1个$RandomArray[1]与新生成的第2个$Num比较,如果相同$Flag为1,
;退出第2层循环重新生成第2个$Num,否则$j加1破坏第2层的循环条件$j<$i返回到第1层循环,在进入下一个if 判断,继续为随机数组
;增加新的元素,此时的$j=2,$i=3
;剩下依次类推
For $i=1 To $N-2
        For $j=$i+1 To $N-1 ;精华所在 $j=$i+1,如果写成$j=2则不能完成从小到大的排序
                If $RadomArray[$i]>$RadomArray[$j] Then
                        $Temp=$RadomArray[$i]
                        $RadomArray[$i]=$RadomArray[$j]
                        $RadomArray[$j]=$Temp
                EndIf
        Next
Next
_ArrayDisplay($RadomArray,"从小到大显示随机数")
以函数完成上述功能:
#include <array.au3>
Local $RadomArray
$RadomArray=CreateRadomArray()
_ArrayDisplay($RadomArray)
$RadomArray=SortRadomArray($RadomArray)
_ArrayDisplay($RadomArray)

Func CreateRadomArray()
        Local $N=11
        Local $RadomArray[$N]
        Local $i,$j,$Num,$Flag
        $i=1
        While $i<$N
                $Num=Random(1,20,1)
                $Flag=0
                $j=1
                While $j<$i
                        If $Num=$RadomArray[$j] Then
                                $Flag=1
                                ExitLoop
                        Else
                                $j +=1
                        EndIf
                WEnd
                If $Flag=0 Then
                        $RadomArray[$i]=$Num
                        $i +=1
                EndIf
        WEnd
        $RadomArray[0]=10
        Return($RadomArray)               
EndFunc

Func SortRadomArray($Array)
        Local $i,$j,$t  
        For $i=1 To $Array[0]-1
                For $j=$i+1 To $Array[0]
                        If $Array[$i]>$Array[$j] Then
                                $t=$Array[$i]
                                $Array[$i]=$Array[$j]
                                $Array[$j]=$t
                        EndIf
                Next
        Next
$Array[0]="" ;为什么要将它置空呢?如不置空,将无法实现排序
;哎!该数组下标是存放数组元素的个数的,不需要参与到排序当中,死教条不灵活!
        Return($Array)
EndFunc
32.设计一个GUI并设置了背景PIC控件,但GUI上的BUTTON控件无反应的原因?
答:错误:$background = GUICtrlCreatePic("F:\儿子背景照片\080402069.jpg", 0, 0, 400, 400)
注意GuiCtrlCreatePIC()的语法,没有进行PIC控件“样式”的编辑:
以下是我帮你找的帮助资料,希望你能理解,其实我也不很理解,跟着学习!
1.        $background = GUICtrlCreatePic("F:\儿子背景照片\080402069.jpg", 0, 0, 400, 400, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))        
2.        ;$SS_NOTIFY:使按钮发送 BN_KILLFOCUS(取消焦点) 与 BN_SETFOCUS(设置焦点) 通知消息到父窗口. 注意不论按钮是否有这个样式,都能发送 BN_CLICKED 单击通知消息.
3.        ;要获取 BN_DBLCLK 双击通知消息, 按钮必须有 BS_RADIOBUTTON 或 BS_OWNERDRAW 样式.
4.        ;$WS_GROUP:指定控件组的第一个控件.控件组由第一个控件和其后定义的所有控件组成,一直到下一个控件带有 WS_GROUP 样式为止.
5.        ;$WS_CLIPSIBLINGS:剪辑子窗口相互对齐; 也就是说, 当某一子窗口收到 WM_PAINT 消息时, 此样式将剪辑所有其他子窗口重叠区域
6.        ;并更新子窗口. 如果未指定子窗口重叠, 这是有可能的, 在需绘制客户区域子窗口时, 只绘制客户区域临近的子窗口.
我的理解是他起了作用(不知道是否正确?):
$SS_NOTIFY:使按钮发送 BN_KILLFOCUS(取消焦点) 与 BN_SETFOCUS(设置焦点) 通知消息到父窗口. 注意不论按钮是否有这个样式,都能发送 BN_CLICKED 单击通知消息.  ---按钮可以获得焦点,而如果背景PIC控件不这样设置,BUTTON控件就无法获得焦点,自然就无法响应!
第2中解决方法:在$background = GUICtrlCreatePic("F:\ 080402069.jpg", 0, 0, 400, 400下一行加入:  GUICtrlSetState(-1,$gui_DISABLE)也能解决。
GuiCtrlSetState(控件ID,状态)
GuiCtrlSetState(-1,$gui_DISABLE)  :-1本例指PIC控件,如果该行放到BUTTON控件下一行就是指
BUTTON,$gui_DISABLE是把控件变成灰色不可用。
AutoIt基础实践练习笔记二

Cy10-ZouGuoKui 2010-4-21,新起点新加油!

1.我要自动给系统打补丁
示例1:
#include <File.au3>
$FileList = _FileListToArray(@ScriptDir & "\Update", "*.exe", 1);列出当前路径下的Update目录
;下的所有.exe文件
;语法  _FileListToArray($sPath[,$sFilter=”*”[,$iFlag=0]])
;列出指定路径既 $sPath下的文件和文件夹
;$sFilter 可选过滤器,默认是 * ,本例是 *.exe
;$iFlag 返回标志,0 是文件和文件夹都返回,1是仅返回文件,2是文件夹
;@error为1,找不到指定路径或路径非法,为4是找不到文件
;@error 为2,$sFilter不可用,为3 $iFlag不可用
If @error = 1 Then
        MsgBox(0, '', '没有找到文件夹,点击确定后自动创建')
        DirCreate(@ScriptDir & '\Update')
        Exit
EndIf
If @error = 4 Then
        MsgBox(0, '', '错误 文件夹中没有文件,清将补丁文件放入update文件夹')
        Exit
EndIf
For $i = 3 To 1 Step -1
        ToolTip(@CR & "  共" & $FileList[0] & "个系统补丁," & $i & "秒后开始安装...   " & @CR, @DesktopWidth - 260, @DesktopHeight - 100)
        Sleep(1000)
Next
For $i = 1 To $FileList[0]
        ToolTip(@CR & "  正在安装 " & $FileList[$i] & " (" & $i & "/" & $FileList[0] & ")   " & @CR, @DesktopWidth - 400, @DesktopHeight - 100)
; $FileList[$i] & " (" & $i & "/" & $FileList[0] & ")显示什么补丁第几个安装,美化窗口
        RunWait(@ScriptDir & "\Update\" & $FileList[$i] & " /quiet /passive /norestart")
Next
ToolTip(@CR & "  系 统 补 丁 安 装 完 毕 !  " & @CR, @DesktopWidth - 260, @DesktopHeight - 100)
Sleep(2000)
示例2:照猫画虎
#include <File.au3>
Dim $iRecords
If Not _FileReadToArray("PatchsList.txt",$iRecords) Then
;_FileReadToArray($FilePath,ByRef $aArray)
;将指定路径的文件内容读取到 指定数组中
        MsgBox(0,"发现错误","无法读取指定文件内容")
        Exit
EndIf
For $i = 3 To 1 Step -1
        ToolTip(@CR & "  共" & $iRecords[0] & "个系统补丁," & $i & "秒后开始安装...   " & @CR, @DesktopWidth - 260, @DesktopHeight - 100)
        Sleep(1000)
Next
For $i=1 To $iRecords[0]
        ToolTip(@CR & "  正在安装 " & $iRecords[$i] & " (" & $i & "/" & $iRecords[0] & ")   " & @CR, @DesktopWidth - 400, @DesktopHeight - 100)
        RunWait(@ScriptDir & "\Update\" & $iRecords[$i] & " /quiet /passive /norestart")
Next
ToolTip(@CR & "  系 统 补 丁 安 装 完 毕 !  " & @CR, @DesktopWidth - 260, @DesktopHeight - 100)
示例3:从指定网站下载补丁列表文件
;到指定网站下载指定目录下的文件
#Alternate
Local $DownLoadFile=InetGet("http://10.64.240.23:801/patchs/PatchsList.txt","patchslist.txt",1,1)
;定义变量$DownLoadFile接受IneGet返回的句柄信息
Do
        Sleep(250)
Until  InetGetInfo($DownLoadFile,2) ;检查下载是否完成
Local $DataInfo=InetGetInfo($DownLoadFile)
MsgBox(0,"显示相关下载信息","正在读取的字节: " & $DataInfo[0] & @CRLF & _
        "下载文件的大小: " &  $DataInfo[1] & @CRLF & _
                "下载是否完成?true表示文件下载过程完成:  "  & $DataInfo[2] & @CRLF & _
                "下载是否成功完成?true表示文件全部下载完毕:  "  & $DataInfo[3] & @CRLF)
2.我要自己制作系统工具?
示例1:消息模式版 GUIGetMsg()
;问题1:加上 Opt("GUIOnEventMode",1) 所有按钮都不好使?
;答:看到hynq2000说事件模式效率高,就简单的加上该语句,可是自己下面的循环判断是消息模式啊!当然导致所有按钮不好使啊!!!
;    将用于循环判断的语句写成Func()形式,就可以用事件模式了。
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("系统工具集 ", 631, 454, 192, 114)
$Group1 = GUICtrlCreateGroup(".exe类", 48, 32, 169, 305)
$Button2 = GUICtrlCreateButton("Windows更新程序", 64, 56, 137, 33)
$Button3 = GUICtrlCreateButton("远程桌面", 64, 96, 137, 33)
$Button4 = GUICtrlCreateButton("系统信息", 64, 136, 137, 33)
$Button5 = GUICtrlCreateButton("文件签名验证程序", 64, 176, 137, 33)
$Button6 = GUICtrlCreateButton("任务管理器", 64, 216, 137, 33)
$Button7 = GUICtrlCreateButton("系统配置实用程序", 64, 256, 137, 33)
$Button8 = GUICtrlCreateButton("磁盘垃圾清理", 64, 296, 137, 33)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2 = GUICtrlCreateGroup(".msc类", 232, 32, 169, 305)
$Button9 = GUICtrlCreateButton("本地服务设置", 248, 56, 137, 33)
$Button10 = GUICtrlCreateButton("共享文件夹管理器", 248, 96, 137, 33)
$Button11 = GUICtrlCreateButton("磁盘碎片整理", 248, 136, 137, 33)
$Button12 = GUICtrlCreateButton("计算机管理", 248, 176, 137, 33)
$Button13 = GUICtrlCreateButton("磁盘管理", 248, 216, 137, 33)
$Button14 = GUICtrlCreateButton("本地安全设置", 248, 256, 137, 33)
$Button15 = GUICtrlCreateButton("设备管理器", 248, 296, 137, 33)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group3 = GUICtrlCreateGroup(".cpl类(控制面板)", 416, 32, 169, 305)
$Button16 = GUICtrlCreateButton("系统属性", 432, 56, 137, 33)
$Button17 = GUICtrlCreateButton("用户帐户", 432, 96, 137, 33)
$Button18 = GUICtrlCreateButton("自动更新", 432, 136, 137, 33)
$Button19 = GUICtrlCreateButton("网络连接", 432, 176, 137, 33)
$Button20 = GUICtrlCreateButton("区域和语言选项", 432, 216, 137, 33)
$Button21 = GUICtrlCreateButton("添加/删除程序", 432, 256, 137, 33)
$Button22 = GUICtrlCreateButton("Internet属性", 432, 296, 137, 33)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group4 = GUICtrlCreateGroup("以上工具也可通过运行执行", 48, 352, 537, 65)
$Input1 = GUICtrlCreateInput("", 64, 376, 337, 21)
$Button1 = GUICtrlCreateButton("运行", 416, 368, 105, 33)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Label1 = GUICtrlCreateLabel("感谢hynq2000!仅为练手使用---采十青青橄榄  2010.4.27", 216, 424, 320, 66)
$Group5 = GUICtrlCreateGroup("", 32, 20, 569, 455)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlSetState(-1, $GUI_DISABLE)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Button2 ;开始执行系统的exe文件,一般它们都在  \system32目录下
                        Run(@SystemDir&"\wupdmgr.exe")
                Case $Button3
                        Run(@SystemDir&"\mstsc.exe")
                Case $Button4
                        Run(@SystemDir&"\winmsd.exe")
                Case $Button5
                        Run(@SystemDir&"\sigverif.exe")
                Case $Button6
                        Run(@SystemDir&"\taskmgr.exe")
                Case $Button7
                        Run(@WindowsDir&"\pchealth\helpctr\binaries\Msconfig.exe") ;msconfig命令不在\system32目录下
                        ;Run(@SystemDir&"\tsshutdn.exe") 它是60秒倒计时关机命令
                Case $Button8
                        Run(@SystemDir&"\cleanmgr.exe")
                Case $Button9 ;开始执行系统的msc文件,一般它们都在  \system32目录下,通过shellexecute执行它们
                        ShellExecute(@SystemDir&"\services.msc")
                Case $Button10
                        ShellExecute(@SystemDir&"\fsmgmt.msc")
                Case $Button11
                        ShellExecute(@SystemDir&"\dfrg.msc")
                Case $Button12
                    ShellExecute(@SystemDir&"\compmgmt.msc")
                Case $Button13
                        ShellExecute(@SystemDir&"\diskmgmt.msc")
                Case $Button14
                        ShellExecute(@SystemDir&"\secpol.msc")
                Case $Button15
                        ShellExecute(@SystemDir&"\devmgmt.msc")
                Case $Button16 ;开始执行系统的cpl文件,一般它们都在  \system32目录下,通过control来执行.cpl文件
                        Run("control sysdm.cpl")
                Case $Button17
                        Run("control userpasswords2")
                        ;Run("control nusrmgr.cpl"),不知道为什么它不好使!
                Case $Button18
                        Run("control wuaucpl.cpl")
                Case $Button19
                        Run("control ncpa.cpl")
                Case $Button20
                        Run("control intl.cpl")
                Case $Button21
                        Run("control appwiz.cpl")
                Case $Button22
                        Run("control inetcpl.cpl")
                Case $Button1 ;执行 “运行” 按钮
                        Run('cmd /c'&GUICtrlRead($input1))
                        ;RunWait(@ComSpec&" /c "&GUICtrlRead($Input1)) ;参数  /c 表示要执行后面的“命令字符串”,而字符串是来自控件$input1内的内容
                        ;问题2:输入 msconfig 怎么不执行呢?
                        ;答:笨蛋!它不在/system32目录下,必须输入绝对路径才能执行,要不然再修改Path把msconfig所在的目录也加上
                        ;问题3:如何执行tasklist后让出现的窗口定住呢?Run('cmd /c pause')只是又打开一个DOS的暂停窗口啊?
                        ;答:其实在$input1内输入“tasklist & pause"就实现了,不过这还是DOS啊!
                        ;cmd /V:ON  启用“延迟变量”的意思!
        EndSwitch
WEnd
示例2:事件模式响应版 Switch @GUI_CtrlID
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Au3Check_Stop_OnWarning=y
#AutoIt3Wrapper_Run_Tidy=y
#Obfuscator_Parameters=/striponly
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
;######密码版的系统工具####################
;问题1:为什么不加While循环,界面会一闪而过?---感谢水木子
;答:如果不加While循环,代码一直执行到完毕,界面肯定一闪而过,
;    并且水木子老师建议不要sleep(1),那样延迟时间短执行过快CPU会受不了的!这都是经验啊!

;进行密码验证
_CheckPassWords()

Opt("GUIOnEventMode", 1) ;采用事件模式响应
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=

$Form1 = GUICreate("系统工具集 ", 631, 454, 192, 114)
$Group1 = GUICtrlCreateGroup(".exe类", 48, 32, 169, 305)
$Button2 = GUICtrlCreateButton("Windows更新程序", 64, 56, 137, 33)
$Button3 = GUICtrlCreateButton("远程桌面", 64, 96, 137, 33)
$Button4 = GUICtrlCreateButton("系统信息", 64, 136, 137, 33)
$Button5 = GUICtrlCreateButton("文件签名验证程序", 64, 176, 137, 33)
$Button6 = GUICtrlCreateButton("任务管理器", 64, 216, 137, 33)
$Button7 = GUICtrlCreateButton("系统配置实用程序", 64, 256, 137, 33)
$Button8 = GUICtrlCreateButton("磁盘垃圾清理", 64, 296, 137, 33)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2 = GUICtrlCreateGroup(".msc类", 232, 32, 169, 305)
$Button9 = GUICtrlCreateButton("本地服务设置", 248, 56, 137, 33)
$Button10 = GUICtrlCreateButton("共享文件夹管理器", 248, 96, 137, 33)
$Button11 = GUICtrlCreateButton("磁盘碎片整理", 248, 136, 137, 33)
$Button12 = GUICtrlCreateButton("计算机管理", 248, 176, 137, 33)
$Button13 = GUICtrlCreateButton("磁盘管理", 248, 216, 137, 33)
$Button14 = GUICtrlCreateButton("本地安全设置", 248, 256, 137, 33)
$Button15 = GUICtrlCreateButton("设备管理器", 248, 296, 137, 33)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group3 = GUICtrlCreateGroup(".cpl类(控制面板)", 416, 32, 169, 305)
$Button16 = GUICtrlCreateButton("系统属性", 432, 56, 137, 33)
$Button17 = GUICtrlCreateButton("用户帐户", 432, 96, 137, 33)
$Button18 = GUICtrlCreateButton("自动更新", 432, 136, 137, 33)
$Button19 = GUICtrlCreateButton("网络连接", 432, 176, 137, 33)
$Button20 = GUICtrlCreateButton("区域和语言选项", 432, 216, 137, 33)
$Button21 = GUICtrlCreateButton("添加/删除程序", 432, 256, 137, 33)
$Button22 = GUICtrlCreateButton("Internet属性", 432, 296, 137, 33)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group4 = GUICtrlCreateGroup("以上工具也可通过运行执行", 48, 352, 537, 65)
$Input1 = GUICtrlCreateInput("", 64, 376, 337, 21)
$Button1 = GUICtrlCreateButton("运行", 416, 368, 105, 33)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Label1 = GUICtrlCreateLabel("感谢hynq2000!仅为练手使用---采十青青橄榄  2010.4.27", 216, 424, 320, 66)
$Group5 = GUICtrlCreateGroup("", 32, 20, 569, 455)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlSetState(-1, $GUI_DISABLE)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

;###########进行事件关联##############
GUISetOnEvent($gui_event_close, "_Exit") ;错误:将  $ 写成 @
GUICtrlSetOnEvent($Button2, "_SysTools") ;点击$Button2,函数_SysTools响应,注意,不需要书写_SysTools(),而且要用" "将函数括起来
GUICtrlSetOnEvent($Button3, "_SysTools") ;另外注意是GUICtrlSetOnEvent(),不是GUISetOnEvent(),人家可是控件啊 !
GUICtrlSetOnEvent($Button4, "_SysTools")
GUICtrlSetOnEvent($Button5, "_SysTools")
GUICtrlSetOnEvent($Button6, "_SysTools")
GUICtrlSetOnEvent($Button7, "_SysTools")
GUICtrlSetOnEvent($Button8, "_SysTools")
GUICtrlSetOnEvent($Button9, "_SysTools")
GUICtrlSetOnEvent($Button10, "_SysTools")
GUICtrlSetOnEvent($Button11, "_SysTools")
GUICtrlSetOnEvent($Button12, "_SysTools")
GUICtrlSetOnEvent($Button13, "_SysTools")
GUICtrlSetOnEvent($Button14, "_SysTools")
GUICtrlSetOnEvent($Button15, "_SysTools")
GUICtrlSetOnEvent($Button16, "_SysTools")
GUICtrlSetOnEvent($Button17, "_SysTools")
GUICtrlSetOnEvent($Button18, "_SysTools")
GUICtrlSetOnEvent($Button19, "_SysTools")
GUICtrlSetOnEvent($Button20, "_SysTools")
GUICtrlSetOnEvent($Button21, "_SysTools")
GUICtrlSetOnEvent($Button22, "_SysTools")
GUICtrlSetOnEvent($Button1, "_SysTools")
;###########事件关联完毕##############

;###########进入##############
;注意:没有这个循环,界面是一闪而过
While 1
        Sleep(250)
WEnd
;###########主循环完毕##############
;###########定义响应事件的函数##############
Func _SysTools()
        Switch @GUI_CtrlId ;这是事件模式,别忘了消息模式是 Switch @GUIGetMsg()
                Case $Button2 ;开始执行系统的exe文件,一般它们都在  \system32目录下
                        Run(@SystemDir & "\wupdmgr.exe")
                Case $Button3
                        Run(@SystemDir & "\mstsc.exe")
                Case $Button4
                        Run(@SystemDir & "\winmsd.exe")
                Case $Button5
                        Run(@SystemDir & "\sigverif.exe")
                Case $Button6
                        Run(@SystemDir & "\taskmgr.exe")
                Case $Button7
                        Run(@WindowsDir & "\pchealth\helpctr\binaries\Msconfig.exe") ;msconfig命令不在\system32目录下
                        ;Run(@SystemDir&"\tsshutdn.exe") 它是60秒倒计时关机命令
                Case $Button8
                        Run(@SystemDir & "\cleanmgr.exe")
                Case $Button9 ;开始执行系统的msc文件,一般它们都在  \system32目录下,通过shellexecute执行它们
                        ShellExecute(@SystemDir & "\services.msc")
                Case $Button10
                        ShellExecute(@SystemDir & "\fsmgmt.msc")
                Case $Button11
                        ShellExecute(@SystemDir & "\dfrg.msc")
                Case $Button12
                        ShellExecute(@SystemDir & "\compmgmt.msc")
                Case $Button13
                        ShellExecute(@SystemDir & "\diskmgmt.msc")
                Case $Button14
                        ShellExecute(@SystemDir & "\secpol.msc")
                Case $Button15
                        ShellExecute(@SystemDir & "\devmgmt.msc")
                Case $Button16 ;开始执行系统的cpl文件,一般它们都在  \system32目录下,通过control来执行.cpl文件
                        Run("control sysdm.cpl")
                Case $Button17
                        Run("control userpasswords2")
                        ;Run("control nusrmgr.cpl"),不知道为什么它不好使!
                Case $Button18
                        Run("control wuaucpl.cpl")
                Case $Button19
                        Run("control ncpa.cpl")
                Case $Button20
                        Run("control intl.cpl")
                Case $Button21
                        Run("control appwiz.cpl")
                Case $Button22
                        Run("control inetcpl.cpl")
                Case $Button1 ;执行 “运行” 按钮
                        Run('cmd /c' & GUICtrlRead($Input1)) ;刚开始,$Button1就是没有反映,原来是忘记将其进行事件关联了
                        ;RunWait(@ComSpec&" /c "&GUICtrlRead($Input1)) ;参数  /c 表示要执行后面的“命令字符串”,而字符串是来自控件$input1内的内容
                        ;问题2:输入 msconfig 怎么不执行呢?
                        ;答:笨蛋!它不在/system32目录下,必须输入绝对路径才能执行,要不然再修改Path把msconfig所在的目录也加上
                        ;问题3:如何执行tasklist后让出现的窗口定住呢?Run('cmd /c pause')只是又打开一个DOS的暂停窗口啊?
                        ;答:其实在$input1内输入“tasklist & pause"就实现了,不过这还是DOS啊!
                        ;cmd /V:ON  启用“延迟变量”的意思!
        EndSwitch
EndFunc   ;==>_SysTools
;###########响应事件的函数结束##############
;###########定义验证密码的函数##############
Func _CheckPassWords()
        Local $MyPassWords = "MynameisZGK"
        $InputPassWords = InputBox("密码验证", "请输入密码:", "", "*", 200, 100, @DesktopWidth - 600, @DesktopHeight - 450, 20)
        ;InputBox("标题","提示","默认内容","密码字符","宽","高","左窗口距离","上窗口距离","密码输入延迟时间")
        ;*就是让输入的密码字符以星号显示
        ;@DesktopWidth-600,@DesktopHeight-450,就是让密码输入框居中显示
        If @error = 0 Then ;@error=0表示返回的字符串有效
                If $InputPassWords <> $MyPassWords Then
                        MsgBox(262144 + 32, "真遗憾!!!", "密码错了,想不起来了?", 9)
                        _Exit()
                Else ;密码检查通过
                        $InputPassWords = "" ;进入工具操作界面并清空输入的密码
                EndIf
        ElseIf @error = 1 Then ;@error=1表示用户按了Cancel按钮
                MsgBox(262144 + 32, "", "用户按了取消按钮")
                _Exit()
        ElseIf @error = 2 Then ;@error=2表示输入超时
                MsgBox(262144 + 32, "真遗憾!!!", "输入口令时间超时", 9)
                _Exit()
        ElseIf @error = 3 Then ;输入框显示失败,这通常是由参数失效引起
                MsgBox(262144 + 16, "意外错误!!!", "口令输入框显示失败!请重试!", 9)
                _Exit()
        Else
                _Exit()
        EndIf
EndFunc   ;==>_CheckPassWords
;###########严整密码函数结束##############
Func _Exit()
        Exit
EndFunc   ;==>_Exit
 楼主| 发表于 2010-8-18 10:55:28 | 显示全部楼层
回复 5# newuser
AutoIt3学习所遇问题集
1.打开指定网页?
错误:run(“iexplore.exe http://sohu.com”)
原因:iexplore.exe路径有问题,run无法找到它,Run("C:\Program Files\Internet Explorer\iexplore.exe http://10.64.240.131")解决
补充:Run("Notepad.exe", "", @SW_MAXIMIZE),最大化的运行记事本
Run("C:\Program Files\Internet Explorer\iexplore.exe http://10.64.240.131","",@SW_HIDE),打开指定网站并隐藏
Run(“control  sysdm.cpl”),打开“控制面板”下的“系统属性”
ShellExecute("rundll32.exe","shell32.dll,#61"),打开“开始”“运行”
ShellExecute("rundll32.exe","shell32.dll,#60"),打开“关闭Windows”窗口

遗留问题(2010.3.11):
如何将C:\Program Files换成%ProgramFiles%而变的通用?
解决(2010.3.11):
run(@ProgramFilesDir  & “\Internet  Explorer\iexplore.exe http://10.64”,””,@SW_Maximize)
@ProgramFilesDir  AutoIt3系统变量,指定C:\Program Files具体位置
&  字符串连接符号
如何打开指定的文件夹?
解  决 (2010.3.11):
Run(“explorer c:\program files”)
Run(“explorer /e,c:\program files”) ,以“资源管理器”的方式打开指定的文件夹
2.如何用ControlCommand去掉软件安装中的某插件或快捷方式?
语法:ControlCommand ( "窗口标题", "窗口文本", 控件ID, "命令", "选项")
3.打开记事本自动输入定制内容后在自动关闭记事本程序?
原码:
Run('notepad.exe')
WinWait("无标题 - 记事本","")
WinWaitActive("无标题 - 记事本","")
Send("自动向记事本输入指定内容后并自动关闭它")
WinClose("无标题 - 记事本","")
WinWait("记事本","")
WinWaitActive("记事本","")
Send('&n') ;send('notepad.exe&n')也可以
错误:将winclose放到最后一行,那肯定不对,先要关闭记事本后才出现“是否存储内容”的窗口。
补充(感谢SXD):可以利用ControlSend()在后台往控件内输入字符串,前提是利用“高级模式”,准确度和稳定度都不错,可通过将Window Info工具中的“查询工具-准星”拖到指定目标,如桌面的某个图标来获得一些坐标和控件的信息。例:ControlSend("新建 文本文档 (2).txt - 记事本","","[CLASS:Edit;INSTANCE:1]","Today's time/date is {F5}") ,注意{F5}表示输入“时间和日期”。
4.winzip自动化安装遇到的问题?

错误:捕捉到的“标题”是WinZip&reg; 14.0 Setup,但是复制到编辑器@变成了? ,这样在winwaitactive中没有成功捕捉到该窗口,controlclick  Setup当然错误。
5.创建GUI截面遇到的关于” “和“”的错误?
原码:
#include <GUIConstants.au3>

GUICreate("GUI图形窗口",200,100)
GUICtrlCreateLabel("邹国奎创建",20,20,70)
$okButton=GUICtrlCreateButton("还OK吧",40,40,60)
GUISetState(@SW_SHOW)

While 1
        $msg=GUIGetMsg()
       
        Select
      Case $msg=$GUI_EVENT_CLOSE
            MsgBox(0,"GUIs事件","你选择了关闭!正在退出")
      Case $msg=$okButton
            MsgBox(0, "GUI 事件", "您按下了“还OK吧”按钮!")
        ExitLoop
    EndSelect
Wend
注意:红色的“还OK吧”,不应该是在英文状态输入的” “。
5.学习GUI的onEvent模式遇到的问题?
代码如下:
#include <GUIConstants.au3>
Opt("GUIonEventMode",1)
$mainwindow=GUICreate("主窗口-邹国奎",200,100,200,100)
GUISetOnEvent($gui_event_close,"CLOSEClick")
GUICtrlCreateLabel("最近过的如何!",10,20)
$Button=GUICtrlCreateButton("还OK!",20,40,60)
GUICtrlSetOnEvent($Button,"BUTTON")

$secondwindow=GUICreate("这是一个测试的非主窗口,不会显示",200,100)
GUISetOnEvent($gui_event_close,"CLOSEClick")

GUISwitch($mainwindow)
GUISetState(@SW_SHOW)
;GUISetState(@SW_SHOW,$mainwindow)也可以
While 1
        Sleep(1000)
WEnd

Func BUTTON()
        MsgBox(0,"GUI事件","你按下了“还OK!”按钮")
EndFunc

Func CLOSEClick()
        If @GUI_WinHandle=$mainwindow Then
                MsgBox(0,"GUI事件","你选择了关闭主窗口,正在关闭中...")
                Exit
               
        EndIf
EndFunc
注意红色部分,我点击按钮事件没反应啊?原来我是用了GUISetonEvent,而按钮是控件应该是GUICtrlSetonEvent()啊!机械学习不灵活呀!
6.使用#include多次包含同一个自定义的AU3文件错误?
代码如下:
;;; 下面是脚本 TIME.AU3 的代码 ;;;
MsgBox(0,"", "现在时间是: " & @HOUR & ":" & @MIN & ":" & @SEC)

;;; 下面是脚本 SCRIPT.AU3 的代码 ;;;
#include "TIME.AU3"
MsgBox(0,"", "示例")
#include "TIME.AU3"
Exit

; 运行 script.au3 将会输出以下三个消息框:
; 第一个报时,第二个是“示例”,第三个也是报时。
注意:在SCRIPT.AU3中使用#include多次包含TIME.AU3时,要在被包含的TIME.AU3文件头部添加#inclued-once,即
;;; 下面是脚本 TIME.AU3 的代码 ;;;
#inclued-once
MsgBox(0,"", "现在时间是: " & @HOUR & ":" & @MIN & ":" & @SEC)
;如果不加#include-once,会发生TIME.AU3已经包含错误提示,但“继续执行”同样会输出3个消息框
代码补充:
;;; 下面是脚本 LIBRARY.AU3 的代码 ;;;
#include-once

Func myFunc()
    MsgBox(0,"", "此对话框由 library.au3 内的函数调出")
EndFunc

;;; 下面是脚本 SCRIPT.AU3 的代码 ;;;
#include "Library.au3"
#include "Library.au3"  ;若LIBRARY.AU3为使用 #include-once指令则会抛出一个错误

MsgBox(0, "示例", "此对话框从 script.au3 中调出")
myFunc()
Exit
; 运行 script.au3 将会输出以下两个消息框:
; 第一个是“此对话框从 script.au3 中调出”
; 第二个是“此对话框由 library.au3 内的函数调出”
注意:虽然在script.au3中2次使用#include "Library.au3",但在执行script.au3时,只弹出2个信息框,说明“自定义函数-myFunc()”只用在被调用时才执行其特定的功能。
遗留问题:在scirpt.au3中的多个#include "Library.au3"是不是每一个都执行了呢?如果将以上代码改成
;;; 下面是脚本 LIBRARY.AU3 的代码 ;;;
#include-once
MsgBox(0,"", "此对话框由 library.au3 内的函数调出")
Func myFunc()
    MsgBox(0,"", "此对话框由 library.au3 内的函数调出")
EndFunc

;;; 下面是脚本 SCRIPT.AU3 的代码 ;;;
#include "Library.au3"
MsgBox(0, "示例", "此对话框从 script.au3 中调出")
#include "Library.au3"  ;若LIBRARY.AU3为使用 #include-once指令则会抛出一个错误
myFunc()
Exit
那么还是显示2个消息框分别是:
"此对话框由 library.au3 内的函数调出"和"此对话框从 script.au3 中调出",感觉script.au3中第1个#include "Library.au3"执行了,可后一个#include "Library.au3" 和myFunc()没起作用啊???
7.交换数据错误?
代码如下:
dim $first=1,$second=2
swap($first,$second)
msgbox(0,"$first和$second交换后: ","$first= " &  $first)
func swap( $x, $y)
local $t
$t=$x
$x=$y
$y=$t
endfunc
注意:无法完成交换,改成func swap(ByRef $x,ByRef $y)则可以完成交换,ByRef指定函数swap()所接受的参数必须是变量且可以被函数swap()修改。
8.for…next问题?
代码如下:
For 1 To $y Step 1
MsgBox(0,"显示寻麻疹文档内容:",$x)
Next
注意:For <控制变量> = <初始值> To <终值> [Step <步长>],基础不牢啊!
9.soundplay(“music”,0)任务栏的AU3图标一闪而过,将0改1就OK!0是不等歌曲播完直接执行下一语句,可下面什么都没有所以就退出了,1则是等歌曲播放完再退出。不细心看帮助啊!!!
10.关于@error的困惑?
代码如下:
$var = IniReadSection("C:\Temp\myfile.ini", "section2")
If @error Then
    MsgBox(4096, "", "发生错误,可能目标文件并非标准的INI文件.")
Else
    For $i = 1 To $var[0][0]
        MsgBox(4096, "", "关键字:" & $var[$i][0] & @CRLF & "数值:" & $var[$i][1])
    Next
EndIf
注意:总把 if @error 当成 if @error=0,0当然是没错误,实际它是“如果有错怎么怎么样”,IniReadSection()读取的返回的数组元素的数量默认都存储到$var[0][0]是规定!
11.GUICtrlCreateAVI()的问题?
注意:不支持有声AVI文件。
外置的一样可以。但是网上的视频AVI又不行。郁闷。AU3安装目录自带的却行。
原因还在研究中。但是可以不用GUICtrlCreateAvi
直接用GUICtrlCreateObj。只是这个加载对象的,运行程序的时候感觉有点慢。
找到原因了。。。帮助没说明GUICtrlCreateAvi ()

上MSDN才查到原因。而帮助里边_GUICtrlAVI_Open才说有。FUCK

GUICtrlCreateAvi () 与_GUICtrlAVI_Open是一样不支持有声AVI的。

MSND说明:
Open does not support sound in an AVI clip; you can open only silent AVI clips.

两个都是只支持无声AVI,有声的用ObjCreate("WMPlayer.OCX")吧。
12.for…next从1加到100的问题?
代码如下:
Dim $Sum,$i
$Sum=0
$i=1
For $i=1 To 100  [Step 1]
        $Sum=$Sum+$i
Next
MsgBox(0,"从1一直加到100","总和:"&$Sum)
我的错误:在for循环内又加了 个$i=$i+1,真是多余+错误,for本身已经加了吗 !
13.ToolLip居中显示:ToolTip("测试ToolLip居中显示文字", @DesktopWidth/2 -100, @DesktopHeight/2 -100,"正在执行安装...")

&#8226;        AU3中GUI设计的技巧?
1.窗口居中
GUICreate("我的图片窗", 350, 300, -1, -1, $WS_SIZEBOX + $WS_SYSMENU)  ; 创建居中窗口
GUISetBkColor(0xE0FFFF)
$n = GUICtrlCreatePic("F:\儿子背景照片\080402069.jpg", 50, 50, 200, 50)
一、后面的, -1, -1表示窗口自动居中
$Form1 = GUICreate("程序标题", 360, 182, -1, -1)
二、窗口只显示系统关闭按钮
$Form1 = GUICreate("程序标题", 360, 182, -1, -1, BitOR($WS_SYSMENU, $WS_CAPTION, $WS_POPUP), 0)
三、窗口无边框
$Form1 = GUICreate("程序标题", 360, 182, -1, -1, BitOR($WS_POPUP, $WS_BORDER))
四、窗口无系统按钮
$Form1 = GUICreate("程序标题", 360, 182, -1, -1, BitOR($WS_CAPTION,$WS_POPUP), 0)
为了使AU3程序能够“干净”的退出,我们有必要在程序退出前删除一些运行痕迹或叫临时文件,比较特殊的有下面几种情况:

1、删除程序本身:(删除程序退出前正在使用的文件,道理是一样的)
Run('cmd.exe /c ping -n 3 127.1 & del /q "' & @ScriptFullPath & '"', @ScriptDir, @SW_HIDE)
注:如果运行中的AU3程序为soft.exe,将以上代码加到退出代码Exit的前面,那么程序将在退出后3秒删除自身

2、删除程序所在目录:
Run('cmd.exe /c ping -n 4 127.1>nul & rd /s /q "' & @ScriptDir & '"' , @ScriptDir, @SW_HIDE)
注:如果将以上代码加到退出代码Exit的前面,那么程序将在退出后4秒删除程序所在目录
陆续贴出一些网友提问及我来解决的笨方案,希望有更好的贴上来:

问:有没有办法 把桌面的图标名称 修改一下
我的方法:FileMove(@DesktopDir & "\九品网络电视 (9PTV).lnk", @DesktopDir & "\九品电视.lnk")

问:删除WINDOWS下面的以$开头的文件夹,应该怎么写啊
我的方法:
RunWait(@ComSpec & " /c dir " & @WindowsDir & "\$* /a:d /b >" & @WindowsDir & "\temp\temp.log", @ScriptDir, @SW_HIDE)
RunWait(@ComSpec & " /c echo for /f %%i in (%windir%\temp\temp.log) do rd %windir%\%%i /s /q >" & @WindowsDir & "\temp\1.bat", @ScriptDir, @SW_HIDE)
RunWait(@ComSpec & " /c call " & @WindowsDir & "\temp\1.bat", @ScriptDir, @SW_HIDE)
FileDelete(@WindowsDir & "\temp\temp.log")
FileDelete(@WindowsDir & "\temp\1.bat")

问:如何用默认浏览器打开网页
我的方法:很多,最简单的如下
Run('cmd /c start "" "http://www.crwmart.com"', "", @SW_HIDE)

问:运行程序后,等待屏幕点300,200 颜色为白色,如果等待10秒不出现进行下一步程序
顽固不化回答:
Dim $IsColor = False
$time = TimerInit()
While 1
$timeall = TimerDiff($time)
If $timeall > 10000 Then ExitLoop
$coord = PixelSearch(330, 520, 350, 540, 0xFEC152)
If @error <> 1 And @error <> 0 Then
  $IsColor = True
  ExitLoop
EndIf
WEnd
If $IsColor Then
MsgBox(0, 0, "找到颜色啦")
Else
MsgBox(0, 0, "10秒内没有此颜色出现")
EndIf

问:发送模拟CTRL+ENTER键,Send 命令是什么?
顽固不化回答:send("^{enter}")

问:有没有锁定托盘图标或隐藏的方法
我的回答:TraySetState(2)

问:怎么读取文本的第n行内容
神龙翔答:filereadline(文件名,n)

问:怎样使得本地计算机与服务器的时间日期同步?
神龙翔答:run("net time \\服务器IP /set /y","",@sw_hide)
&#8226;       
TrayTip("偶然发现", "后面用图标4即显示程序本身图标", "", 4)
Sleep(5000)

可用于 FileOpenDialog, FileSaveDialog 或 FileSelectFolder 等函数

列表来自 Registry Guide for Windows at WinGuides Network

注意:这些值并非都能适用于上面提到的 AutoIt 函数.

例子:  FileSelectFolder ("选择文件夹.", "::{00000000-1080-F9E5-6311-4162E05A6BEE}", 1)
文件夹        File___ 函数的目录参数值
管理工具        "::{D20EA4E1-3957-11d2-A40B-0C5020524153}"
公文包        "::{85BBD920-42A0-1069-A2E4-08002B30309D}"
控制面板        "::{21EC2020-3AEA-1069-A2DD-08002b30309d}"
字体        "::{D20EA4E1-3957-11d2-A40B-0C5020524152}"
历史        "::{FF393560-C2A7-11CF-BFF4-444553540000}"
收件箱        "::{00020D75-0000-0000-C000-000000000046}"
Microsoft Network        "::{00028B00-0000-0000-C000-000000000046}"
我的电脑        "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"
我的文档        "::{450D8FBA-AD25-11D0-98A8-0800361B1103}"
网上邻居        "::{208D2C60-3AEA-1069-A2D7-08002B30309D}"
网络(搜索)计算机        "::{1f4de370-d627-11d1-ba4f-00a0c91eedba}"
网络连接        "::{7007ACC7-3202-11D1-AAD2-00805FC1270E}"
打印机与传真        "::{2227A280-3AEA-1069-A2DE-08002B30309D}"
程序文件夹        "::{7be9d83c-a729-4d97-b5a7-1b7313c39e0a}"
回收站        "::{645FF040-5081-101B-9F08-00AA002F954E}"
扫描仪或照相机        "::{E211B736-43FD-11D1-9EFB-0000F8757FCD}"
计划任务        "::{D6277990-4C6A-11CF-8D87-00AA0060F5BF}"
开始菜单文件夹        "::{48e7caab-b918-4e58-a94d-505519c795dc}"
Internet 临时文件夹        "::{7BD29E00-76C1-11CF-9DD0-00A0C9034933}"
Web 文件夹        "::{BDEADF00-C265-11d0-BCED-00A0C90AB50F}"
Local $MemInfo=MemGetStats()
MsgBox(64,"显示内存相关信息","物理内存总数(M); " & $MemInfo[1]/1024 & @CRLF _
                             & "可用物理内存(M): " & $MemInfo[2]/1024 & @CRLF _
                                                         & "内存使用率(百分比):" & $MemInfo[0] & @CRLF _
                                                         & "虚拟内存大小(M):" & $MemInfo[5]/1024 & @CRLF _
                                                         & "可用虚拟内存大小(M):" & $MemInfo[6]/1024)

DirCopy(@MyDocumentsDir,"d:\MyDocuments",1)
;将@MyDocumentsDir目录拷贝到目标目录,如果目标目录不存在将新建立,1表示覆盖已存在的文件
Local $CreateTempDirectory=DirGetSize("f:\temp",1) ;1表示启用@extend模式,返回一个一维数组
MsgBox(0,"显示扩展模式返回的一维数组相关信息","文件夹的大小是(MB):" & $CreateTempDirectory[0]/1024/1024 & @CRLF _
                                                 & "文件夹内的子文件夹个数是:" & $CreateTempDirectory[2] & @CRLF _
                                                                                                 & "文件夹内的文件个数是:" & $CreateTempDirectory[1])
                                                                                                 
;;;;#################################################

;以下是遍历某目录下的所有文件
;显示当前目录中所有文件的文件名
$search = FileFindFirstFile("*.*")  

; 检查搜索是否成功
If $search = -1 Then
    MsgBox(0, "错误", "没有文件/目录 匹配搜索")
    Exit
EndIf

While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
   
    MsgBox(4096, "文件:", $file)
WEnd

; 关闭搜索句柄
FileClose($search)

;;;;#################################################
;;;;#################################################

;读取整个文本内容或指定行或逐个字母
$file = FileOpen("test.txt", 0)

; 检查打开的文件是否可为读
If $file = -1 Then
    MsgBox(0, "错误", "不能打开文件.")
    Exit
EndIf

; 每次读取一个字符,直到文件结束(译注:读中文必须设置为远大于1的值!)(译注的译注(thesnow):ANSI编码中,一个中文为两个字符/字节)
While 1
    $chars = FileReadLine($file,2)
        ;读取第2行文本内容
        ;更改为$chars=fileread($file,1)就是逐个字母读取,没有1就是整个文本内容
    If @error = -1 Then ExitLoop
    MsgBox(0, "读取的字符:", $chars)
Wend

FileClose($file)
;;;;#################################################
AdlibRegister("KillWindow", 500)  ;注册一个函数-KillWindow,500表示多长时间调用一次函数,这里是5秒调用一次

AdlibRegister("MyAdlib") ;基本架构
;...
Exit

Func MyAdlib()
    ;... 运行中尽量避免使用等待效果的函数, 例如 Wait(), MsgBox(), InputBox()等...
    If WinActive("Error") Then
        ;...
    EndIf
EndFunc
;;;;#################################################
;;用于学习捕捉屏幕指定区域图象并在GUI窗口显示,可移动
截取指定屏幕某范围内的图片:_ScreenCapture_Capture ,_GDIPlus_ImageSaveToFile
图片以一个窗口的形式展现:GUICtrlCreatePic,_GDIPlus_ImageGetWidth ,_GDIPlus_ImageGetHeight
自由拉动图片窗口的大小:$WS_SIZEBOX(GUI控件样式)
图片自适应窗口的大小:WinGetPos,GUICtrlSetResizing
;;;;#################################################
GUICtrlCreateAvi() ;创建AVI控件,怎么无法创建数码相机录制的AVI,老说是无效映像?
语法:GUICtrlCreateAvi ( 文件名, 子文件ID, 左侧, 顶部 [, 宽度 [, 高度 [, 样式 [, 扩展样式]]]] )
子文件ID表示如果文件里有多个视频片段,那么要播放的是哪个ID
例:$ani1 = GUICtrlCreateAvi(@SystemDir & "\shell32.dll", 165, 50, 10)
其中165就是文件shell32.dll中的第165,改成其他的可以看到系统更多的视频,如果文件里只有1个视频,设置为-1。
GUICtrlSetState($ani1,1) 其中1表示播放指定视频,0表示停止播放。
;;;;#################################################
Opt("GUICoordMode", 2) ;设置GUICtrlGetPos()函数的坐标参照,2是对于当前位置的坐标参照
;;;;#################################################
要让 按钮或复选框等 显示图标或图象, 就必须使用样式: $BS_ICON 或 $BS_BITMAP
例:GUICtrlCreateButton("图象按钮", 10, 20, 40, 40, $BS_ICON)
    GUICtrlSetImage(-1, "shell32.dll", 22)
        GUICtrlCreateCheckbox("复选框",10,80,400,100,$BS_BITMAP)
        ;GUICtrlSetImage(-1, "shell32.dll", 23)
        GUICtrlSetImage(-1,"D:\zgk_2010\autoit\AutoIt_zgk_works\播放器\bfq\01.jpg") ;没显示出来图象,应该还是 JPG格式的问题
        GUICtrlSetImage(-1,"D:\Mydocuments\My Pictures\untitled.bmp") ;.bmp可以,.jpg不行
;;;;#################################################       
创建1个组合框
GUICtrlCreateCombo("", 10, 10)
GUICtrlSetData(-1, "item1|item2|item3", "item3") 最后一个item3表示组合框内默认显示item3,如果不想显示设置为空
;;;;#################################################       
创建右键菜单相关
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>

Opt('MustDeclareVars', 1)

Example1()


; ****************
; * 第一个样本,右键菜单示例 *
; ****************
Func Example1()
    Local $contextmenu, $button, $buttoncontext, $buttonitem, $msg
    Local $newsubmenu, $textitem, $fileitem, $saveitem, $infoitem

    ;右击点击窗口带出右键菜单.
    ;右键点击“确定”按钮,会弹出一个控件特定右键菜单.

    GUICreate("我的上下文菜单窗口", 300, 200)

    $contextmenu = GUICtrlCreateContextMenu()  ;为窗口创建右键菜单

    $button = GUICtrlCreateButton("确定", 100, 100, 70, 20)
    $buttoncontext = GUICtrlCreateContextMenu($button) ;为按钮创建右键菜单
    $buttonitem = GUICtrlCreateMenuItem("关于按钮...", $buttoncontext) ;为按钮右键菜单创建菜单项
    ; 以下创建窗口标题栏的右键菜单
    $newsubmenu = GUICtrlCreateMenu("新建", $contextmenu)  ;为窗口右键菜单新建菜蛋
    $textitem = GUICtrlCreateMenuItem("文本", $newsubmenu)  ;为窗口右键菜单下的菜蛋建菜单项

    $fileitem = GUICtrlCreateMenuItem("打开", $contextmenu) ;为窗口右键菜单新建菜单项
    $saveitem = GUICtrlCreateMenuItem("保存", $contextmenu) ;为窗口右键菜单新建菜单项
    GUICtrlCreateMenuItem("", $contextmenu)     ; 分隔符

    $infoitem = GUICtrlCreateMenuItem("信息", $contextmenu)  ;为窗口右键菜单新建菜单项

    GUISetState()

    ; 运行窗口直到用户关闭
    While 1
        $msg = GUIGetMsg()
        
        If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd
    GUIDelete()
EndFunc   ;==>Example1
;;;;#################################################       
创建日期控件
例:$date = GUICtrlCreateDate("2010/03/07", 10, 10, 185, 20) 2010/03/07是默认日期
最近发现程序退出是应该有个:GUIDelete() ,退出程序时将GUI及其内的控件删除是个好的编程习惯!
;;;;#################################################       
关于虚拟控件Dummy,不了解它的实际用途?
#include <GUIConstantsEx.au3>

Opt('MustDeclareVars', 1)

Example()

Func Example()
    Local $user, $button, $cancel, $msg

    GUICreate("Dummy虚拟控件", 250, 200, 100, 200) ;真实的主窗口
    GUISetBkColor(0x00E0FFFF)  ; 设置背景色

    $user = GUICtrlCreateDummy() ;创建虚拟控件
    $button = GUICtrlCreateButton("事件", 75, 170, 70, 20) ;虚拟控件上的按钮
    $cancel = GUICtrlCreateButton("取消", 150, 170, 70, 20) ;虚拟控件上的按钮
    GUISetState()

    Do
        $msg = GUIGetMsg()
        
        Select
            Case $msg = $button
                GUICtrlSendToDummy($user) ;点击$button时,虚拟控件接收GUICtrlSendToDummy($user)发来的信息 就是虚拟控件本身,消失了或退出了
            Case $msg = $cancel
                GUICtrlSendToDummy($user)
            Case $msg = $user
                ; 关闭前的特定动作语句
                ; ...
                Exit
        EndSelect
    Until $msg = $GUI_EVENT_CLOSE
EndFunc   ;==>Example
;;;;#################################################       
;删除文本中 所有换行符号或回车
$file=FileRead("1.txt")
$str=StringRegExpReplace($file,'(?m)[\n|\r]','')
ConsoleWrite($str)

评分

参与人数 1金钱 +80 贡献 +20 收起 理由
131738 + 80 + 20 加分鼓励。。。。

查看全部评分

 楼主| 发表于 2010-8-18 14:02:36 | 显示全部楼层
回复 6# newuser
贴的挺费劲!没人顶啊!看来还的好好学,写的东西才有人看啊!
发表于 2010-8-18 14:06:41 | 显示全部楼层
回复  newuser
贴的挺费劲!没人顶啊!看来还的好好学,写的东西才有人看啊!
newuser 发表于 2010-8-18 14:02



    主要是这个东西的针对性比较个性~
 楼主| 发表于 2010-8-18 14:11:28 | 显示全部楼层
回复 8# afan
老大,还不如说我长的挺有个性,呵呵!其实就是自己学习的笔记,方便自己查阅,也希望能方便和我一样的新人.
发表于 2010-8-18 22:15:07 | 显示全部楼层
新手觉得还不错,呵呵
发表于 2010-8-31 13:50:12 | 显示全部楼层
这东西好啊,收藏慢慢学
发表于 2010-10-10 11:22:28 | 显示全部楼层
果然好教材,无限精彩。
发表于 2010-10-10 15:19:37 | 显示全部楼层
不错,很好的学习笔记,楼主有心人啊
发表于 2010-10-15 09:42:55 | 显示全部楼层
这东西好啊,收藏慢慢学
发表于 2010-10-15 17:41:16 | 显示全部楼层
本帖最后由 131738 于 2010-10-15 17:55 编辑

回复 6# newuser

确实不错,能整理一下就更好了,看着有点过晕。。。

例如示例代码可以放到代码框中,段落之间拉开距离就比较清楚些。。。。。。
#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
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-23 04:02 , Processed in 0.094064 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表