字串
a = test1b := "test2"
- Traditional 就是寫什麼是什麼(但忽略開頭的空白)
- Expression 的話就是要有一對雙引號 " 夾住字串,相當於要從雙引號中取出字串
a = add
b = test%a%
c := "test" . a
- Traditional 字串串接變數要用兩個 % 把變數的值先取出
- Expression 的話可以用一個點 . 或一個空白鍵相隔,就是字串串接
a = c
bc = test
d := b%a%
- 前兩個 traditional 很直覺,但第三行是什麼? %a% 是對 a 取值,所以是 c 這個字,右邊就是 bc,因為是 expression 所以要對 bc 取值,所以 d 的值也是 test
流程控制
if a > 2
c = 1
else if a = b
c = 2
- Traditional 模式,運算元左邊視為變數,運算元右邊視為普通文字,所以第一行會取出 a 的值,如果比 2 大則為 true。第三行右邊的 b 就只是一個 b,a 的值如果就是 b 這個字的話會是 true
if (a>b)
c = 1
else if StrLen(a)
c = 2
- 如果 if 之後接的是括號、函數呼叫或是運算元 ! 或 not,則視為 expression。第一行會比較 a 的值以及 b 的值,而第三行當然是呼叫 StrLen 函數,而不是視為 StrLen 這幾個文字
Command & Function
MsgBox,,,test,MsgBox,,,% "test" var1 var2
MsgBox,test
MsgBox % var
MsgBox % var%a%
- 以 MsgBox 這個典型的 command 來說,最左邊是 command 的名稱,右邊以逗點分隔參數,參數區預設為 traditional 模式,所以可以空著不寫,AutoHotkey 會幫你填入最常用的預設值
- 如果某一個參數之後就全部空著,那麼連逗號都不必寫,全部空掉也可以
- 第二行的第三個參數先一個%再接一個空格(或tab),表示這個參數變成 expression 模式,可以自由串接變數
- 第三、四、五行僅限於部分 command,只用第一個參數代表省略其他的參數,一樣也區分 traditional 或 expression 模式
SubStr( var, 1, 2)
SubStr( var%a%, 1, 2)
SubStr( "test", 2)
SubStr( "test", 2, )
- Function 是以 function 名稱加上一對小括號,參數也是以逗號分隔但只限expression模式。
- 空的參數應該要以 "" 表示,或者就不要有逗號,第三行是錯誤示範
常見陷阱
- 因為 AutoHotkey 不用宣告變數類別,所以數字類的值有可能是字串,也可能是數字(整數、小數等)
- a 是 01 的字串
- b 牽涉到數學運算,所以變成數字 1
- c 牽涉到字串串接,所以又變為 01 字串
- 在 AutoHotkey_L 版本可以用到object類的陣列,如果key是像數字的字串,會自動被轉成數字,所以 r[a] 事實上變成 r[1] 而不是 r["01"] 也不是 r["1"],除非指定 r["" a] 才是 r["01"]
- if 之後如果有兩行以下則要用大括號 { } 包起來,但如果 if 是traditional模式,事實上第一行被視為 a 的值是不是 2 { 這個字串,也就是 { 被誤解了。所以原本的 } 就會被 AutoHotkey 解讀為多出來的,而這個 if 影響的只有 c=1 不包括 d=1 (因為根本沒有大括號包起來)
- 第二個 if 是 expression 模式,而且很有效率順便給 a 變數一個值。可是 := 這個運算元的優先順序是很低的,a 的值會變成 (c+1) && (d>0) 整串的結果,而不是 c+1