Q1 如何調試腳本?
MsgBox(0,"測試",$var)
ConsoleWrite("var=" & $var & @CRLF)
Q2 操作CMD相關命令
Q2.1 如何運行DOS命令?
Run(@ComSpec & ' /c dir>d:\dir.txt',"", @SW_HIDE)
#include <Process.au3>
$rc = _RunDos("start Http://www.autoit.net.cn")
Q2.2 運行DOS命令如何連接AU3變量?
Local $var="d:\dir.txt"
Run(@ComSpec & ' /c dir>"'&$var&'"',"", @SW_HIDE)
Q2.3 運行DOS命令如何自動應答?(注意:這並不屬於AU3的問題,這里附帶說一下。)
RunWait(@ComSpec & ' /c echo y|cacls %systemroot%\system32\wpcap.dll /d everyone', @SystemDir, @SW_HIDE)
Q2.4 多層DOS命令如何用?如netsh,diskpart等。
$dns="192.168.0.1"
RunWait(@ComSpec & ' /C netsh -c interface ip set dns 本地連接 source=static addr="' & $dns &'" register=PRIMARY ',"", @SW_HIDE )
Q2.5 運行DOS命令如何直接截取回顯?
;注意:回顯截取只支持Run而不是RunWait
#include <Constants.au3>
Opt("MustDeclareVars",1)
_test()
Func _test()
Local $foo,$line,$lines
$foo = Run(@ComSpec & " /c sc query Alerter", @SystemDir, @SW_HIDE, $STDOUT_CHILD)
$lines = ""
While 1
$line = StdoutRead($foo)
If @error Then ExitLoop
$lines &= $line
Wend
MsgBox(0,"test",$lines)
EndFunc
Q3 如何防止程序重復運行?
見幫助手冊的"_Singleton"函數
Q4 如何直接運行系統程序關聯的文件?如[.txt, .msi, .pdf, .jpg, .lnk, .msc]等等
ShellExecute("Notepad.exe")
ShellExecute("test.txt", "", @ScriptDir, "edit")
ShellExecute("http://www.autoit.net.cn")
ShellExecute("C:\boot.ini", "", "", "print")
ShellExecute("test.lnk","",@ScriptDir)
ShellExecute("gpedit.msc", "", "", "open", @SW_MAXIMIZE)
Q5 如何控制系統服務?
API的控制服務
_StartService() 開始服務
_StopService() 停止服務
_ServiceExists() 檢測服務
_ServiceRunning() 運行服務
_CreateService() 建立服務
_DeleteService() 刪除服務
WMI的控制服務
_ServStart() 開始服務
_ServStop() 停止服務
_ServDelete() 刪除服務
_ServGetDetails() 服務詳情
_ServGetState() 服務狀態
_ServListInstalled() 服務列表
_ServPause() 暫停服務
_ServResume() 服務改名
_SerSetState() 設置服務狀態
http://www.autoit.net.cn/viewthr ... &extra=page%3D1
Q6 如何操作注冊表?
Q6.1 常用的注冊表設置
;讀取注冊表指定的值
$var = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion", "ProgramFilesDir")
MsgBox(4096, "Program files 文件夾位於:", $var)
;創建一個主鍵、子鍵或值項。
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Test", "TestKey", "REG_SZ", "Hello this is a test")
;刪除注冊表指定的值 (注意:這里刪除的是鍵項,而不是鍵值。)
RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE", "TestKey")
;其他還有RegEnumKey(),RegEnumVal(),詳細應用請參考幫助。
Q6.2 注冊表權限設置
http://www.autoit.net.cn/viewthr ... hlight=%C8%A8%CF%DE
Q7 如何不重啟刷新注冊表馬上生效?
Do
ProcessClose("explorer.exe")
Until Not ProcessExists("explorer.exe")
Run("gpupdate /force","",@SW_HIDE)
;強烈推存應用這個
DllCall("user32.dll","int","SendMessageTimeout","hwnd",65535,"int",26,"int",0,"int",0,"int",0,"int",1000,"str","dwResult")
Q8 AU3編寫的程序如何帶參數運行?
If $cmdline[0] <> 0 Then
$filename = $cmdline[1]
MsgBox(4096, "測試", '你輸入的命令行參數是 "' & $filename & '"')
Else
MsgBox(64, "測試", '請帶參數運行此程序')
EndIf
If StringInStr($CmdLineRaw, "/help") Then
MsgBox(64,"幫助","這是本程序的幫助說明")
EndIf
Q9 如何刪除腳本程序自身?
;刪除腳本程序自身(如果編譯成了EXE同樣有效,會把自己刪掉)
Run(@ComSpec&' /c ping 127.0.0.1 -n 3&del /q "'&@ScriptFullPath&'"',@ScriptDir,@SW_HIDE)
;刪除腳本所在目錄的一切東西(這個可以作為卸載的一部分,如果沒有寫注冊表的綠色軟件,則直接可以作為卸載命令)
Run(@ComSpec&' /c ping 127.0.0.1 -n 3&rd /q/s "'&@ScriptDir&'"',@ScriptDir,@SW_HIDE)
Q10 AU3如何實現加密字符串和文件校驗?
;RC4加密(AU3內置函數)
#include <String.au3>
Opt("MustDeclareVars", 1)
Local $var
;加密字符串
$var=_StringEncrypt(1,"sanhen",@ComputerName,1)
MsgBox(0,"test",$var)
;解密字符串
$var=_StringEncrypt(0,$var,@ComputerName,1)
MsgBox(0,"test",$var)
;MD5字符串加密
http://www.autoit.net.cn/viewthread.php?tid=378&highlight=MD5
;MD5文件效驗
http://www.autoit.net.cn/viewthr ... &extra=page%3D1
;哈唏算法
http://www.autoit.net.cn/viewthread.php?tid=372&highlight=MD5
Q11 如何修改屏幕分辨率/刷新頻率/顏色深度?
http://www.autoit.net.cn/viewthr ... angeDisplaySettings
Q12 如何在界面顯示GIF圖片?
http://www.autoit.net.cn/viewthr ... ht=Shell.Explorer.2
Q12.1 AU3調用OBJ的一點點例子?
http://www.autoit.net.cn/viewthread.php?tid=365&highlight=obj
Q13 如何在界面上顯示SWF格式的文件?
參考Q12.1的例子
或者通過IE對象來實現,請參考:
http://www.autoit.net.cn/viewthr ... &extra=page%3D1
Q14 如何控制攝像頭?
http://www.autoit.net.cn/viewthr ... &extra=page%3D3
Q15 如何界面中調用皮膚?
http://www.autoit.net.cn/viewthr ... &extra=page%3D3
http://www.autoit.net.cn/viewthr ... &extra=page%3D2
Q16 我怎樣才能DEBUG我的腳本?
A1. 這個問題有無數個答案,不過最有效的還是從SciTE4AutoIt3開始,大多數人都使用這個軟件來編寫腳本。在debug方面SciTE有下面幾條優勢:
Syntax會即時高亮不符合語法的語句,這會讓用戶更容易發現腳本里的錯誤
內建在工具菜單里的Syntax可以一次檢測腳本里的全部錯誤
內置的代碼清理程序可以讓代碼變得更整齊、更具有可讀性,它同時也能修正錯誤拼寫的函數和變量
A2. 你也能通過添加下面的代碼來在任何一台電腦上debug你的腳本:
Func dbg($msg)
DllCall("kernel32.dll", "none", "OutputDebugString", "str", $msg)
EndFunc
然后,你可以在需要debug的地方加上下面的代碼:
dbg("The value of Variable 1 at this time is " & $var1
這個方法對用戶來說更加透明,同時也只對DebugView from SysInternals之類的程序可見。這個方法在那些沒有安裝SciTE的機器上更具有優勢。
Q17 我怎樣才能打開那些非exe格式的文件[.txt, .msi, .pdf, .jpg 之類]? [或] 我怎樣才能用默認的瀏覽器打開網頁?
A1. 這也就是為什么我們創建ShellExecute函數.下面有一個例子:
ShellExecute("C:\autoitscripts\test.au3", "", "", "edit", @SW_MAXIMIZE)
你也能像這樣打開一個網址:
ShellExecute("http://www.autoitscript.com/forum")
如果文件的右鍵菜單里有打印選項,你就可以這樣用AutoIt打印文件:
ShellExecute("C:\boot.ini", "", "", "print")
如果你希望暫停腳本直到程序結束,你可以使用ShellExecuteWait函數,它們的運行參數是相同的.
Q18. 我怎樣才能讓腳本作為系統服務啟動?
這也是一個有多個答案的問題
A1.如果你只想在自己的電腦上安裝服務,最簡單的方法是使用Pirmasoft RunAsSvc.這個程序可以方便地添加/刪除系統服務.
A2.如果你想讓服務能在任何電腦上都能安裝,你可以使用SRVANY.EXE和ServiceControl.au3,像這樣安裝服務:
#include "ServiceControl.au3"
$servicename = "MyServiceName"
_CreateService("", $servicename, "My AutoIt Script", "C:\Path_to_srvany.exe", "LocalSystem", "", 0x110)
RegWrite("HKLM\SYSTEM\CurrentControlSet\Services\" & $servicename & "\Parameters", "Application", "REG_SZ", @ScriptFullPath)
或者使用下面的代碼刪除服務: #include "ServiceControl.au3"
$servicename = "MyServiceName"
_DeleteService("", $servicename)
Q19 我怎樣在復制文件時顯示進度條?
A1.函數集ShellFileOperation.au3能完成這個操作:
Q20 我怎樣讓快捷鍵只在自己的GUI起作用?
A1. 在更好的方法出現之前,最簡單的方法是使用下面的代碼:
#include <GuiConstants.au3>
HotKeySet("{ENTER}", "catchguikey")
$gui = GuiCreate("Hotkey Test")
GuiCtrlCreateLabel("Press Enter", 0, 0)
GuiSetState()
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend
Func catchguikey()
Local $opt = Opt("WinTitleMatchMode", 4)
If WinGetHandle("active") = $gui Then
If @HotKeyPressed = "{ENTER}" Then
;Do something here
ToolTip("Key Pressed")
Sleep(1000)
ToolTip("")
EndIf
Else
HotKeySet(@HotKeyPressed)
Send(@HotKeyPressed)
HotKeySet(@HotKeyPressed, "catchguikey")
EndIf
Opt("WinTitleMatchMode", $opt)
EndFunc
Q21 我怎樣檢測鍵盤是否按下了指定的鍵?
A1. 你可以使用_IsPressed()函數來檢測按鍵. 你可以在幫助文件里找到這個函數:User Defined Functions -> Misc Management -> _IsPressed. 下面的例子會顯示如何在K鍵按下時單擊鼠標左鍵:
#Include <Misc.au3>
$pressed = 0
While 1
If _IsPressed("4B") Then
If Not $pressed Then
ToolTip("K Key being held down")
MouseDown("left")
$pressed = 1
EndIf
Else
If $pressed Then
ToolTip("")
MouseUp("left")
$pressed = 0
EndIf
EndIf
Sleep(250)
WEnd
Q22 我怎樣在遠程計算機上運行腳本?
A1. 這個問題的答案由你在局域網的經驗決定,如果目標系統是Windows 2000或Windows XP而且你擁有管理員權限,你就可以使用下面的兩個程序:
SysInternals的PsExec
BeyondLogic的BeyondExec
這兩個程序都允許在遠程計算機上運行任何程序,甚至可以把你的腳本復制到目標系統上.不過Windows XP Home Edition 上不能運行這個兩個程序.
Q23 我怎樣制作一個擁有可選參數的自定義函數?
A1. 你可以通過在聲明函數時給參數指定一個默認值來做到. 下面是一個例子:
Func testme($param1, $param2 = "nothing", $param3 = 5)
MsgBox(0, "", "Parameter one is required. The value of Parameter 1 is " & $param1 & @CRLF & "Parameter 2 is optional. The value of Parameter 2 is " & $param2 & @CRLF & "Parameter 3 is optional. The value of Parameter 3 is " & $param3)
EndFunc
如果調用testme()時只使用了一個參數[比如testme("test")]就會輸出:
Parameter one is required. The value of Parameter 1 is test
Parameter 2 is optional. The value of Parameter 2 is nothing
Parameter 3 is optional. The value of Parameter 3 is 5
不過,如果調用函數時使用了超過2個參數,比如testme("test", "something"), 就會輸出:
Parameter one is required. The value of Parameter 1 is test
Parameter 2 is optional. The value of Parameter 2 is something
Parameter 3 is optional. The value of Parameter 3 is 5
Q24 我怎樣讓系統啟動時自動運行腳本?
A1.你可以使用下面的語句來做到:
RegWrite("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "MyProgramName", "REG_SZ", @ScriptFullPath)
或者:
FileCreateShortcut(@ScriptFullPath, @StartupCommonDir & "\MyProgramName.lnk")
Q25 我怎樣讓腳本刪除自己?
A1. 下面的代碼可以刪除一個正在運行的腳本.
Func _SelfDelete($iDelay = 0)
Local $sCmdFile
FileDelete(@TempDir & "\scratch.bat")
$sCmdFile = 'ping -n ' & $iDelay & '127.0.0.1 > nul' & @CRLF _
& ':loop' & @CRLF _
& 'del "' & @ScriptFullPath & '"' & @CRLF _
& 'if exist "' & @ScriptFullPath & '" goto loop' & @CRLF _
& 'del ' & @TempDir & '\scratch.bat'
FileWrite(@TempDir & "\scratch.bat", $sCmdFile)
Run(@TempDir & "\scratch.bat", @TempDir, @SW_HIDE)
EndFunc
Q26 我怎樣在GUI里建立一個可點擊的超鏈接?
A1. ChangeResolution.au3可以完成這些設置.
Q27 我怎樣修改屏幕分辨率/刷新頻率/顏色深度?
A1. Gafrost在這方面做了很大努力,並提供了一個UDF來幫助完成這個功能.
Q28 在多顯示器情況下我怎樣得到屏幕分辨率?
A1. 下面的代碼可以得到屏幕的總分辨率:
Global Const $SM_VIRTUALWIDTH = 78
Global Const $SM_VIRTUALHEIGHT = 79
$VirtualDesktopWidth = DLLCall("user32.dll", "int", "GetSystemMetrics", "int", $SM_VIRTUALWIDTH)
$VirtualDesktopWidth = $VirtualDesktopWidth[0]
$VirtualDesktopHeight = DLLCall("user32.dll", "int", "GetSystemMetrics", "int", $SM_VIRTUALHEIGHT)
$VirtualDesktopHeight = $VirtualDesktopHeight[0]
Q29 我怎樣注冊一個文件類型[或者] 我怎樣才能讓我的程序變為一個文件類型的默認打開方式?
A1. 文件注冊對那些新手來說的確有些困難. 第一件要做的事就是要讓你的腳本能接受命令行調用. 下面是一段示例代碼:
;$cmdline[0] is the number of parameters passed
If $cmdline[0] <> 0 Then
$filename = $cmdline[1]
; Do something with the file here
MsgBox(0, "UXYFixer", 'The file name passed to the command line is "' & $filename & '"')
Else
; We did not get any command line parameters.
; If this is a command line only program, you would want to
; alert the user that the command line parameters were incorrect.
; If this is a GUI program (like a notepad program), you would
; want to simply continue from here without opening a file.
MsgBox(0, "UXYFixer", 'Command line parameters incorrect.' & @CRLF & 'Command line usage: "' & @ScriptName & '" "file to process"')
EndIf
然后你的腳本就能接受文件了, 你可以開始注冊一個文件類型. 為了避免錯誤,我對此專門制作了一個UDF—— FileRegister.au3
Q30 為什么點擊我的下拉框(GUICtrlCreateCombo)時不出現一個下拉列表?
A1. 在使用GUICtrlCreateCombo前你先要確認height參數是你想要的下拉列表的高度,Windows XP會自動選擇一個高度,但其他版本的Windows並不能這樣做。
$combo = GUICtrlCreateCombo("",10,10,200,20)
應修改為:
$combo = GUICtrlCreateCombo("",10,10,200,200)
Q31 為什么我的帖子沒有人回答?
A1. 你是否對你的問題做了得體的描述? 如果你的標題或者對問題的描述含糊不清, 其他人只會忽略掉你的問題而不是回答它. 那些標題像 "幫助我", "我有了麻煩", "問題", "幫我看看代碼的問題", "這段代碼不能工作" 的帖子並不會引起其他人的注意. 那些有經驗的用戶(他們通常能解決你的問題) 經常會跳過類似的帖子. 一個規范的標題應該像這樣:"使用WinWaitClose時出現的問題",或者 "陷入了死循環".
A2. 你是否貼出了你的代碼? 如果你不貼出你的問題代碼你就不可能得到幫助. 在發代碼之前先把不相關的代碼去掉.也許當然去掉不相關的代碼時你已經看到問題所在的地方..也許會發現.原來是一個那樣簡單的問題.
A3. 請讓你的文字變得易於閱讀,適當的標點很重要,同時也不要給文字加上顏色.另外最好不要使用繁體字,繁體字並不能讓你顯得更有文化,相反而會影響他人的閱讀.
另外很多人喜歡用些比較嚇人的標題,比如"比如高手進來看一下"."版主進來解決一下"."高難度的問題".問題常常因為我不是高手或者版主而沒有回答.或者發現"高難度"的問題原來是很菜滴.不是每個人都喜歡扮帥滴.....
還有,在提問建議多搜索一下。
Q32 為什么殺毒軟件報告我的腳本被感染?
A1. AutoIt並沒有在你的系統里安裝病毒,如果你的程序被報毒的話(前提是你自己不懷惡意) 那么這就是一次誤報. 殺毒軟件會在編譯過后的AutoIt腳本里發現一些標記,並以此認為你的腳本被感染病毒.之所以會出現這樣的情況有下面的兩點原因:
AutoIt使用UPX加殼. UPX是一種開源的程序壓縮軟件. 經常被一些病毒使用(讓它們變得更小).
一些懷惡意的寫腳本的人讓AutoIt腳本引擎被標識為了病毒.
補充AU3中文官網上的 《FAQ 大全》初學者必看
說明:
該說的"提問智慧"里邊已經說了,這里不重復了。不要拿"新手"作借口。。。
太多的重復提問貼提問,只會讓人看而生厭,並且有浪費時間的嫌疑,這里重復一句,學會搜索論壇。
提問區"已解決"版塊里的問題都是解決了的,建議新手多翻下,多看下。這里發些常見的問題解答。
聲明:此貼只發www.autoit.net.cn,其他的都是轉貼。轉貼請注明出處,多謝合作。