|
AutoIt v3 FAQ By一點(diǎn)筆記
作為論壇里的一個(gè)資深潛水員,我注意到許多被初學(xué)者反復(fù)詢問(wèn)
的問(wèn)題都很容易找到答案。這些問(wèn)題大多不會(huì)被及時(shí)回答,原因就是提問(wèn)者沒(méi)有事先在論壇搜索答案,因此相同的答案往往會(huì)在不同的帖子里出現(xiàn)很多次?;蛘哒f(shuō),
作出這些回答已經(jīng)令人厭煩、生氣,因?yàn)榇蠹抑耙呀?jīng)看到同樣的問(wèn)題被問(wèn)了無(wú)數(shù)遍。所以我在這里貼出許多被新手反復(fù)提及的問(wèn)題的答案,我會(huì)給所有的問(wèn)題編號(hào)
并列出一個(gè)方便查找的索引。
Q1. 我怎樣才能DEBUG我的腳本?
A1. 這個(gè)問(wèn)題有無(wú)數(shù)個(gè)答案,不過(guò)最有效的還是從SciTE4AutoIt3開(kāi)始,大多數(shù)人都使用這個(gè)軟件來(lái)編寫(xiě)腳本。在debug方面SciTE有下面幾條
優(yōu)勢(shì):
- Syntax會(huì)即時(shí)高亮不符合語(yǔ)法的語(yǔ)句,這會(huì)讓用戶更容易發(fā)現(xiàn)腳本里的錯(cuò)誤
- 內(nèi)建在工具菜單里的Syntax可以一次檢測(cè)腳本里的全部錯(cuò)誤
- 內(nèi)置的代碼清理程序可以讓代碼變得更整齊、更具有可讀性,它同時(shí)也能修
正錯(cuò)誤拼寫(xiě)的函數(shù)和變量
A2. 你也能通過(guò)添加下面的代碼來(lái)在任何一臺(tái)電腦上debug你的腳本:
Func dbg($msg)
DllCall("kernel32.dll", "none", "OutputDebugString", "str",
$msg)
EndFunc
然后,你可以在需要debug的地方加上下面的代碼:
dbg("The value of Variable 1 at this time is " $var1 這個(gè)方法對(duì)用戶來(lái)說(shuō)更加透明,同時(shí)也只對(duì)DebugView
from SysInternals之類(lèi)的程序可見(jiàn)。這個(gè)方法在那些沒(méi)有安裝SciTE的機(jī)器上更具有優(yōu)勢(shì)。
Q2.我怎樣才能打開(kāi)那些非exe格式的文件[.txt, .msi, .pdf, .jpg
之類(lèi)]? [或] 我怎樣才能用默認(rèn)的瀏覽器打開(kāi)網(wǎng)頁(yè)?
A1. 這也就是為什么我們創(chuàng)建ShellExecute函數(shù).下面有一個(gè)例子:
ShellExecute("C:\autoitscripts\test.au3",
"", "", "edit", @SW_MAXIMIZE)
你也能像這樣打開(kāi)一個(gè)網(wǎng)址:
ShellExecute("http://www./forum")
如果文件的右鍵菜單里有打印選項(xiàng),你就可以這樣用AutoIt打印文件:
ShellExecute("C:\boot.ini", "", "", "print")
如果你希望暫停腳本直到程序結(jié)束,你可以使用ShellExecuteWait函數(shù),它們的運(yùn)行參數(shù)是相同的.
Q3. 我怎樣才能讓腳本只運(yùn)行一個(gè)進(jìn)程?
A1. 你可以使用_Singleton函數(shù)來(lái)阻止腳本的副本運(yùn)行,下面有一個(gè)實(shí)例:
#include <Misc.au3>
_Singleton("TheNameOfMyScript")
這樣如果腳本檢測(cè)到自己已經(jīng)啟動(dòng)就會(huì)立即退出,如果你只是想簡(jiǎn)單地知道腳本是否已經(jīng)運(yùn)行,你可以使用下面的代碼:
#include <Misc.au3>
If _Singleton("MyScriptName", 1) Then
; We know the script is already
running. Let the user know.
MsgBox(0, "Script Name", "This script
is already running. Using multiple copies of this script at the same
breaks the [(UltimaCoder)] License!")
Exit
Endif
Q4. 我怎樣才能讓腳本作為系統(tǒng)服務(wù)啟動(dòng)?
這也是一個(gè)有多個(gè)答案的問(wèn)題
A1.如果你只想在自己的電腦上安裝服務(wù),最簡(jiǎn)單的方法是使用Pirmasoft RunAsSvc.這個(gè)程序可以方便地添加/刪除系統(tǒng)服務(wù).
A2.如果你想讓服務(wù)能在任何電腦上都能安裝,你可以使用SRVANY.EXE和ServiceControl.au3,像這樣安
裝服務(wù):
#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)
或者使用下面的代碼刪除服務(wù):
#include "ServiceControl.au3"
$servicename = "MyServiceName"
_DeleteService("",
$servicename)
Q5. 我怎樣啟動(dòng)/停止服務(wù)?
A1.有兩個(gè)函數(shù)集能幫助你控制服務(wù):
SumTingWong制作的ServiceControl.au3
,包含的函數(shù)有:
- _StartService()
- _StopService()
- _ServiceExists()
- _ServiceRunning()
- _CreateService()
- _DeleteService()
CatchFish
制作的_NTServices.au3,包含的函數(shù)
有:
- _ServiceStart()
- _ServiceStop()
- _ServiceStatus()
- _ServicePause()
Q6.
我怎樣在復(fù)制文件時(shí)顯示進(jìn)度條?
A1.函數(shù)集ShellFileOperation.au3能
完成這個(gè)操作:
Q7. 我怎樣讓快捷鍵只在自己的GUI起作用?
A1. 在更好的方法出現(xiàn)之前,最簡(jiǎn)單的方法是使用下面的代碼:
#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
Q8. 我怎樣檢測(cè)鍵盤(pán)是否按下了指定的鍵?
A1. 你可以使用_IsPressed()函數(shù)來(lái)檢測(cè)按鍵. 你可以在幫助文件里找到這個(gè)函數(shù):User
Defined Functions -> Misc Management -> _IsPressed.
下面的例子會(huì)顯示如何在K鍵按下時(shí)單擊鼠標(biāo)左鍵:
#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
Q9. 我怎樣在遠(yuǎn)程計(jì)算機(jī)上運(yùn)行腳本?
A1. 這個(gè)問(wèn)題的答案由你在局域網(wǎng)的經(jīng)驗(yàn)決定,如果目標(biāo)系統(tǒng)是Windows 2000或Windows
XP而且你擁有管理員權(quán)限,你就可以使用下面的兩個(gè)程序:
這兩個(gè)程序都允許在遠(yuǎn)程計(jì)算機(jī)上運(yùn)行任何程序,甚至可以把你的腳本復(fù)制到目標(biāo)系統(tǒng)上.不過(guò)Windows XP Home Edition
上不能運(yùn)行這個(gè)兩個(gè)程序.
Q10. 我怎樣制作一個(gè)擁有可選參數(shù)的自定義函數(shù)?
A1. 你可以通過(guò)在聲明函數(shù)時(shí)給參數(shù)指定一個(gè)默認(rèn)值來(lái)做到. 下面是一個(gè)例子:
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
如果調(diào)用testme()時(shí)只使用了一個(gè)參數(shù)[比如testme("test")]就會(huì)輸出:
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
不過(guò),如果調(diào)用函數(shù)時(shí)使用了超過(guò)2個(gè)參數(shù),比如testme("test", "something"), 就會(huì)輸出:
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
Q11. 我怎樣讓系統(tǒng)啟動(dòng)時(shí)自動(dòng)運(yùn)行腳本?
A1.你可以使用下面的語(yǔ)句來(lái)做到:
RegWrite("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
"MyProgramName", "REG_SZ",
@ScriptFullPath)
或者:
FileCreateShortcut(@ScriptFullPath, @StartupCommonDir "\MyProgramName.lnk")
Q12. 我怎樣讓腳本刪除自己?
A1. 下面的代碼可以刪除一個(gè)正在運(yùn)行的腳本.
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
Q13. 我怎樣在GUI里建立一個(gè)可點(diǎn)擊的超鏈接?
A1. Gafrost在這方面做了很大努力,并提供了一個(gè)UDF來(lái)幫助完成這個(gè)功能.
Q14. 我怎樣修改屏幕分辨率/刷新頻率/顏色深度?
A1. ChangeResolution.au3可以完
成這些設(shè)置.
Q15. 在多顯示器情況下我怎樣得到屏幕分辨率?
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]
Q16. 我怎樣注冊(cè)一個(gè)文件類(lèi)型[或者]
我怎樣才能讓我的程序變?yōu)橐粋€(gè)文件類(lèi)型的默認(rèn)打開(kāi)方式?
A1. 文件注冊(cè)對(duì)那些新手來(lái)說(shuō)的確有些困難. 第一件要做的事就是要讓你的腳本能接受命令行調(diào)用. 下面是一段示例代碼:
;$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
然后你的腳本就能接受文件了, 你可以開(kāi)始注冊(cè)一個(gè)文件類(lèi)型. 為了避免錯(cuò)誤,我對(duì)此專(zhuān)門(mén)制作了一個(gè)UDF—— FileRegister.au3
下面的代碼演示了如何用這個(gè)UDF來(lái)注冊(cè)/反注冊(cè)一個(gè)文件類(lèi)型:
#include "FileRegister.au3"
;==============================================================================================
;
; Description: FileRegister($ext, $cmd, $verb[, $def[, $icon = ""[,
$desc = ""]]])
; Registers a file type in Explorer
; Parameter(s): $ext - File Extension without period eg. "zip"
; $cmd - Program path with arguments eg.
'"C:\test\testprog.exe" "%1"'
; (%1 is 1st argument, %2 is 2nd, etc.)
; $verb - Name of action to perform on file
; eg. "Open with ProgramName" or "Extract Files"
; $def - Action is the default action for this
filetype
; (1 for true 0 for false)
; If the file is not already associated, this will
be the default.
; $icon - Default icon for filetype including resource #
if needed
; eg. "C:\test\testprog.exe,0" or
"C:\test\filetype.ico"
; $desc - File Description eg. "Zip File" or "ProgramName
Document"
;
;===============================================================================================
FileRegister("uxy",
'"' @ScriptFullPath
'" "%1"', "Open in
UXYFixer", 1, @ScriptFullPath
',0', "UXYFixer
Document")
;===============================================================================
;
; Description: FileUnRegister($ext, $verb)
; UnRegisters a verb for a file type in Explorer
; Parameter(s): $ext - File Extension without period eg. "zip"
; $verb - Name of file action to remove
; eg. "Open with ProgramName" or "Extract Files"
;
;===============================================================================
FileUnRegister("uxy",
"Open in UXYFixer")
Q17. 為什么點(diǎn)擊我的下拉框(GUICtrlCreateCombo)時(shí)不出現(xiàn)一個(gè)下拉列表?
A1.
在使用GUICtrlCreateCombo前你先要確認(rèn)height參數(shù)是你想要的下拉列表的高度,Windows XP會(huì)自動(dòng)選擇一個(gè)高度,但其他版本的Windows并不能這樣
做.
$combo = GUICtrlCreateCombo("",10,10,200,20)
應(yīng)修改為:
$combo = GUICtrlCreateCombo("",10,10,200,200)
Q18. 為什么我的帖子沒(méi)有人回答?
A1. 你是否對(duì)你的問(wèn)題做了得體的描述? 如果你的標(biāo)題或者對(duì)問(wèn)題的描述含糊不清,
其他人只會(huì)忽略掉你的問(wèn)題而不是回答它. 那些標(biāo)題像 "幫助我", "我有了麻煩", "問(wèn)題", "幫我看看代碼的問(wèn)題", "這段代碼不能工作"
的帖子并不會(huì)引起其他人的注意. 那些有經(jīng)驗(yàn)的用戶(他們通常能解決你的問(wèn)題) 經(jīng)常會(huì)跳過(guò)類(lèi)似的帖子.
一個(gè)規(guī)范的標(biāo)題應(yīng)該像這樣:"使用WinWaitClose時(shí)出現(xiàn)的問(wèn)題",或者 "陷入了死循環(huán)".
A2. 你是否貼出了你的代碼? 如果你不貼出你的問(wèn)題代碼你就不可能得到幫助.
在發(fā)代碼之前先把不相關(guān)的代碼去掉.也許當(dāng)然去掉不相關(guān)的代碼時(shí)你已經(jīng)看到問(wèn)題所在的地方..也許會(huì)發(fā)現(xiàn).原來(lái)是一個(gè)那樣簡(jiǎn)單的問(wèn)題.
A3. 請(qǐng)讓你的文字變得易于閱讀,適當(dāng)?shù)臉?biāo)點(diǎn)很重要,同時(shí)也不要給文字加上顏色.另外最好不要使用繁體字,繁體
字并不能讓你顯得更有文化,相反而會(huì)影響他人的閱讀.
另外很多人喜歡用些比較嚇人的標(biāo)題,比如"比如高手進(jìn)來(lái)看一下"."版主進(jìn)來(lái)解決一下"."高難度的問(wèn)
題".問(wèn)題常常因?yàn)槲也皇歉呤只蛘甙嬷鞫鴽](méi)有回答.或者發(fā)現(xiàn)"高難度"的問(wèn)題原來(lái)是很菜滴.不是每個(gè)人都喜歡扮帥滴.....
還有,在提問(wèn)建議多搜索一下.
Q18. 為什么殺毒軟件報(bào)告我的腳本被感染?
A1. AutoIt并沒(méi)有在你的系統(tǒng)里安裝病毒,如果你的程序被報(bào)毒的話(前提是你自己不懷惡意)
那么這就是一次誤報(bào).
殺毒軟件會(huì)在編譯過(guò)后的AutoIt腳本里發(fā)現(xiàn)一些標(biāo)記,并以此認(rèn)為你的腳本被感染病毒.之所以會(huì)出現(xiàn)這樣的情況有下面的兩點(diǎn)原因:
- AutoIt使用UPX加殼. UPX是一種開(kāi)源的程序壓縮軟件. 經(jīng)常被一些病毒使用(讓它們變得更小).
- 一些懷惡
意的寫(xiě)腳本的人讓AutoIt腳本引擎被標(biāo)識(shí)為了病毒.
|
|