AutoIt3常見問題解答


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,其他的都是轉貼。轉貼請注明出處,多謝合作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM