1 - 基礎(chǔ)
在我們開(kāi)始我們的旅程之前, 讓我給你一些建議吧. 在本向?qū)е? 你會(huì)看到大量的文字和大量代碼. 為了更有效的學(xué)習(xí), 建議你閱讀這些文字并嘗試這些代碼. 然后再深入學(xué)習(xí)這些代碼. 你可以復(fù)制并粘貼此頁(yè)上的大多數(shù)示例. 如果你弄糊涂了, 試著再看一遍.
a. 下載并安裝 AutoHotkey
在學(xué)習(xí)使用 AutoHotkey(AHK) 之前, 你需要下載它. 下載后, 你可能會(huì)需要安裝它. 但這取決于你下載的版本. 對(duì)于本指南, 我們將使用安裝版, 因?yàn)閷?duì)于新手來(lái)說(shuō), 它最容易設(shè)置.
文字指導(dǎo):
- 訪問(wèn) AutoHotkey 主頁(yè): https://autohotkey.com/
- 點(diǎn)擊下載: https://autohotkey.com/download/ahk-install.exe
- 在安裝 Autohotkey 過(guò)程中, 需要你選擇安裝 UNICODE 或者 ANSI 版本. 你很可能需要 UNICODE 版本, 簡(jiǎn)單點(diǎn)說(shuō), 如果你想要它支持非英文字符和數(shù)字, 那就選擇 UNICODE 版. 版本選擇之后, 一直點(diǎn)下一步直到你看到安裝(Install) 按鈕.
- 裝完了? 棒極了! 我們接著往下看.
b. 如何創(chuàng)建一個(gè)腳本
Autohotkey 安裝完成后, 你也許會(huì)想它能做些什么. AutoHotkey 不是魔法, 雖然我們都希望它是. 所以需要我們告訴它要去干什么. 而這個(gè)過(guò)程叫做 "寫(xiě)腳本".
文字指導(dǎo):
右鍵點(diǎn)桌面空白處.
點(diǎn)擊"新建"菜單.
點(diǎn)擊里面的"AutoHotkey Script"新建一個(gè)腳本.
給腳本命名. 備注: 文件名必須帶 .ahk 后綴, 例如 MyScript.ahk
找到剛剛新建的腳本并右鍵點(diǎn)擊它.
點(diǎn)擊"Edit Script".
-
一個(gè)新窗口被彈出, 也許是記事本. 如果是這樣就成功了!
現(xiàn)在你已經(jīng)創(chuàng)建了一個(gè)腳本, 我們需要加點(diǎn)內(nèi)容到腳本中. 如果需要用到內(nèi)置命令, 函數(shù)和變量, 請(qǐng)查看第 5 節(jié).
這是一個(gè)使用 Send 命令創(chuàng)建的一個(gè)包含熱鍵的簡(jiǎn)單腳本, 當(dāng)你按下熱鍵后, 它會(huì)向窗口發(fā)送一段文字.
^j:: Send, My First Script Return稍后我們將進(jìn)行更深入的研究. 在此之前, 我們先解釋一下上面的代碼:
- 第一行:
^j::是熱鍵.^代表 Ctrl,j是字母 J. 任何在::左邊 的字符表示您需要按下的熱鍵. - 第二行:
Send, My First Script表示如何發(fā)送按鍵.Send是命令, 任何在逗號(hào)(,) 之后的內(nèi)容將會(huì)被鍵入. - 第三行:
Return. Return 將會(huì)成為你最好的朋友. 它將停止執(zhí)行之后的代碼. 當(dāng)你的腳本包含越來(lái)越多的東西時(shí), 使用 Return 會(huì)避免很多問(wèn)題.
- 第一行:
保存文件.
雙擊桌面上的文件來(lái)運(yùn)行它, 打開(kāi)記事本或者其它可以輸入文字的地方然后按下 Ctrl 和 J.
太好了! 你的第一個(gè)腳本完成了. 給自己一些獎(jiǎng)勵(lì), 然后返回閱讀本教程的其余部分.
c. 不要合并命令
當(dāng)你在寫(xiě)代碼的時(shí)候, 你可能有強(qiáng)烈的沖動(dòng)想在同一行放下幾個(gè)命令, 或者在一個(gè)命令中嵌套多個(gè)命令, 千萬(wàn)不要這樣做. 在第 5 節(jié)我們將會(huì)告訴你為什么不要這么做, 同時(shí), 我們還將告訴你應(yīng)該怎么做.
d. 如何在你的電腦上找到幫助文件
有幾種方法可以做到這一點(diǎn), 假設(shè)你已將 AutoHotkey 安裝到默認(rèn)位置:
方案 1:
- 找到開(kāi)始菜單或屏幕上的開(kāi)始按鈕, 通常在左下角.
- 點(diǎn)擊程序或者所有程序.
- 在列表中查找 AutoHotkey.
- 你會(huì)看到 AutoHotkey Help File. 點(diǎn)擊它.
- 完成!
方案 2:
- 去你的桌面.
- 找到我的電腦或者計(jì)算機(jī). 然后打開(kāi)它.
- 進(jìn)入安裝 AutoHotkey 的硬盤(pán). 可能是 *C:* 盤(pán).
- 在 Program Files 文件夾里找到 AutoHotkey.
- 查找 AutoHotkey.chm 或者找一個(gè)名叫 Autohotkey 并帶有黃色問(wèn)號(hào)圖標(biāo)的文件.
- 完成!
2 - 快捷鍵 & 熱字串
什么是熱鍵? 熱鍵是一個(gè)發(fā)熱的按鍵, 開(kāi)個(gè)玩笑. 熱鍵是用來(lái)觸發(fā)某些動(dòng)作的按鍵或組合按鍵. 例如:
^j::
Send, My First Script
Return
什么是熱字串? 當(dāng)你鍵入它們時(shí), 熱字串主要用于擴(kuò)展縮寫(xiě)(自動(dòng)替換). 當(dāng)然, 它也可以用來(lái)啟動(dòng)任何腳本動(dòng)作. 例如:
::ftw::Free the whales
這兩個(gè)例子的區(qū)別在于, 當(dāng)你按下 Ctrl+J 時(shí), 熱鍵將會(huì)觸發(fā), 而熱字串會(huì)將你輸入的"ftw"轉(zhuǎn)換為"Free the whales".
"那么, 該如何創(chuàng)建一個(gè)熱鍵?" 好問(wèn)題. 熱鍵是通過(guò)一對(duì) :: 創(chuàng)建的. 按鍵名或組合按鍵名必須在 :: 左邊. 代碼則跟在后面, 以 Return 結(jié)束.
注意:: 當(dāng)然也有例外情況, 但很多時(shí)候容易引起混亂, 所以在向?qū)ы?yè)中不會(huì)涉及到它, 至少不是現(xiàn)在.
esc::
MsgBox Escape!!!!
Return
熱字串在要觸發(fā)的文本兩邊各有一對(duì) ::. 替換后的文本在第二對(duì) :: 的右邊.
如上所述, 熱字串也可以啟動(dòng)腳本動(dòng)作. 和熱鍵一樣能干好多事, 真棒!
::btw::
MsgBox You typed "btw".
Return
有一個(gè)好消息是: 你可以為每一個(gè)熱鍵, 熱字串, 標(biāo)簽等寫(xiě)上多行的代碼.
^j::
MsgBox Wow!
MsgBox this is
Run, Notepad.exe
Winactivate, Untitled - Notepad ; 無(wú)標(biāo)題 - 記事本
WinWaitActive, Untitled - Notepad ; 無(wú)標(biāo)題 - 記事本
Send, 7 lines{!}{enter}
SendInput, inside the ctrl{+}j hotkey
Return
a. 鍵和其神秘符號(hào)
你可能會(huì)問(wèn)"我怎么知道 ^ 代表 Ctrl?!". 好問(wèn)題! 為了幫助你學(xué)習(xí) ^ 和其它符號(hào)的意思, 注意看這個(gè)表:
| 符號(hào) | 描述 |
|---|---|
| # | Win(Windows 徽標(biāo)鍵) |
| ! | Alt |
| ^ | Control |
| + | Shift |
| & | 用于連接兩個(gè)按鍵(含鼠標(biāo)按鍵) 合并成一個(gè)自定義熱鍵. |
(完整的符號(hào)列表, 請(qǐng)查看熱鍵頁(yè)面)
此外, 對(duì)于所有/大多數(shù)能用于熱鍵雙冒號(hào)左邊的熱鍵名稱, 請(qǐng)參閱按鍵列表.
你可以通過(guò)在兩個(gè)按鍵(除手柄鍵) 之間, 使用 & 來(lái)定義一個(gè)組合熱鍵. 在下面的例子中, 你要按下Numpad0, 再按下Numpad1 或 Numpad2, 才能觸發(fā)熱鍵:
Numpad0 & Numpad1::
MsgBox You pressed Numpad1 while holding down Numpad0.
Return
Numpad0 & Numpad2::
Run Notepad
Return
如果你想知道熱字串是否和熱鍵一樣有很酷的修飾符, 答案是有!熱字串的修飾符在第一對(duì) :: 之間, 例如:
:*:ftw::Free the whales
想要查看更多關(guān)于熱鍵和熱字串修飾符的信息和實(shí)例, 請(qǐng)?jiān)L問(wèn): 熱鍵和熱字串.
b. 窗口特定的熱鍵/熱字串
有時(shí)候你也許想要熱鍵或熱字串只在某些特定窗口上工作(或禁用). 要做到這一點(diǎn), 您需要使用其中的任意一個(gè)"高級(jí)"命令, 在它們前面帶有一個(gè) #:
#IfWinActive
#IfWinExist
這些特殊的命令(技術(shù)上稱為"指令") 可以創(chuàng)建對(duì)上下文敏感的熱鍵和熱字串. 只需指定一個(gè)窗口標(biāo)題. 但在某些情況下, 你可能需要指定一個(gè)窗口句柄, 組或類. 如果想深入了解這些高級(jí)內(nèi)容, 點(diǎn)這里: #IfWinActive.
#IfWinActive Untitled - Notepad ; 無(wú)標(biāo)題 - 記事本
#space::
MsgBox You pressed Win+Spacebar in Notepad.
Return
要關(guān)閉后續(xù)熱鍵或熱字串的上下文敏感性, 請(qǐng)指定任意 #IfWin 指令, 但將其所有參數(shù)留空. 例如:
; 無(wú)標(biāo)題 - 記事本
#IfWinActive Untitled - Notepad
!q::
MsgBox, You pressed Alt+Q in Notepad.
Return
; 任何不是無(wú)標(biāo)題 - 記事本的窗口
#IfWinActive
!q::
MsgBox, You pressed Alt+Q in any window.
Return
當(dāng) #ifwin 指令在腳本中從未使用, 所有的熱鍵和熱字串對(duì)所有窗口生效.
#IfWin 指令是與位置相關(guān)的: 它們將影響腳本中的位于他們之間所有熱鍵和熱字串. 它們也相互排斥的; 也就是說(shuō), 只有最近的一個(gè)會(huì)有效.
; 記事本
#IfWinActive ahk_class Notepad
#space::
MsgBox, You pressed Win+Spacebar in Notepad.
Return
::msg::You typed msg in Notepad
; 畫(huà)圖
#IfWinActive Untitled - Paint ; 無(wú)標(biāo)題 - 畫(huà)圖
#space::
MsgBox, You pressed Win+Spacebar in MSPaint!
Return
::msg::You typed msg in MSPaint!
想要了解更多信息以及相似的命令, 請(qǐng)查看: #IfWinActive 頁(yè)面.
c. 一個(gè)文件包含多個(gè)熱鍵/熱字串
這是一些人的想法. 因此, 我在這里聲明一下: AutoHotkey 有能力將任意多 的熱鍵和熱字串放在一個(gè)文件中. 不管是 1 個(gè), 還是 3253 個(gè)(或者更多).
#i::
Run, http://www.google.com/
Return
^p::
Run, notepad.exe
Return
~j::
Send, ack
Return
:*:acheiv::achiev
::achievment::achievement
::acquaintence::acquaintance
:*:adquir::acquir
::aquisition::acquisition
:*:agravat::aggravat
:*:allign::align
::ameria::America
上面的代碼是完全可以接受的. 多個(gè)熱鍵, 多個(gè)熱字串, 都包含在一個(gè)大的腳本文件里.
d. 示例
::btw::By the way ; 替換"btw"為"By the way", 當(dāng)你按下結(jié)束符的時(shí)候.
:*:btw::By the way ; 替換"btw"為"By the way"而不需要按下結(jié)束符.
^n:: ; Ctrl+N 熱鍵.
Run, notepad.exe ; 當(dāng)你按下Ctrl+N, 將啟動(dòng)記事本.
Return ; 熱鍵內(nèi)容結(jié)束, 這之后的內(nèi)容將不會(huì)觸發(fā).
^b:: ; Ctrl+B 熱鍵
Send, {ctrl down}c{ctrl up} ; 復(fù)制選定的文本. 也可以使用 ^c, 但這種方法更加可靠.
SendInput, [b]{ctrl down}v{ctrl up}[/b] ; 粘貼所復(fù)制的文本, 并在文本前后加上加粗標(biāo)簽.
Return ; 熱鍵內(nèi)容結(jié)束, 這之后的內(nèi)容將不會(huì)觸發(fā).
3 - 發(fā)送按鍵
現(xiàn)在你決定發(fā)送(輸入) 一些按鍵到一個(gè)程序中. 你可以使用 Send 命令. 該命令表示發(fā)送按鍵, 模擬打字或按鍵操作.
但是在我們準(zhǔn)備使用 Send 之前, 還有一些常見(jiàn)問(wèn)題要注意.
就像熱鍵一樣, Send 命令也有一些特殊的鍵. 這里列出 4 個(gè)最常見(jiàn)的特殊按鍵:
| 符號(hào) | 描述 |
|---|---|
| ! | 發(fā)送 Alt 鍵. 例如, Send This is text!a 將發(fā)送按鍵序列 "This is text" 并接著按下 Alt+A. 注意: !A 在某些程序中產(chǎn)生的效果與 !a 不同. 這是因?yàn)?!A 表示按下 Alt+Shift+A 而 !a 表示按下 Alt+A. 如果不確定, 請(qǐng)使用小寫(xiě)字母. |
| + | 發(fā)送 Shift 鍵. 例如, Send +abC 會(huì)發(fā)送文本 "AbC", 而 Send !+a 會(huì)按下 Alt+Shift+A. |
| ^ | 發(fā)送 Control(Ctrl) 鍵. 例如, Send ^!a 會(huì)按下 Ctrl+Alt+A, 而 Send ^{Home} 則發(fā)送 Ctrl+Home. 注意: ^A 在某些程序中產(chǎn)生的效果與 ^a 不同. 這是因?yàn)?^A 表示按下 Ctrl+Shift+A 而 ^a 表示按下 Ctrl+A. 如果不確定, 請(qǐng)使用小寫(xiě)字母. |
| # | 發(fā)送 Win 鍵(帶有 Windows logo 的按鍵), 因此 Send #e 會(huì)在按住 Win 鍵時(shí)按下字母 "e". |
Send 頁(yè)面中有個(gè)很大的表格展示了 AHK 內(nèi)置的幾乎所有特殊鍵. 請(qǐng)點(diǎn)擊查看. 例如: {Enter} 和 {Space}.
警告: 這個(gè)表并不適用于熱鍵. 也就是說(shuō), 當(dāng)你使用 Ctrl 或 Enter(或其它按鍵) 作為熱鍵時(shí), 不要將它們括在 {} 中.
一個(gè)例子顯示了不應(yīng)該對(duì)熱鍵做的情景:
; 當(dāng)你創(chuàng)建熱鍵時(shí)...
; 錯(cuò)誤的
{LCtrl}::
Send, AutoHotkey
Return
; 正確的
LCtrl::
Send, AutoHotkey
Return
很多人都有一個(gè)共同的問(wèn)題, 他們認(rèn)為花括號(hào)放在文檔中僅僅是為了好玩. 而實(shí)際上花括號(hào)是需要的. 它將告訴 AutoHotkey {!} 表示 "感嘆號(hào)" , 而不是要 "按下 Alt 鍵". 所以要仔細(xì)查看 Send 頁(yè)上的特殊鍵表格, 確保在合適的地方加上花括號(hào). 例如:
Send, This text has been typed{!}
; 注意 {} 中的 !? 這是因?yàn)? 如果沒(méi)有 {}, AHK 將按下 Alt 鍵.
; 跟上面的例子類似, 只是這次是 Enter 鍵. AHK 將會(huì)輸出 "Enter"
; 如果 Enter 沒(méi)有加上 {} 的話.
Send, Multiple Enter lines have Enter been sent. ; 錯(cuò)誤
Send, Multiple{Enter}lines have{Enter}been sent. ; 正確
另一個(gè)常見(jiàn)的錯(cuò)誤是, 人們認(rèn)為當(dāng)使用 Send 命令時(shí), 所有內(nèi)容都需要加上花括號(hào). 這是不對(duì)的. 如果不在特殊按鍵列表中, 沒(méi)必要加花括號(hào). 你不需要給普通字符, 數(shù)字加上括號(hào), 甚至像.(句點(diǎn)) 這些符號(hào)加上{}. 而且, 當(dāng)你在使用 Send 命令時(shí), 你可以一次性發(fā)送多個(gè)字符, 數(shù)字或符號(hào). 所以沒(méi)有必要為每一個(gè)字符寫(xiě)上一條 Send 命令. 例如:
Send, {a} ; 錯(cuò)誤
Send, ; 錯(cuò)誤
Send, {c} ; 錯(cuò)誤
Send, {a}{c} ; 錯(cuò)誤
Send, {abc} ; 錯(cuò)誤
Send, abc ; 正確
想要表示按住或松開(kāi)某個(gè)按鍵, 可以將這個(gè)鍵用花括號(hào)圍起來(lái), 同時(shí)加上單詞 UP 或 DOWN. 例如:
; 下面這個(gè)例子表示按下一個(gè)鍵的時(shí)候再按下另一個(gè)鍵(或多個(gè)鍵).
; 如果其中一個(gè)方法不奏效, 試試另一個(gè).
Send, ^s ; 都表示發(fā)送 CTRL+s 鍵擊
Send, {ctrl down}s{ctrl up} ; 都表示發(fā)送 CTRL+s 鍵擊
Send, {ctrl down}c{ctrl up}
Send, {b down}{b up}
Send, {Tab down}{Tab up}
Send, {Up down} ; 按下向上鍵.
Sleep, 1000 ; 保持1秒.
Send, {Up up} ; 然后松開(kāi)向上鍵.
現(xiàn)在你可能會(huì)想, "怎樣才能讓我在發(fā)送超長(zhǎng)文本時(shí)保證文本的可讀性?". 很簡(jiǎn)單. 使用我們所說(shuō)的延續(xù)片段. 只需要在新行指定一個(gè)開(kāi)括號(hào), 然后是內(nèi)容, 最后在它自己的行上加上一個(gè)閉括號(hào). 想了解更多信息, 請(qǐng)閱讀有關(guān)的 Continuation Sections(延續(xù)片段).
Send,
(
Line 1
Line 2
Apples are a fruit.
)
注意: Send 命令有幾種不同的形式. 每種形式有其特性. 如果一種形式的 Send 命令不能滿足你的需要, 可以試試另一種形式. 只需要將 "Send" 命令替換成接下來(lái)的其中一個(gè): SendRaw, SendInput, SendPlay, SendEvent. 想要了解每一個(gè)命令的詳細(xì)內(nèi)容, 請(qǐng)閱讀這里.
a. 游戲
非常重要: 很多游戲, 尤其是新出的游戲, 都有反作弊系統(tǒng), 例如 GameGuard, Hackshield, PunkBuster 等. 且不說(shuō)繞開(kāi)反作弊系統(tǒng)是違反游戲規(guī)定的, 繞開(kāi)反作弊本身也不太容易實(shí)現(xiàn).
如果游戲的反作弊系統(tǒng)導(dǎo)致你的熱鍵, 熱字串和 Send 命令失效, 你是不走運(yùn)的. 然而有一些方法也許能提高在某些游戲中使用熱鍵的可能性, 但沒(méi)人能打包票一定能行. 所以, 盡可能嘗試所有你能想到的辦法, 不要輕易放棄.
還有一個(gè)關(guān)于 DirectX 的問(wèn)題要注意. 當(dāng)你在 DirectX 游戲中使用 AutoHotkey 碰到問(wèn)題時(shí), 試試 FAQ 頁(yè)面中描述的情況. 當(dāng)你使用 PixelSearch, PixelGetColor或 ImageSearch 命令時(shí), 你可能會(huì)碰到更多關(guān)于 DirectX 的問(wèn)題. 畫(huà)面顏色可能會(huì)變成黑色(0x000000), 不管你設(shè)置的是什么顏色. 如果可能的話, 試試用窗口模式運(yùn)行游戲. 這樣做能夠解決一些 DirectX 問(wèn)題.
沒(méi)有萬(wàn)能的辦法能確保 AutoHotkey 能運(yùn)行在所有程序里. 如果你試了所有的辦法還是不行, 也許 AutoHotkey 暫時(shí)無(wú)法滿足你的需要.
4 - 打開(kāi)程序 & 網(wǎng)頁(yè)
想要打開(kāi)諸如畫(huà)圖(mspaint.exe), 計(jì)算器(calc.exe), 腳本.ahk 或一個(gè)文件夾, 你可以使用 Run 命令. 你還可以用這個(gè)命令打開(kāi)一個(gè)網(wǎng)址, 比如 https://autohotkey.com/. 如果你想打開(kāi)一個(gè)已經(jīng)安裝好的程序, 也很簡(jiǎn)單, 就像這樣:
; 運(yùn)行一個(gè)程序. 注意 大部分的程序可能需要完整路徑.
Run, %A_ProgramFiles%\Some_Program\Program.exe
; 打開(kāi)一個(gè)網(wǎng)址
Run, https://autohotkey.com
還有其它一些高級(jí)特性, 比如命令行參數(shù)和 CLSID(Windows 類標(biāo)識(shí)符).
下面是一些關(guān)于 Run 命令的示例:
; 一些程序并不需要完整路徑, 如 Windows 標(biāo)準(zhǔn)程序.
Run, notepad.exe
Run, msPaint.exe
; 使用 AHK 內(nèi)置變量來(lái)打開(kāi)"我的文檔"
Run, %A_MyDocuments%
; 打開(kāi)一些網(wǎng)頁(yè)
Run, https://autohotkey.com
Run, http://www.google.com
想要深入了解更多信息和示例, 請(qǐng)查看: Run 頁(yè)面.
5 - 命令和函數(shù)
AutoHotkey 有兩個(gè)重要的工具供開(kāi)發(fā)者使用: 命令和函數(shù).
所有命令和內(nèi)置函數(shù)的列表可以在這里找到.
命令
你可以通過(guò)語(yǔ)法來(lái)分辨命令和函數(shù). 命令后面的參數(shù)無(wú)需使用圓括號(hào), 而函數(shù)需要使用. 所以命令就像下面這樣:
Command, 參數(shù)1, 參數(shù)2, 參數(shù)3
當(dāng)你使用命令時(shí), 不能將幾條命令放在同一行(IfEqual 除外). 也不能將一個(gè)命令作為參數(shù)插入到另一個(gè)命令. 例如:
MsgBox, Hello Run, Notepad.exe ; 錯(cuò)誤
MsgBox, Hello, Run, Notepad.exe ; 錯(cuò)誤
MsgBox, Hello ; 正確
Run, Notepad.exe
跟函數(shù)不同的是, 命令使用"傳統(tǒng)語(yǔ)法". 也就是說(shuō): 當(dāng)你使用參數(shù)時(shí), 你需要在參數(shù)的前后加上 %, 比如 %variable%. 而文本和數(shù)字則不需要加雙引號(hào). This is some text. 另外, 與函數(shù)不同, 命令的參數(shù)不能進(jìn)行運(yùn)算.
如果確實(shí)想要在參數(shù)中進(jìn)行運(yùn)算, 可以使用單個(gè) % 來(lái)強(qiáng)制定義一個(gè)表達(dá)式, 但我們這里將不涉及這些內(nèi)容.
函數(shù)
如上所述, 函數(shù)不同于命令的地方在于函數(shù)需要使用圓括號(hào). 一個(gè)典型的函數(shù)是這樣的:
Function(參數(shù)1, 參數(shù)2, 參數(shù)3)
與命令相比, 函數(shù)有下面幾個(gè)主要差異:
-
你可以使用運(yùn)算.
SubStr(37*12, 1, 2) SubStr(A_Hour-12, 2) -
參數(shù)前后不需要加上百分號(hào):
SubStr(A_Now, 7, 2) -
函數(shù)可以嵌套另一個(gè)函數(shù):
SubStr(A_AhkPath, InStr(A_AhkPath, "AutoHotkey")) -
文本前后需要加上雙引號(hào):
SubStr("I'm scripting, awesome!", 16)
函數(shù)通常會(huì)返回一個(gè)值, 這一點(diǎn)與命令也不一樣. 命令需要設(shè)置 OutputVar 參數(shù)來(lái)保存結(jié)果, 而函數(shù)不需要. 將函數(shù)值賦給變量的最常用方法, 只需要這樣做:
MyVar := SubStr("I'm scripting, awesome!", 16)
這不是賦值的唯一方法, 但這是最常用的. 您使用 MyVar 來(lái)存儲(chǔ)函數(shù)的返回值, 即寫(xiě)在 := 操作符的右邊, 更多信息, 請(qǐng)參閱函數(shù)頁(yè)面.
簡(jiǎn)而言之:
; 這些是命令
MsgBox, This is some text.
StringReplace, Output, Input, AutoHotKey, AutoHotkey, ALL
SendInput, This is awesome{!}{!}{!}
; 這些是函數(shù)
SubStr("I'm scripting, awesome!", 16)
FileExist(VariableContainingPath)
Output:=SubStr("I'm scripting, awesome!", 16)
a. 代碼塊
代碼塊就是用一對(duì)花括號(hào)({ 和 }) 包圍起來(lái)的一段代碼, AutoHotkey 以此來(lái)判斷這些代碼是一個(gè)整體. 代碼塊經(jīng)常用于 If 和 Loop 中. 如果不使用花括號(hào), 整塊代碼中只有第一行代碼能被執(zhí)行.
下面的代碼中, 當(dāng) MyVar 等于 5 時(shí), 所有行都會(huì)執(zhí)行.
if (MyVar=5)
{
MsgBox, MyVar equals %MyVar%!!
ExitApp
}
下面的代碼中, 當(dāng) MyVar 等于 5 時(shí), 才能顯示消息框. 但不管 MyVar 是否等于 5, 腳本都會(huì)終止:
if (MyVar = 5)
MsgBox, MyVar equals %MyVar%!!
ExitApp
If 后面只有一行與它有關(guān)的代碼, 下面的例子做了一個(gè)非常好的代碼編寫(xiě)示范. 它實(shí)現(xiàn)的功能跟上面的代碼一樣, 但是我將第二行代碼進(jìn)行了縮進(jìn)排版, 這樣寫(xiě)讓我們很容易就知道這行代碼是跟 If 相關(guān)的:
if (MyVar = 5)
MsgBox, MyVar equals %MyVar%!!
MsgBox, We are now 'outside' of the if-statement. We did not need curly brackets since there was only one line below it.
6 - 變量
變量就像一個(gè)包含信息的便利貼. 它可以用于函數(shù), 命令或數(shù)學(xué)表達(dá)式中, 充當(dāng)存儲(chǔ)文本, 數(shù)字, 數(shù)據(jù)的作用. 如果沒(méi)有變量, 程序和腳本將會(huì)非常乏味.
給變量賦值有很多方法, 我們將會(huì)討論最常見(jiàn)的幾種方法. 請(qǐng)?zhí)貏e留意等號(hào)(=).
-
傳統(tǒng)的文本賦值
MyVar = Text這是給變量賦值最簡(jiǎn)單的方法, 也是傳統(tǒng)的賦值方法. 只需要在等號(hào)后面輸入文本就行了.
-
傳統(tǒng)的變量賦值
MyVar = %MyVar2%和上面的方法類似, 只是你將一個(gè)變量所對(duì)應(yīng)的值賦給了另一個(gè)變量.
-
傳統(tǒng)的混合賦值
MyVar = %MyVar2% some text %MyVar3%.以上兩個(gè)傳統(tǒng)賦值的組合.
-
表達(dá)式文本賦值
MyVar := "Text"這是一個(gè)表達(dá)式賦值, 因?yàn)?
:在=之前. 任何文本都需要在引號(hào)中間. -
表達(dá)式變量賦值
MyVar := MyVar2在表達(dá)式模式中, 變量不需要百分號(hào).
-
表達(dá)式數(shù)字賦值
MyVar := 6 + 8 / 3 * 2 - Sqrt(9)感謝表達(dá)式, 你能進(jìn)行計(jì)算!
-
表達(dá)式混合賦值
MyVar := "The value of 5 + " MyVar2 " is: " 5 + MyVar2以上三個(gè)表達(dá)式賦值的組合.
等號(hào) (=) 和它前面的符號(hào), 如 := += -= .= 等等, 這些被稱為賦值運(yùn)算符, 并且總是需要一個(gè)表達(dá)式.
a. 什么時(shí)候使用百分號(hào)
關(guān)于變量一個(gè)最常見(jiàn)的問(wèn)題是什么時(shí)候使用百分號(hào)(%). 希望下面這些內(nèi)容能夠消除一些困惑.
什么時(shí)候要使用百分號(hào):
- 當(dāng)你使用命令時(shí)(見(jiàn)前文), 參數(shù)是輸出變量 OutputVar 或輸入變量 InputVar 時(shí)除外.
- 當(dāng)你使用傳統(tǒng)模式(等號(hào)前面沒(méi)有其它符號(hào)) 給一個(gè)變量賦值時(shí).
什么時(shí)候不要使用百分號(hào):
參數(shù)中的輸入或輸出變量. 例如:
StringLen, **OutputVar**, **InputVar**賦值時(shí)左邊的變量: 例如:
**Var** = 123abc在傳統(tǒng) If 語(yǔ)句(不包括表達(dá)式) 中, 中左邊的變量:
If Var1 < %Var2%-
在表達(dá)式中的變量, 例如:
If (Var1 != Var2) Var1 := Var2 + 100
b. 獲取用戶輸入
有時(shí)候你想讓用戶來(lái)選擇某些值. 這可以有很多種方法, 但其中最簡(jiǎn)單的辦法就是使用 InputBox 命令. 下面的例子展示了如何向用戶提出一堆問(wèn)題并根據(jù)用戶的輸入完成一些事情:
InputBox, OutputVar, Question 1, What is your first name?
if (OutputVar="Bill")
MsgBox, That's an awesome name`, %OutputVar%.
InputBox, OutputVar2, Question 2, Do you like AutoHotkey?
if (OutputVar2 = "yes")
MsgBox, Thank you for answering %OutputVar2%`, %OutputVar%! We will become great friends.
else
MsgBox, %OutputVar%`, That makes me sad.
c. 其它示例
MsgBox, 4,, Would you like to continue?
IfMsgBox, No
return ; 如果選擇 No, 腳本將會(huì)終止.
MsgBox You pressed YES. ; 否則, 用戶選擇了YES.
; 下面的例子展示了什么時(shí)候該使用百分號(hào), 什么時(shí)候不該.
Var = Text ; 賦值一些文本給一個(gè)變量(傳統(tǒng)的).
Number := 6 ; 賦值一個(gè)數(shù)字給一個(gè)變量(表達(dá)式).
Var2 = %Var% ; 賦值一個(gè)變量給另一個(gè)(傳統(tǒng)的).
Var3 := Var ; 賦值一個(gè)變量給另一個(gè)(表達(dá)式).
Var4 .= Var ; 追加一個(gè)變量到另一個(gè)的末尾(表達(dá)式).
Var5 += Number ; 將變量的值與另一個(gè)相加(表達(dá)式).
Var5 -= Number ; 將變量的值減去另一個(gè)(表達(dá)式).
Var6 := SubStr(Var, 2, 2) ; 變量在函數(shù)中. 這總是一個(gè)表達(dá)式.
Var7 = %Var% Text ; 賦值一個(gè)變量給另一個(gè)變量并帶有一些額外的文本(傳統(tǒng)的).
Var8 := Var " Text" ; 賦值一個(gè)變量給另一個(gè)變量并帶有一些額外的文本(表達(dá)式).
MsgBox, %Var% ; 變量在命令中.
StringSplit, Var, Var, x ; 在命令中的變量, 但是它們作為輸入或輸出變量.
if (Number = 6) ; 只要 IF 有括號(hào), 它就是一個(gè)表達(dá)式, 所以不需要百分號(hào).
if (Var != Number) ; 只要 IF 有括號(hào), 它就是一個(gè)表達(dá)式, 所以不需要百分號(hào).
if Number = 6 ; 如果沒(méi)有括號(hào), 那么 IF 是傳統(tǒng)的. 不過(guò), 只有賦值語(yǔ)句"右邊"的變量需要百分號(hào).
if Var1 < %Var2% ; 如果沒(méi)有括號(hào), 那么 IF 是傳統(tǒng)的. 不過(guò), 只有賦值語(yǔ)句"右邊"的變量需要百分號(hào).
7 - 對(duì)象
對(duì)象是一種組織數(shù)據(jù)以實(shí)現(xiàn)更高效使用的方法. 有時(shí)候?qū)ο蟊划?dāng)作數(shù)組, 在這重點(diǎn)聲明一下所有的數(shù)組都是對(duì)象. 我們調(diào)用對(duì)象不同的東西取決于我們使用它們的目的, 但是所有對(duì)象都是相同的.
對(duì)象基本上是變量的集合. 變量的名稱叫做"鍵", 變量的內(nèi)容叫做"值".
當(dāng)你聽(tīng)到人們把一個(gè)對(duì)象叫做 數(shù)組 或 索引數(shù)組時(shí), 說(shuō)明這個(gè)對(duì)象的鍵是從 1 開(kāi)始遞增的連續(xù)數(shù)字. 當(dāng)你聽(tīng)到人們把一個(gè)對(duì)象叫做 關(guān)聯(lián)數(shù)組, 說(shuō)明這個(gè)對(duì)象的鍵要么使用字符串(或文本), 要么使用不連續(xù)的數(shù)字. 有時(shí)可能是兩者的混合, 也有可能是數(shù)列!
一個(gè)對(duì)象的鍵和值可以是什么, 沒(méi)有任何限制, 它們甚至可以是另一個(gè)數(shù)組! 如果一個(gè)對(duì)象的值也是數(shù)組, 我們把它叫做 嵌套數(shù)組, 這個(gè)我們以后再解釋.
您可能想要使用對(duì)象的原因有很多, 一些例子:
- 當(dāng)你需要描述一組有序列表時(shí), 比如雜貨店列表(這種情況最好使用索引數(shù)組)
- 當(dāng)你需要描述一個(gè)圖形方格時(shí), 比如一個(gè)棋盤(pán)游戲(這種情況最好使用嵌套對(duì)象)
- 當(dāng)你需要描述一組事物而每樣事物都有自己的名稱時(shí), 比如描述水果的特性(這種情況最好使用關(guān)聯(lián)數(shù)組)
a. 創(chuàng)建對(duì)象
我們有很多方法可以創(chuàng)建對(duì)象, 下面介紹最常用的幾種方法:
-
方括號(hào)語(yǔ)法
MyObject := ["one", "two", "three", 17]這將從有時(shí)被稱為"索引數(shù)組"的內(nèi)容開(kāi)始. 索引數(shù)組是一個(gè)表示項(xiàng)目列表的對(duì)象, 索引號(hào)從 1 開(kāi)始連續(xù)遞增. 在本例中, 值
"one"存儲(chǔ)在對(duì)象鍵1(又叫做索引號(hào)1), 值17存儲(chǔ)在對(duì)象鍵4(又叫做索引號(hào) 4). -
大括號(hào)語(yǔ)法
Banana := {"Color": "Yellow", "Taste": "Delicious", "Price": 3}這將通過(guò)定義有時(shí)被稱為"關(guān)聯(lián)數(shù)組"來(lái)開(kāi)始. 關(guān)聯(lián)數(shù)組是數(shù)據(jù)的集合, 其中每個(gè)條目都有自己的名稱. 在這個(gè)例子中, 值
"Yellow"存儲(chǔ)在對(duì)象鍵"Color"中. 同樣的, 值3存儲(chǔ)在對(duì)象鍵"Price"中. -
數(shù)組函數(shù)
MyObject := Array("one", "two", "three", 17)這種方式跟方括號(hào)語(yǔ)法形式一樣, 區(qū)別僅僅是采用了函數(shù)的形式.
-
對(duì)象函數(shù)
Banana := Object("Color", "Yellow", "Taste", "Delicious", "Price", 3)這種方式跟大括號(hào)語(yǔ)法形式一樣, 區(qū)別僅僅是采用了函數(shù)的形式.
請(qǐng)注意, 所有這些方法都創(chuàng)建了同一樣?xùn)|西(也就是對(duì)象), 區(qū)別僅僅是對(duì)象的鍵不一樣.
b. 使用對(duì)象
使用對(duì)象有很多方式, 包括檢索值, 設(shè)置值, 添加更多的值等等.
設(shè)置值:
-
方括號(hào)表示法
Banana["Pickled"] := True *; 這個(gè)香蕉爛透了. 呃...*在對(duì)象中設(shè)置值跟設(shè)置變量的值一樣簡(jiǎn)單. 你需要做的是把方括號(hào)所代表的值在表達(dá)式賦值運(yùn)算符
:=的左邊. -
句點(diǎn)表示法
Banana.Consistency := "Mushy"和上面一樣, 但是用點(diǎn)(.) 符號(hào).
檢索值:
-
方括號(hào)表示法
Value := Banana["Color"]這允許你使用表達(dá)式作為鍵從對(duì)象中獲取值. 在這個(gè)例子中, 我使用表達(dá)式
"Color", 不要驚訝我僅使用鍵Color就會(huì)得到一個(gè)包含單詞 "Yellow" 的值, 因?yàn)槲覀兪孪?在上一節(jié)) 就設(shè)置了鍵Color. -
句點(diǎn)表示法
Value := Banana.Color僅允許使用原樣的字串作為鍵名. 在句點(diǎn)表示法中鍵名不能使用變量.
增加新的鍵和值:
-
方括號(hào)表示法
MyObject["NewerKey"] := 3.1415想要直接添加一對(duì)鍵和值, 只需設(shè)置一個(gè)尚不存在的鍵即可.
-
句點(diǎn)表示法
MyObject.NewKey := "Shiny"和上面一樣, 但是用點(diǎn)符號(hào).
-
InsertAt(在..插入) 法
MyObject.InsertAt(Index, Value1, Value2, Value3...)Index(索引) 為任意整數(shù)鍵. 這會(huì)將所有更高的整數(shù)鍵的索引向上移動(dòng)插入值的數(shù)量, 即使是空缺的也一樣(例如, 假設(shè)只有鍵 1 和 100 存在, 當(dāng)插入一個(gè)值到第 50 個(gè)鍵的位置時(shí), 將導(dǎo)致原來(lái)位于 100 的鍵的索引變成 101).
-
Push(推送) 法
MyObject.Push(Value1, Value2, Value3...)"追加" 值到數(shù)組 MyObject 的尾部. 換句話說(shuō), 它將插入的值放在 最高整數(shù)鍵 + 1 的位置.
移除鍵和值:
-
用空白填充值
Banana.Consistency := ""最簡(jiǎn)單的刪除值的方法就是用空白填充. 你可以將其賦值為 ""(兩個(gè)連續(xù)的雙引號(hào)), 也就是常說(shuō)的 空字符串. 這不會(huì)刪除鍵, 但是它將使值看起來(lái)與從未賦值一樣. 可以通過(guò)使用HasKey方法得知鍵依然存在, 而且鍵也會(huì)出現(xiàn)在for循環(huán)中. (我們一會(huì)再解釋 For 循環(huán)) -
刪除法
RemovedValue := MyObject.Delete(AnyKey)這和接下來(lái)的方法將刪除鍵 和 值.MyObject[AnyKey]先前的值將存儲(chǔ)在 RemovedValue 中.NumberOfRemovedKeys := MyObject.Delete(FirstKey, LastKey)允許你刪除 FirstKey 和 LastKey 之間的一系列的編號(hào)/整數(shù)或字符串鍵. 它給出的值將是被刪除的鍵的數(shù)量, 如果你的鍵之間有間隙, 這是有用的(例如你指定鍵從 1 到 4, 但是鍵 2 不存在, 這將設(shè)置 NumberOfRemovedKeys 為 3, 因?yàn)橹挥腥齻€(gè)鍵被移除). -
Pop(拋出) 法
MyObject.Pop()這將刪除最高的整數(shù)鍵, 并返回這個(gè)鍵對(duì)應(yīng)的值. 而且這種形式不會(huì)影響其它鍵的索引順序(因?yàn)闆](méi)有比它更高的序列了). -
RemoveAt(在..刪除) 方法
RemovedValue := MyObject.RemoveAt(Index)``NumberOfRemovedKeys := MyObject.RemoveAt(Index, Length)這將移除從 Index 到 Index + Length - 1(包含) 之間的所有鍵(例如 Index 為 5, Length 為 3, 則將刪除鍵 5, 6, 7 這三個(gè)鍵). 如果 Length 省略則默認(rèn)為 1. 移除這些鍵之后, 更高數(shù)字或整數(shù)的鍵將向下填充空缺, 所以如果有個(gè)值位于 Index + Length 那么它現(xiàn)在的位置就是 Index. 這很像 InsertAt 方法操作多個(gè)指定值的操作.
8 - 其它有用的東西
親愛(ài)的朋友, 當(dāng)你閱讀到這里, 說(shuō)明快要結(jié)束我們這段旅程了. 我希望你有所收獲. 最后, 我將告訴你一些我認(rèn)為你可能有用的東西. 希望你過(guò)的愉快!
a. 神秘的 [ ]
在幫助文檔中, 你可能會(huì)發(fā)現(xiàn)有兩個(gè)符號(hào)([ 和 ]) 經(jīng)常出現(xiàn)在幾乎每一頁(yè)開(kāi)頭的黃色代碼框中. 方括號(hào)中的內(nèi)容代表可選的. 也就是說(shuō), 如果你不需要這些參數(shù)你完全可以不管它. 不過(guò)要強(qiáng)調(diào)一點(diǎn), 當(dāng)你在寫(xiě)代碼時(shí), 千萬(wàn)不要把 [ ] 也寫(xiě)上了.
p>例如, 在 ControlGetText命令頁(yè)面, 你可能會(huì)看到這段代碼:
ControlGetText, OutputVar , Control, WinTitle, WinText, ExcludeTitle, ExcludeText
所以你可以簡(jiǎn)單的寫(xiě)成這樣:
ControlGetText, OutputVar
或者再加上一些細(xì)節(jié):
ControlGetText, OutputVar, Control, WinTitle
如果你想只使用參數(shù) ExcludeTitle 而不想使用參數(shù) WinText 或 WinTitle, 怎么辦? 很簡(jiǎn)單!
ControlGetText, OutputVar, Control,,, ExcludeTitle
請(qǐng)注意, 你不能忽略參數(shù), 只是需要將它們的位置留空. 如果你像下面這樣忽略 WinTitle, WinText, 將會(huì)產(chǎn)生錯(cuò)誤:
ControlGetText, OutputVar, Control, ExcludeTitle
b. 查找你的 AHK 版本
你可以運(yùn)行下面的代碼來(lái)查看你的 AHK 版本信息:
MsgBox, %A_AhkVersion%
你也可以到開(kāi)始菜單或安裝路徑下的幫助文件(即本文) 中去找.
c. 嘗試與錯(cuò)誤
嘗試和錯(cuò)誤是非常普遍而高效的學(xué)習(xí)方法. 與動(dòng)不動(dòng)就問(wèn)這問(wèn)那相比, 有時(shí)候花點(diǎn)時(shí)間(也許是長(zhǎng)年累月) 親手嘗試可能會(huì)學(xué)的更快.
如果你在嘗試新東西的過(guò)程碰到錯(cuò)誤, 不要緊, 就從解決這個(gè)錯(cuò)誤開(kāi)始. 嘗試解決這個(gè)錯(cuò)誤, 一次不行就兩次. 多次嘗試后還是解決不了, 可以打開(kāi)幫助文件學(xué)習(xí)哪些能做哪些不能做, 然后修改你的代碼再試試. 試試, 失敗, 試試, 失敗, 試試, 試試, 再試試, 失敗, 失敗, 成功!
這也是很多大師們的學(xué)習(xí)經(jīng)歷. 不過(guò)也不要害怕提問(wèn), 我們不會(huì)咬人(至少不會(huì)咬的太狠). 學(xué)習(xí)總需要時(shí)間慢慢積累, 大師也不是一天練成的.
"若最初你沒(méi)有成功, 努力, 努力, 不斷的努力." - 威廉 · 愛(ài)德華 · ??松?
d. 縮進(jìn)
縮進(jìn)這個(gè)事非常重要! 你的代碼沒(méi)有它也能正常運(yùn)行, 可是如果沒(méi)有縮進(jìn)會(huì)讓閱讀代碼變成一件非常痛苦的事. 也許一小段代碼(少于 25 行) 不用縮進(jìn)也沒(méi)有太大關(guān)系, 但是代碼一旦增多, 縮進(jìn)就非常有必要. 所以, 學(xué)習(xí)使用縮進(jìn)越快越好. 縮進(jìn)沒(méi)有固定的風(fēng)格, 但最好保持一種風(fēng)格.
"什么是縮進(jìn)?" 你可能會(huì)問(wèn)? 簡(jiǎn)單的說(shuō)就是在代碼和頁(yè)面邊界保留一段距離, 這樣可以區(qū)分這一段代碼是屬于哪一段代碼. 有些人習(xí)慣使用 3, 4 個(gè)空格或 1 個(gè) tab 來(lái)表示縮進(jìn), 每一級(jí)用一次縮進(jìn).
不用縮進(jìn):
if (car="old")
{
MsgBox, The car is really old.
if (wheels = "flat")
{
MsgBox, This car is not safe to drive.
Return
}
else
{
MsgBox, Be careful! This old car will be dangerous to drive.
}
}
else
{
MsgBox, My`, what a shiny new vehicle you have there.
}
使用縮進(jìn):
if (car="old")
{
MsgBox, The car is really old
if (wheels = "flat")
{
MsgBox, This car is not safe to drive.
Return
}
else
{
MsgBox, Be careful! This old car will be dangerous to drive.
}
}
else
{
MsgBox, My`, what a shiny new vehicle you have there.
}
關(guān)于縮進(jìn), 維基百科上縮進(jìn)樣式頁(yè)面有很多風(fēng)格示例. 建議選一種你喜歡的或你認(rèn)為最容易閱讀的風(fēng)格來(lái)學(xué)習(xí).