目錄
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學習筆記
[b]回復 [url=http://www.autoitx.com/redirect.php?goto=findpost&pid=196303&ptid=17702]1#[/url] [i]newuser[/i] [/b]
Zougk 2010-6-9重新學習基礎知識
目錄
一.基礎部分
1.variables(變量)、constants(常量)、arrays(數組)、字符串變量與變量轉換
2.#include和fileinstall()
3.消息循環模式和事件模式
4.函數(跳過)
5.條件與循環語句
6.程序運行為功能(CrossDoor)
7.函數的參數傳遞
8.函數的嵌套與遞歸
9.正則表達式(必須要理解啊!!!)
10.注冊表操作
11.文件讀寫(包括對二進制文件內容的替換)
二.進階部分
1.GUI操作示例講解
2.AU3中的DLL應用
一.基礎部分
1
Variables
在AU3中,變量使用前是否必須聲明,沒有嚴格限制,但如果強制變量聲明,使用Opt("MustDeclareVars",1)。建議在用DEBUG代碼時,必須顯示聲明所有變量,以方便調試程序,其實我根本就不會DEBUG,呵呵!
變量前綴必須是$,名稱部分可由數字、字母和下划線 _ 組成,如$My_variable。
定義變量的關鍵字分別是Dim、Local、Global,注意它們所定義的變量范圍。
例:Global定義的變量與函數內Dim定義的變量重名時,Glbal定義的變量將被復寫
Global $FILE=@SCRIPTDIR & "\win7book.exe"
FUNCTION()
FUNC FUNCTION()
DIM $FILE=@ScriptDir & "\Exe2AutV3.exe"
EndFunc
RUN($FILE) ; 最終腳本執行的是Dim定義的變量
如果改成:
Global $FILE=@SCRIPTDIR & "\win7book.exe"
DIM $FILE=@ScriptDir & "\Exe2AutV3.exe"
RUN($FILE) ; 最終腳本執行的還是Dim定義的變量
將Global更改成Local,結果依舊。
加強理解:Global定義的變量是全局變量,在整個程序內都有效,如果在函數內有同名的變量且值被修改,那么Global定義的變量自然會發生變化。如果是局部變量,只是在自己負責的范圍內有影響,而不管外部是否有與其通明的變量。
數組
AU3中,數組是存儲一組相同類型或不同類型的數。通過下標來訪問數組中的元素。
例:$Day可以是0-6中任意1個
Dim $Week[7]=["星期一","星期二","星期三","星期四","星期五","星期六","星期日"] ;定義一個一維的7個元素的數組來存儲一周的每一天
Dim $Day=2;這個變量表示我們要查看哪個數組元素
If $Day > 6 Then $Day = 6
If $Day < 0 Then $Day = 0 ;以上2個if語句來判斷$Day變量的大小是否超出數組
MsgBox(0,"今天是?",$Week[$Day])
例:
Dim $Week[4][3]=[["周一","周二","周三"],["語文","數學","數學"],["英語","語文","體育"],["歷史","音樂","班會"]] ;定義一個二維數組
$Rows=UBound($Week,1) ;UBound ( 數組 [, 維度] ) 維度默認值為 1,表示第一維.此例表示 行數
$Cols=UBound($Week,2) ;此例表示 列數
$Dims=UBound($Week,0) ;若此參數為0,則返回數組的下標數(維數).
MsgBox(0,"當前"&$Dims&"維數組有",$Rows&" 行, "&$Cols&" 列")
例:二維數組的輸出不完善?
Dim $sMsg3
Dim $Week[4][3]=[["周一","周二","周三"],["語文","數學","數學"],["英語","語文","體育"],["歷史","音樂","班會"]]
ReDim $Week[5][3] ;上面是1天3節課,現在多加了1行,既每天增加了1節課
For $i=0 To 2
$Week[4][$i]="美術" ;因為行數是從0開始,新加的第5行下標自然就是[4],這里表示加的課都是美術
Next
For $x=0 To 2
For $y=0 To 4
MsgBox(0,"",$Week[$y][$x]&@CRLF)
Next
Next
例:修正上例-感謝3mile
Dim $Week[4][3]=[["周一","周二","周三"],["語文","數學","數學"],["英語","語文","體育"],["歷史","音樂","班會"]]
ReDim $Week[5][3] ;上面是1天3節課,現在多加了1行,既每天增加了1節課
Local $str
For $i=0 To 2
$Week[4][$i]="美術" ;因為行數是從0開始,新加的第5行下標自然就是[4],這里表示加的課都是美術
Next
For $i=0 To 4
For $n=0 To 2
$str&=$week[$i][$n]&@TAB
Next
$str&=@CRLF
Next
MsgBox(0,0,$str)
例:同樣是修正上例(行列互換就好多了)---感謝Kxing
Dim $Week[3][4]=[ _
["周一","語文","數學","數學"], _
["周二","英語","語文","體育"], _
["周三","歷史","音樂","班會"]]
For $i=0 To 2
MsgBox(0,$Week[$i][0],$Week[$i][1]&" - "&$Week[$i][2]&" - "&$Week[$i][3])
Next
字符串部分(向CroosDoor學習):
例:
Dim $Var1="'zougk"
Dim $Var2='"zougk'
MsgBox(0,"","first value is: "&$Var1&@CRLF&"second value is: "&$Var2)
Dim $Var3=$Var1&$Var2
MsgBox(0,"",$Var3)
StringLen(字符串) :該函數獲取的是“字符串的字符數而不是字節數”。
StringReplace(字符串,”被替換的字符”, ”用於替換的字符”,替換次數)
例:
Dim $var="love me for ever love"
MsgBox(0,"",StringReplace($var,"love","I love",1)) ;僅第一個love被替換成I love
StringSplit() :拆分字符串
例:
Dim $Var="中國人 韓國人 日本人,都是亞洲人"
$Split_Var=StringSplit($Var," ")
MsgBox(0,"","被拆分的字符串的數量是: "&$Split_Var[0]&";"&"它們依次是: "&$Split_Var[1]&" : "&$Split_Var[2]&" : "& _
$Split_Var[3])
;stringsplit()函數拆分成功后,將產生1個數組,第1個元素存儲被拆分的字符串的數量,第2個元素是第一個被拆分的字符串,依次類推
$Split_Var1=StringSplit($Var,";")
MsgBox(0,"","被拆分的字符串的數量是: "&$Split_Var1[0]&";"&"它們依次是: "&$Split_Var1[1])
;stringsplit()函數拆分失敗后,也將產生1個數組,第1個元素是1,第2個元素存儲的是整個字符串
例:獲取指定文件的相關屬性(加強理解)
$Attrib=FileGetAttrib("F:\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()。
Constants
常量就是值不能被更改的變量,也不能把已經存在的變量更改成常量。
常量通過Const定義,也可在Const前加Dim 、Local、 Global,例Const $Num=1 或
Dim Const $Num=1。
另外,常量也可以通過Enum關鍵字枚舉,如不指定枚舉的默認值通常是0,但如果用倍乘的話,默認值必須是1。
例:
Enum $const1=1,$const2,$const3
MsgBox(0,"",$const1 & ":" &$const2 & ":" & $const3) ;自加1,結果是1 2 3
Enum Step 2 $incr0,$incr2,$incr4
MsgBox(0,"",$incr0 & ":" &$incr2 & ":" & $incr4) ;自加指定步長,結果是0 2 4
Enum Step *2 $mult1,$mult2,$mult4
MsgBox(0,"",$mult1 & ":" &$mult2 & ":" & $mult4) ;1 2 4
Arrays
數組就是數的矩陣,矩陣里的元素應該是同類型和大小的,但在變體矩陣中,類型可以多種多樣,但使用了變體數組尤其是在數組中套用了變體數組,那么在腳本執行過程中將是非常消耗資源和運行緩慢,依次不推薦使用變體數組。反正我是用不上它!
數組可以作為參數傳遞給函數,但必須使用ByRef。
2
#inclued 和 fileinstall()
它們很類似,都是將指定的文件在腳本編譯的時候包含到被編譯的腳本中。但使用fileinstall()預裝需要包含的文件在編譯后會導致腳本的體積過大。
#include可以將預先寫好的函數或現有常量包含到腳本中,例#include <array.au3>或 #include <buttonconstants.au3>。
fileinstall的語法:fileinstall(“sourcefilepath”,”destinationpath”[,flag]) ,其中flag可是0或1,0表示如果目的路徑下有相同文件不覆蓋,反之覆蓋。
3
消息循環模式
對於GUI操作必須使用庫文件 #include <GUIConstantsEx.au3>
GUI響應事件有2種模式:消息循環(MessageLoop)和事件模式(OnEvent),默認是MessageLoop,可通過Opt(“GuiOnEventMode”,1)更改為OnEventMode。
MessageLoop模式 :當以GUI操作為第一要務時或GUI作為主焦點(main focus),建議用該模式,該模式下是通過GUIGetMsg()函數不斷返回消息事件來響應,該函數返回的事件類型是“無事件、控件事件(如用GUICtrlCreateButton創建的控件響應的事件)、系統事件(如$GUI_EVENT_CLOSE、$GUI_EVENT_MINIMIZE等)。
GUIGetMsg()函數還可以在多窗口中操作,因為無論多少窗口它的ID是唯一的,此時可以使用GUIGetMsg(1),這里的1不僅代表被截獲的各個事件(它們都存儲於$array[0]中),還包括各個窗口的ID(他們都存儲於$array[1]中)。
MessageLoop基本語法框架:
While 1
$nMsg=GUIGetMsg()
…具體代碼
Wend
例:創建2個窗口,用GUIGetMsg(1)來操作
#include <GUIConstantsEx.au3>
;創建第1個窗口
$FirstWindow=GUICreate("第1個窗口",200,200,-1,-1)
GUICtrlCreateLabel("第一個窗口的LABEL: ",10,10,150,20)
$Button1=GUICtrlCreateButton("確定",10,30,50,20)
;創建第2個窗口
$SecondWindow=GUICreate("第2個窗口",200,200,-1,-1)
GUISwitch($FirstWindow) ;切換哪個窗口使用 GUI函數,本例將$FirstWindow設置為當前窗口進行各種操作GUISetState(@SW_SHOW) ;可以用GUISetState(@SW_SHOW,$FirstWindow)代替GUISwitch($FirstWindow)
While 1
Local $nMsgs=GUIGetMsg(1)
Select
Case $nMsgs[0]=$Button1
MsgBox(0,"選擇的是第1個窗口的按鈕","你按了“確定”按鈕")
Case $nMsgs[0]=$gui_event_close And $nMsgs[1]=$FirstWindow
MsgBox(0,"第1窗口操作","你選擇了關閉窗口操作,正在關閉")
ExitLoop
EndSelect
Wend
OnEvent模式:只有在事件被觸發時才調用相關函數執行,執行后在返回主程序。返回的事件包括控件事件和系統事件,這2類事件發生時均調用用戶自定義的函數,系統事件調用的函數是GUISetOnEvent(),控件事件調用的是GUICtrlSetOnEvent()。
OnEvent模式基本語法框架:
While 1
Sleep(1000)
Wend
Func Ownfunc()
具體代碼
Endfunc
Func Ownfunc()
具體代碼
Endfunc
例:
#include <GUIConstantsEx.au3>
;Opt("GUIONEVENTMODE",1)
Opt("GUIOnEventMode", 1) ; 切換為 OnEvent 模式
$FirstWindow=GUICreate("普通事件模式窗口調試",200,200,-1,-1)
GUISetOnEvent($GUI_EVENT_CLOSE,"CloseWindow")
GUICtrlCreateLabel("你好,OnEvent Mode: ",10,10)
$Button=GUICtrlCreateButton("OK!",20,30)
GUICtrlSetOnEvent($Button,"ClickOk") ;為指定控件的點擊行為定義函數ClickOk
$DummyWindow=GUICreate("虛擬窗口,不會被顯示",200,200,-1,-1)
GUISetOnEvent($GUI_EVENT_CLOSE,"CloseWindow")
GUISetState(@SW_SHOW,$FirstWindow)
While 1
Sleep(1000) ; 不做任何事
Wend
Func ClickOk()
MsgBox(0,"OK!按鈕","你點擊了OK!按鈕")
EndFunc
Func CloseWindow()
;注意: 此時 @GUI_CTRLID 的值將等於 $GUI_EVENT_CLOSE,
;而 @GUI_WINHANDLE 則等於 $FirstWindow
If @GUI_WinHandle=$FirstWindow Then
MsgBox(0, "窗口事件", "您選擇了關閉!正在退出...")
Exit
EndIf
EndFunc
4.函數(先跳過)
5.條件與循環語句
它們都可以多層嵌套。
利用條件和循環語句可以簡化代碼並完成復雜的任務。
條件語句
if…then…else
例1:
Global $Num=2
If @OSVersion="WIN_XP" Then
If @UserName="Administrator" Then
If $Num=2 Then
MsgBox(0,"$Num值的判斷消息","$Num的值是:" & $Num)
Else
MsgBox(0,"$Num值的判斷消息","$Num的值不是2")
Exit
EndIf
Else
MsgBox(0,"","不是以Administrator用戶身份登陸")
EndIf
Else
MsgBox(0,"","該系統不是WIN_XP系統")
EndIf
例2:
If @OSVersion="WIN_VISTA" Then
MsgBox(0,"","你的系統是WIN_VISTA")
ElseIf @OSVersion="WIN_2003" Then
MsgBox(0,"","你的系統是WIN_2003")
ElseIf @OSVersion="WIN_XP" Then
MsgBox(0,"","你的系統是WIN_XP")
ElseIf @OSVersion="WIN_2000" Then
MsgBox(0,"","你的系統是WIN_2000")
Else
EndIf
select…case語句
該選擇語句同時能進行多個條件的判斷。
例1:
Select
Case @OSVersion="WIN_VISTA"
MsgBox(0,"","你的系統是WIN_VISTA")
Case @OSVersion="WIN_2003"
MsgBox(0,"","你的系統是WIN_2003")
Case @OSVersion="WIN_XP"
MsgBox(0,"","你的系統是WIN_XP")
Case @OSVersion="WIN_2000"
MsgBox(0,"","你的系統是WIN_2000")
Case Else
EndSelect
switch…case選擇語句
該選擇語句1次只能進行一個條件的判斷。
例:
Switch @OSVersion
Case "WIN_VISTA"
MsgBox(0,"","你的系統是WIN_VISTA")
Case "WIN_2003"
MsgBox(0,"","你的系統是WIN_2003")
Case @OSVersion="WIN_XP"
MsgBox(0,"","你的系統是WIN_XP")
Case @OSVersion="WIN_2000"
MsgBox(0,"","你的系統是WIN_2000")
Case Else
EndSwitch
循環語句(5種)
A.For…Next
語法結構:for <variable>=startvalue to <stop> [step]
statement
next
例:
For $x=10 To 1 Step -1 ;步長默認值為1
SplashTextOn("標題",$x,100,50) ;splashtexton()用於創建一個自定義的文本閃平窗口
Sleep(1000) ;延遲1秒
Next
;SplashOff() ;當然是關閉閃屏窗口
MsgBox(0,"閃屏10秒后...","大家好,我是鄒國奎,很高興通過AU3讓我們在這里結識!希望我們能成為朋友")
B.For <variable> In <expression>
statements
…
next
該循環常用於“數據的陣列-an array of date”或“COM對象”,如果表達市不是以上兩種類型,腳本結束並有錯誤提示,如果COM對象是一個沒有任何元素的空對象集合,腳本會跳出循環執行下面語句。
了解COM Object,首先要了解COM的Object名稱及它的properties(屬性)和methods(方法)。
例:
Global $Array[5]
$Array[0]="我"
$Array[1]="叫"
$Array[2]="鄒"
$Array[3]="國"
$Array[4]="奎"
For $Element In $Array
For $x=3 To 1 Step -1
SplashTextOn("",$x,100,50)
Sleep(1000)
Next
SplashOff()
MsgBox(0,"$Array every element is: ",$Element)
WinActivate("$Array every element is: ")
;ControlClick("$Array every element is: ",$Element,"Button1")
SendKeepActive("$Array every element is: ")
Send("{Enter}")
Next
C.Do
statements
… Until <expression>
該循環語句至少先執行1次循環體內的代碼,再判斷條件是否滿足來決定是否繼續執行循環體代碼。
例:
Dim $Variable=10
Do
SplashTextOn("標題",$Variable,100,50) ;splashtexton()用於創建一個自定義的文本閃平窗口
$Variable -=1
Sleep(1000) ;延遲1秒
Until $Variable=0
SplashOff()
MsgBox(0,"閃屏10秒后...","大家好,我是鄒國奎,很高興通過AU3讓我們在這里結識!希望我們能成為朋友")
D.While <expression>
statements
…
Wend
該循環語句先判斷條件再決定是否執行循環體內的代碼,可以一次循環體代碼都不執行。
例:
Dim $Variable=10
While $Variable>0
SplashTextOn("標題",$Variable,100,50) ;splashtexton()用於創建一個自定義的文本閃平窗口
$Variable -=1
Sleep(1000) ;延遲1秒
WEnd
SplashOff()
MsgBox(0,"閃屏10秒后...","大家好,我是鄒國奎,很高興通過AU3讓我們在這里結識!希望我們能成為朋友")
F.With <expression>
注意expression表達式必須是Object類型
…
EndWith
該語句常被用來簡化腳本代碼
例:
#cs
下列代碼沒有使用With...EndWith語句
#ce
$Object=ObjCreate("InternetExplorer.Application.1")
$Object.visible=1
$Object.height=768
$Object.width=1024
$Object.navigate("http://www.baidu.com")
用With…EndWith簡化后
$Object=ObjCreate("InternetExplorer.Application.1")
With $Object
.visible=1
.height=768
.width=1024
.navigate("http://www.baidu.com")
EndWith
6.程序運行為功能(CrossDoor)
即程序運行於其它帳戶下。不是很理解,是以某個用戶身份編寫的AU3程序在其他用戶身份不管是本地還是遠程計算機上都可以執行的意思嗎?
7.函數的參數傳遞
函數的參數傳遞有“值傳遞”和“址傳遞”2種。值就是數值傳遞,如下列形式:
Function(2,4)
fucn Function($X,$Y) … EndFunc
址傳遞
Dim $x
Function(2,4,$x)
func Function($x,$y,ByRef $x) … EndFunc
還是來個例子:
Dim $x
MsgBox(0,"","zhouchang is: " & fucntion(2,4,$x))
Func fucntion($y,$z,ByRef $x)
$x=($y+$z)*2
Return $x
EndFunc
8.函數的嵌套與遞歸
嵌套就是在某個函數中調用其它的函數;遞歸就是函數自己調用函數,借用CroosDoor 的例子:
MsgBox(0,"遞歸階乘",_Dg(5))
Func _Dg($n)
If $n=1 Then
Return 1
Else
Return $n * _Dg($n-1)
EndIf
EndFunc
第一步:$n=5 返回 5* _Dg(4)
第2步:$n=4 返回4* _Dg(3)
第3步:$n=3 返回 3* _Dg(4)
第4步:$n=2 返回4* _Dg(1)
第5步:$n=1 返回1
結果就是:5*4*3*2*1
9.正則表達式(必須要理解啊!!!)
正則表達式的目的:判斷字符串是否符合某個語法規則和截獲符合規則的字符串及對符合規則的字符串進行替換。
常用函數:StrintgRgeExp()和StringRegExpReplace()。
10.注冊表操作
注意注冊表中“鍵名”“值項”的理解
例:讀取指定鍵名下具體值項的值
$var=RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion","ProgramFilesDir")
;綠色部分是鍵名,蘭色部分是值項
MsgBox(4096,"Program files are in:", $var)
例:學習RegEnumVal()---枚舉指定鍵名Run下的所有值項
For $i=1 To 100
Dim $var=RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",$i)
;RegEnumVal("鍵名",序數) 序數默認值為1
If @error <> 0 Then ExitLoop ;玫舉指定“鍵名下的值項失敗就退出循環”
MsgBox(0,"第"&$i&"個"&"開機啟動項是",$var)
Next
例:學習RegEnumKey---枚舉指定鍵名下的所有子鍵
For $i=1 To 100
$var=RegEnumKey("HKEY_LOCAL_MACHINE\SOFTWARE",$i)
$var1=RegEnumKey("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services",$i)
If @error <> 0 Then ExitLoop
MsgBox(4096,"計算機上已經安裝第"&$i&"個程序是:",$var)
MsgBox(4096,"計算機上已經安裝第"&$i&"個服務是:",$var1)
Next
寫、讀、刪注冊表
例:普通文件的讀寫常規操作
RegWrite("HKEY_CURRENT_USER\Software\Testzgk","testzgk1","REG_MULTI_SZ","My name is zgk!"&@LF&"Welcome to you!")
MsgBox(0,"新建新鍵名Testzgk,它包含的值項是testzgk1,類型是REG_SZ",RegRead("HKEY_CURRENT_USER\Software\Testzgk","testzgk1"))
RegDelete("HKEY_CURRENT_USER\Software\Testzgk")
11.文件讀寫(包括對二進制文件內容的替換)
當對少量文件進行讀寫操作時,可以使用文件名,當對大量文件進行讀寫操作時,用文件句柄,文件句柄通過fileopen()函數獲得,別忘了完成對文件的操作后用fileclose()關閉他,否則會嚴重影響腳本執行效率。
filewrite()和filewriteline()對不存在的文件操作時可以新建該文件,但如果文件路徑錯誤的話,就不會建立新的文件。
例:FileWriteLine(@DesktopDir&"\testzgk.txt","第一行") ;按行寫入並自動換行
FileWrite(@DesktopDir&"\testzgk.txt","test") ;按行寫入
FileWrite(@DesktopDir&"\testzgk.txt","test1") ;接着按行寫入
$var1=FileRead(@DesktopDir&"\testzgk.txt",4) ;讀取testzgk.txt的前4個字節內容,默認讀取整個文本內容
$var3=FileRead(@DesktopDir&"\testzgk.txt")
$var2=FileReadLine(@DesktopDir&"\testzgk.txt",2)
MsgBox(0,"前4個字節:",""&$var1&@LF&"第2行:"&$var2&@LF&"整個文本內容是:"&@LF&$var3)
注意fileopen(文件名,模式)的選擇,有只讀模式和寫入到文件末尾模式及刪除原文見內容再寫模式等。
例:沒有寫和讀模式並存的可能性嗎?
$file=FileOpen(@DesktopDir&"\testzgk.txt",2+8)
;注意第2個參數,2表示先清除原文件內容在進行寫操作,8表示打開的文件不存在將強行建立
;0是只讀模式,1是接着原文件內容進行寫操作
;檢查打開的文件是否 可讀
If $file = -1 Then
MsgBox(0,"錯誤","不能打開文件")
Exit
EndIf
FileWriteLine($file,"行") ;寫入一個字符串並以換行符結尾,也就是按行寫
FileWrite($file,"t")
MsgBox(0,"全部數據",FileRead($file)) ;句並是寫模式,所以讀取數據會失敗
FileClose($file)
例:對某文件的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)中讀取所有字段的信息.
[b]回復 [url=http://www.autoitx.com/redirect.php?goto=findpost&pid=196304&ptid=17702]2#[/url] [i]newuser[/i] [/b]
二.進階部分
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)
[b]回復 [url=http://www.autoitx.com/redirect.php?goto=findpost&pid=196306&ptid=17702]3#[/url] [i]newuser[/i] [/b]
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 [url]http://sohu.com[/url]”)
原因:iexplore.exe路徑有問題,run無法找到它,Run("C:\Program Files\Internet Explorer\iexplore.exe [url]http://10.64.240.131[/url]")解決
補充:Run("Notepad.exe", "", @SW_MAXIMIZE),最大化的運行記事本
Run("C:\Program Files\Internet Explorer\iexplore.exe [url]http://10.64.240.131[/url]","",@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 [url]http://10.64[/url]”,””,@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® 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")吧。
[b]回復 [url=http://www.autoitx.com/redirect.php?goto=findpost&pid=196307&ptid=17702]4#[/url] [i]newuser[/i] [/b]
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
[b]回復 [url=http://www.autoitx.com/redirect.php?goto=findpost&pid=196309&ptid=17702]5#[/url] [i]newuser[/i] [/b]
AutoIt3學習所遇問題集
1.打開指定網頁?
錯誤:run(“iexplore.exe [url]http://sohu.com[/url]”)
原因:iexplore.exe路徑有問題,run無法找到它,Run("C:\Program Files\Internet Explorer\iexplore.exe [url]http://10.64.240.131[/url]")解決
補充:Run("Notepad.exe", "", @SW_MAXIMIZE),最大化的運行記事本
Run("C:\Program Files\Internet Explorer\iexplore.exe [url]http://10.64.240.131[/url]","",@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 [url]http://10.64[/url]”,””,@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® 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,"正在執行安裝...")
• 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)
•
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)
[b]回復 [url=http://www.autoitx.com/redirect.php?goto=findpost&pid=196310&ptid=17702]6#[/url] [i]newuser[/i] [/b]
貼的挺費勁!沒人頂啊!看來還的好好學,寫的東西才有人看啊!
[quote]回復 newuser
貼的挺費勁!沒人頂啊!看來還的好好學,寫的東西才有人看啊!
[size=2][color=#999999]newuser 發表於 2010-8-18 14:02[/color] [url=http://www.autoitx.com/redirect.php?goto=findpost&pid=196407&ptid=17702][img]http://www.autoitx.com/images/common/back.gif[/img][/url][/size][/quote]
主要是這個東西的針對性比較個性~
[b]回復 [url=http://www.autoitx.com/redirect.php?goto=findpost&pid=196411&ptid=17702]8#[/url] [i]afan[/i] [/b]
老大,還不如說我長的挺有個性,呵呵!其實就是自己學習的筆記,方便自己查閱,也希望能方便和我一樣的新人.
新手覺得還不錯,呵呵
這東西好啊,收藏慢慢學
果然好教材,無限精彩。
不錯,很好的學習筆記,樓主有心人啊
這東西好啊,收藏慢慢學
[i=s] 本帖最后由 131738 於 2010-10-15 17:55 編輯 [/i]
[b]回復 [url=http://www.autoitx.com/redirect.php?goto=findpost&pid=196310&ptid=17702]6#[/url] [i]newuser[/i] [/b]
確實不錯,能整理一下就更好了,看着有點過暈。。。
例如示例代碼可以放到代碼框中,段落之間拉開距離就比較清楚些。。。。。。[code]#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[/code]
