找回密码
 加入
搜索
查看: 7376|回复: 7

[原创] AU3的帮助学习笔记?

  [复制链接]
发表于 2010-5-19 10:52:44 | 显示全部楼层 |阅读模式
自己的学习笔记,尽管拖拖拉拉,但总要自我激励一下.
《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.
数组:使用前必须用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
发表于 2010-5-19 11:19:36 | 显示全部楼层
过来支持一下子,真不错
发表于 2010-6-3 20:07:23 | 显示全部楼层
一个高手正在成长
发表于 2010-6-7 10:43:26 | 显示全部楼层
关注~~~~~~~
发表于 2010-6-8 21:56:13 | 显示全部楼层
好东东,一定要支持,收藏备用
发表于 2010-6-10 06:19:07 | 显示全部楼层
好东东,一定要支持,收藏备用
发表于 2010-6-15 18:35:37 | 显示全部楼层
加油学习哦,希望你不要间断哈!
发表于 2018-11-13 14:45:08 | 显示全部楼层
谢谢分享,复制收藏
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-22 22:47 , Processed in 0.088668 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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