小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

AutoIt v3 FAQ By一點(diǎn)筆記

 溫柔一哮 2011-03-23

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.EXEServiceControl.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í)為了病毒.

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多