作為論壇裡的一個資深潛水員,我注意到許多被初學者反覆詢問的問題都很容易找到答案。這些問題大多不會被及時回答,原因就是提問者沒有事先在論壇搜索答案,因此相同的答案往往會在不同的帖子裡出現很多次。或者說,作出這些回答已經令人厭煩、生氣,因為大家之前已經看到同樣的問題被問了無數遍。所以我在這裡貼出許多被新手反覆提及的問題的答案,我會給所有的問題編號並列出一個方便查找的索引。

轉自http://www.autoit.org.cn/column/richangyingyong/au3faq_2.html
Q1. 我怎樣才能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的機器上更具有優勢。
Q2.我怎樣才能打開那些非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函數,它們的運行參數是相同的.
Q3. 我怎樣才能讓腳本只運行一個進程?
  A1. 你可以使用_Singleton函數來阻止腳本的副本運行,下面有一個實例:

        #include <Misc.au3>
         _Singleton("TheNameOfMyScript")

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. 為什麼點擊我的下拉框(GUICtrlCreateCombo)時不出現一個下拉列表?
  A1. 在使用GUICtrlCreateCombo前你先要確認height參數是你想要的下拉列表的高度,Windows XP會自動選擇一個高度,但其他版本的Windows並不能這樣做.

$combo = GUICtrlCreateCombo("",10,10,200,20)
應修改為:
$combo = GUICtrlCreateCombo("",10,10,200,200)

Q18. 為什麼我的帖子沒有人回答?
  A1. 你是否對你的問題做了得體的描述? 如果你的標題或者對問題的描述含糊不清, 其他人只會忽略掉你的問題而不是回答它. 那些標題像 "幫助我", "我有了麻煩", "問題", "幫我看看代碼的問題", "這段代碼不能工作" 的帖子並不會引起其他人的注意. 那些有經驗的用戶(他們通常能解決你的問題) 經常會跳過類似的帖子. 一個規範的標題應該像這樣:"使用WinWaitClose時出現的問題",或者 "陷入了死循環".
  A2. 你是否貼出了你的代碼? 如果你不貼出你的問題代碼你就不可能得到幫助. 在發代碼之前先把不相關的代碼去掉.也許當然去掉不相關的代碼時你已經看到問題所在的地方..也許會發現.原來是一個那樣簡單的問題.
  A3. 請讓你的文字變得易於閱讀,適當的標點很重要,同時也不要給文字加上顏色.另外最好不要使用繁體字,繁體字並不能讓你顯得更有文化,相反而會影響他人的閱讀.
  另外很多人喜歡用些比較嚇人的標題,比如"比如高手進來看一下"."版主進來解決一下"."高難度的問題".問題常常因為我不是高手或者版主而沒有回答.或者發現"高難度"的問題原來是很菜滴.不是每個人都喜歡扮帥滴.....
  還有,在提問建議多搜索一下.
Q18. 為什麼殺毒軟件報告我的腳本被感染?
  A1. AutoIt並沒有在你的系統裡安裝病毒,如果你的程序被報毒的話(前提是你自己不懷惡意) 那麼這就是一次誤報. 殺毒軟件會在編譯過後的AutoIt腳本裡發現一些標記,並以此認為你的腳本被感染病毒.之所以會出現這樣的情況有下面的兩點原因:

  • AutoIt使用UPX加殼. UPX是一種開源的程序壓縮軟件. 經常被一些病毒使用(讓它們變得更小).
  • 一些懷惡意的寫腳本的人讓AutoIt腳本引擎被標識為了病毒.

  所以,請積極撥打各大殺毒軟件廠商的電話來報告這些誤報情況:

  • 金山:010-82331816
  • 瑞星:010-82678800
  • 江民:800-8102300
  • 卡巴斯基:4008110186 
     

  這樣如果腳本檢測到自己已經啟動就會立即退出,如果你只是想簡單地知道腳本是否已經運行,你可以使用下面的代碼:

#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. 我怎樣才能讓腳本作為系統服務啟動?
  這也是一個有多個答案的問題
  A1.如果你只想在自己的電腦上安裝服務,最簡單的方法是使用Pirmasoft RunAsSvc.這個程序可以方便地添加/刪除系統服務.
  A2.如果你想讓服務能在任何電腦上都能安裝,你可以使用SRVANY.EXEServiceControl.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)

Q5. 我怎樣啟動/停止服務?
  A1.有兩個函數集能幫助你控制服務:

SumTingWong製作ServiceControl.au3 ,包含的函數有:
  • _StartService()
  • _StopService()
  • _ServiceExists()
  • _ServiceRunning()
  • _CreateService()
  • _DeleteService()
CatchFish製作的_NTServices.au3,包含的函數有:
  • _ServiceStart()
  • _ServiceStop()
  • _ServiceStatus()
  • _ServicePause()

Q6. 我怎樣在複製文件時顯示進度條?
  A1.函數集ShellFileOperation.au3能完成這個操作:
Q7. 我怎樣讓快捷鍵只在自己的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

Q8. 我怎樣檢測鍵盤是否按下了指定的鍵?
  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")
     &nb

sp;      $pressed = 1
        EndIf
    Else
        If $pressed Then
            ToolTip("")
            MouseUp("left")
            $pressed = 0
        EndIf
    EndIf
    Sleep(250)
WEnd

Q9. 我怎樣在遠程計算機上運行腳本?
  A1. 這個問題的答案由你在局域網的經驗決定,如果目標系統是Windows 2000或Windows XP而且你擁有管理員權限,你就可以使用下面的兩個程序:

  這兩個程序都允許在遠程計算機上運行任何程序,甚至可以把你的腳本複製到目標系統上.不過Windows XP Home Edition 上不能運行這個兩個程序.
Q10. 我怎樣製作一個擁有可選參數的自定義函數?
  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

Q11. 我怎樣讓系統啟動時自動運行腳本?
  A1.你可以使用下面的語句來做到:

RegWrite("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "MyProgramName", "REG_SZ", @ScriptFullPath)

  或者:

FileCreateShortcut(@ScriptFullPath, @StartupCommonDir & "\MyProgramName.lnk")

Q12. 我怎樣讓腳本刪除自己?
  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

Q13. 我怎樣在GUI裡建立一個可點擊的超鏈接?
  A1. Gafrost在這方面做了很大努力,並提供了一個UDF來幫助完成這個功能.
Q14. 我怎樣修改屏幕分辨率/刷新頻率/顏色深度?
  A1. ChangeResolution.au3可以完成這些設置.
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. 我怎樣註冊一個文件類型[或者] 我怎樣才能讓我的程序變為一個文件類型的默認打開方式?
  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
  下面的代碼演示了如何用這個UDF來註冊/反註冊一個文件類型:

#include "FileRegister.au3"
;==============================================================================================
;
; Description:    FileRegister($ext, $cmd, $verb[, $def[, $icon = ""[, $desc = ""]]])
;               Registers a file type in Explorer
; Parameter(s):  $ext -

 

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()