變數和表達式- AutoHotKey.tw - Google Sites
文章推薦指數: 80 %
變數的類型: AutoHotkey 中沒有明確的變數型別. 然而, 只包含數字(可以含有小數點) ... 給變數賦值: 要把字串或數字儲存到變數中, 有兩種方法: 傳統方法和表達式方法.
首頁簡介變數和表達式函數命令和函數索引{...}(區塊)物件AutoTrimBlockInputBreakCatchClickClipWaitComObjActiveComObjArray()ComObjConnectComObjCreateMsgBoxVar:=expression翻譯詞彙表編輯討論協作平台地圖
變數和表達式
變數和表達式
目錄
變數
表達式
表達式中的運算子
內建變數
環境變數與普通變數
變數的容量和佔用記憶體
變數
變數的類型:AutoHotkey中沒有明確的變數型別.然而,只包含數字(可以含有小數點)的變數進行數學運算或比較時,會被自動轉換為數值.(為了提高性能,在內部會對數字進行快取以避免與字串之間的轉換.)
變數的作用域和宣告:除了函數中的區域變數,其他所有變數都是全域的;即可以在腳本的任意位置讀取或修改它們的內容.除了在函數頁面註明的情況,變數都是不需要宣告的;使用它們的時候它們就產生了(每個變數初始為空).
變數的名稱:變數名不區分大小寫(例如,CurrentDate等同於currentdate).變數名可以含有多達253個字元,並且可以由字母,數字以及後面的標點組成:#_@$
考慮到命名的慣例,通常在命名變數時最好僅使用字母,數字和下劃線(例如:CursorPosition,Total_Items和entry_is_valid).這樣的風格可以讓熟悉其他計算機語言的人更容易理解您的腳本.而且,如果您在AutoHotkey和其他語言中使用相同的風格,您會發現能更容易重新讀懂自己的腳本.
儘管變數名可以完全由數字組成,但通常這樣的名稱僅用於傳入的命令列參數.這樣數值名稱的變數不能用在表達式中,因為它們會被看成是數字而不是變數.
因為單詞AND,OR和NOT作為表達式的運算子使用,所以通常不應該把它們用作變數名稱.在表達式中使用這樣的名稱會無法正確計算.
給變數賦值:要把字串或數字儲存到變數中,有兩種方法:傳統方法和表達式方法.傳統方法使用等號運算子(=)來指定沒有加引號的原義字串或包圍在百分號中的變數.例如:
MyNumber=123
MyString=Thisisaliteralstring.
CopyOfVar=%Var%;和=運算子一起使用時,需要使用百分號來獲取變數的內容.
與之相比,表達式方法使用冒號等號運算子(:=)來儲存數字,加引號的字串和其他類型的表達式.下面的例子在功能上與前面的例子相同:
MyNumber:=123
MyString:="Thisisaliteralstring."
CopyOfVar:=Var;和前面段落中與其作用相同的語句不同,百分號不和:=運算子一起使用.
後一種方法由於其更清晰並且與其他許多語言幾乎一致的表達式語法成為大多數人的首選方法.
從上面的例子中您可能已經想到了有兩種方法來清除變數的內容(即讓變數為空):
MyVar=
MyVar:=""
上面的這對空引號只能和:=運算子一起使用,因為和=運算子一起使用時,則會在變數中儲存兩個原義的引號字元.
獲取變數的內容:如同賦值有兩種方法,獲取變數的內容也有兩種方法:傳統方法和表達式方法.傳統方法需要將變數名包圍在百分號中來獲取變數的內容.例如:
MsgBoxThevalueinthevariablenamedVaris%Var%.
CopyOfVar=%Var%
與之相比,表達式方法省去了變數名兩邊的百分號,但原義的字串必須包圍在雙引號中.所以,下面的表達式作用等同於上面的例子:
MsgBox%"ThevalueinthevariablenamedVaris".Var.".";使用句點連接兩個字串.
CopyOfVar:=Var
在上面的MsgBox這行,通過使用百分號和空格把參數從傳統模式改變為表達式模式.因為所有的命令預設情況下使用傳統模式(除了另外註明的那些),所以這是必須的.不過,某些命令的特定參數已註明接受表達式,此時前導的百分號可以省略.例如,下面的所有語句都是等效的,因為Sleep的首個參數可以是表達式:
SleepMillisecondsToWait
Sleep%MillisecondsToWait%
Sleep%MillisecondsToWait
變數的比較:請閱讀下面表達式部分中關於不同類型變數比較的重要提示,尤其是關於何時使用小括號的內容.
表達式
表達式用來對一系列變數,原義字串和/或原義數字執行一個或多個操作.
表達式中的變數名稱不用包圍在百分號中(除了陣列和其他的雙重參考).所以,為了與變數區別,原義的字串必須用雙引號包圍.例如:
if(CurrentSetting>100orFoundColor<>"Blue")
MsgBoxThesettingistoohighorthewrongcolorispresent.
在上面的例子中,因為"Blue"是原義字串,所以包圍在雙引號中.要在原義字串中包含真實的引號字元,請使用兩個連續的引號,如同此例中的兩次演示:"Shesaid,""Anappleaday."""
重要說明:含有表達式的if語句與傳統的if語句例如IfFoundColor<>Blue可以通過單詞"if"後是否有小括號來區分.儘管通常把整個表達式包圍在括號中,不過也可以寫成這樣:if(x>0)and(y>0).此外,如果單詞"if"後的第一項為函數呼叫或類似"not"或"!"這樣的運算子時,小括號可以完全省略.
空字串:要在表達式中使用空字串,請使用一對空引號.例如,當MyVar非空時語句if(MyVar<>"")的結果為真.然而,在傳統if語句中,一對空引號會被視為原義的字串.例如,當MyVar僅包含一對真實的引號時語句ifMyVar=""結果為真.因此,要使用傳統的if語句判斷變數是否為空,則需要讓=或<>的右側為空,例如:ifVar=
相關提示,任何無效的表達式例如(x+*3)會產生空字串.
儲存表達式的結果:要把結果指定給變數,請使用:=運算子.例如:
NetPrice:=Price*(1-Discount/100)
真假值:要計算表達式結果為真還是假時(例如IF語句),表達式結果為空或零被視為假,而其他所有結果都視為真.例如,僅當ItemCount為空或0時"ifItemCount"的結果才為假.類似地,表達式"ifnotItemCount"將產生相反的結果.
像NOT/AND/OR/>/=/5orFoundIt
如上面提示的那樣,簡單地置空變數或為其指定為0可以讓它假值.利用這種特性,可以使用簡寫語句"ifDone"來檢查變數Done是真還是假.
單詞true和false是值分別為1和0的內建變數.使用它們可以增加腳本的可讀性,例如:
CaseSensitive:=false
ContinueSearch:=true
整數和浮點數:在表達式中,含有小數點的數字被視為浮點數;否則視為整數.對於大多數運算子(例如加法和乘法),只要其中的一個輸入是浮點數,那麼結果也將是浮點數。
不論在表達式中還是在表達式外的其他地方,整數都可以表示成十六進制或十進制.十六進制數必須以前綴0x開頭.例如,Sleep0xFF等同於Sleep255.在v1.0.46.11+,可以識別用科學計數法表示的浮點數;但只有在它們含有小數點時才行(例如1.0e4和-2.1E-4).
強制使用表達式:通過在表達式前加上百分號和空格或tab,能把表達式用在不直接支援表達式的參數中(除了像StringLen的OutputVar和InputVar的那些參數).這種技巧常用來存取陣列.例如:
FileAppend,%MyArray%i%,MyFile.txt
MsgBox%"ThevariableMyVarcontains".MyVar."."
Loop%Iterations+1
WinSet,Transparent,%X+100
Control,Choose,%CurrentSelection-1
表達式中的運算子
優先順序相同的運算子例如乘(*)和除(/)按從左到右的順序計算,下面另行註明的除外.與之相比,低優先順序的運算子例如加(+)在更高優先順序的運算子例如(*)之後計算.例如,3+2*2等價於3+(2*2).使用括號可以改變優先順序,例如:(3+2)*2
除了下面註明的情況,其他時候在數學運算中包含的任何空值(空字串)都不會被假定為零.作為替代,它會被視為錯誤,這將導致那部分表達式的計算結果為空字串.例如,如果變數X為空,那麼表達式X+1會產生空值而不是1.
表達式運算子(按優先順序降序排列)
%Var%
如果表達式中的變數包圍在百分號中(例如%Var%),不管此變數包含什麼內容都會被假定為另一個變數(如果不存在這樣的變數,那麼%Var%會被解析為空字串)的名稱或部分名稱.這種方法常用來參考偽陣列元素,例如:
Var:=MyArray%A_Index%+100
為了向下相容,註明了"可以使用表達式"的命令參數把百分號中的孤立名稱(例如%Var%,但不是Array%i%)當作其兩邊的百分號不存在一樣.通過把引號包圍在括號中可以避免這種情況;例如Sleep(%Var%)
[AHK_L52+]:除了普通變數,%Var%還可以解析為環境變數,剪貼簿或任何的保留/唯讀的變數.在修訂號52之前,在這些情況中%Var%會被當成空字串.
x.y
[AHK_L31+]:物件存取.從物件x中取值或為其存入值或呼叫其方法,此處y是個原義值.請參閱物件語法.
++
--
前置和後置的自增/自減.從變數中增加或減去1(但在1.0.46之前的版本中,只有把它們放在一行中才能用;此行中不能使用其他運算子).運算子可以放在變數名的前面或後面.如果放在變數名的前面,會立即執行運算並把結果用於後面的運算.例如,Var:=++X讓X自增後才把它的值賦給Var.相反地,如果運算子放在變數名的後面,在後面的運算使用了變數之後才對其進行自增運算.例如,Var:=X++把X的目前值賦給Var後才進行自增.由於向下相容性,僅當空變數在單獨一行時運算子++和--才把它們視為零;例如,y:=1,++x和MsgBox%++x當x為空時結果都為空.
**
冪.底數和指數都可以為小數.如果指數為負數,即使底數和指數都為整數,結果也會被格式化為浮點數.因為**的優先順序高於一元負號,所以-2**2的計算過程和-(2**2)一樣且得到結果-4.因此,要讓負號的優先順序高於冪運算,需要把它們包圍在括號中,例如(-2)**2.注意:不支援底數為負數且指數為分數的情況,例如(-2)**0.5;它會產生空字串.但(-2)**2和(-2)**2.0都是支援的.
-
!
~
&*
一元負號(-):儘管它和減運算子使用相同的符號,但一元負號僅應用於單項或子表達式,如此例中的兩次演示:-(3/-x).相關提示,表達式中的任何一元正號(+)都會被忽略.
邏輯非(!):如果運算元為空或0,那麼邏輯非的結果為1,這表示"真".否則,結果為0(假).例如:!xor!(yandz).注意:單詞NOT和!含義相同,但!優先順序更高.在v1.0.46+,允許使用連續的一元運算子,例如!!Var,因為它們是按從右到左的順序計算.
位元補數(~):此運算子對運算元作位元反相運算(或稱作1的補數運算),也就是說,在結果中,每一個0的位元會設為1,而每一個1的位元會設為0.如果運算元為浮點數,則在計算前把它截取成整數.如果運算元介於0和4294967295(0xffffffff)之間,那麼它會被視為無符號的32位值.否則,它被視為有符號的64位值.例如,~0xf0f計算結果為0xfffff0f0(4294963440).
取址(&):&MyVar獲取MyVar的內容的記憶體地址,此地址一般和DllCall結構一起使用.同時&MyVar也停用了此變數中的二進制數的快取,如果它經常用於數學或數值比較,那麼這會拖慢其性能.每當變數的地址改變時會重新啟用它的快取(例如使用VarSetCapacity()).
取值(*):*Expression假定Expression解析為數值的記憶體地址;它會獲取在一個介於0和255之間的數字表示的記憶體地址中一個位元組的內容(地址為0時獲取的結果也總是0;但應該避免使用其他任何無效地址,因為它可能會讓腳本崩潰).然而,使用NumGet()獲取二進制數通常會更好.
*
/
//
乘(*):如果兩個輸入都為整數,則結果為整數;否則結果為浮點數.
真除(/):與EnvDiv不同,即使兩個輸入都是整數,真除的結果也為浮點數.例如,3/2結果為1.5而不是1,而4/2結果為2.0而不是2.
取整除法(//):如果兩個輸入都是整數,那麼雙斜線運算子使用高效的整數除法.例如,5//3結果為1而5//-3結果為-1.如果任何一個輸入為浮點數,則執行浮點除法並把結果往下取整到最近的整數.例如,5//3.0結果為1.0而5.0//-3結果為-2.0.儘管浮點除法的結果為整數,但它被儲存為浮點格式,以便其他使用者能使用浮點格式.關於求模運算,請參閱mod().
*=和/=運算子是用變數的值乘以或除以另一個值的一種簡寫形式.例如,Var*=2和Var:=Var*2會得到相同的結果(不過前者執行的更好).
除數為零時結果為空(空字串).
+
-
加(+)和減(-).相關提示,+=和-=運算子是從變數中增加或減少值的一種簡寫形式.例如,Var+=2和Var:=Var+2會得到相同的結果(不過前者執行的更好).同樣地,使用Var++,Var--,++Var或--Var可以讓變數增加或減小1.
<<
>>
位元左移(<>).用法示例:Value1<
如果某個輸入不是數字,則按字母順序比較(加了引號的原義字串例如"55"在這種情況中總是被當成是非數值的).僅當StringCaseSense開啟時,比較才區分大小寫.另請參閱:Sort
=
==
<>!=
等號(=),區分大小寫等於(==)和不等於(<>或!=).運算子!=和<>功能完全相同.當兩個輸入都是數字時,運算子==和=是一樣的,當某個輸入不是數字時,==總是區分大小寫,而=總是不區分大小寫(不區分大小寫的方法由StringCaseSense決定).與之相比,<>和!=都遵循StringCaseSense.注意:加了引號的字串例如"55"在這種情況下總是被當成非數值的.
NOT
邏輯非.除了優先順序較低外,其他的與!運算子相同.例如,not(x=3ory=3)等同於!(x=3ory=3)
AND
&&
這兩個運算子都是邏輯且.例如:x>3andx<10.要提高性能,則要應用求值最佳化.此外,以AND/OR/&&/||(或其他任何運算子)開始的行會自動附加到前一行的末尾.
OR
||
這兩個運算子都是邏輯或.例如:x<=3orx>=10.要提高性能,則要應用求值最佳化.
?:
三元運算子[v1.0.46+].此運算子是if-else語句的簡寫形式.它計算左側的條件來決定兩個分支中哪個作為最終結果.例如,var:=x>y?2:3,當x大於y時儲存2到Var;否則儲存3.為了提高性能,只計算決定性的分支(請參閱求值最佳化).注意:由於相容性的原因,此運算子中問號的兩邊必須至少有一個空格(此問題可能會在未來的版本中結果).
:=
+=
-=
*=
/=
//=
.=
|=
&=
^=
>>=
<<=
指定.對變數的內容進行運算,然後把結果儲存到同一個變數中(但在1.0.46之前的版本中,這些運算子只能在一行中最左邊使用,且僅支援前五個運算子).最簡單的指定運算子為冒號等號(:=),它把表達式的結果儲存到變數中.關於其他運算子的功能說明,請參閱這個表格中它們的相關條目.例如,Var//=2執行取整除法,把Var除以2,然後把結果儲存回Var.同樣地,Var.="abc"為Var:=Var."abc"的一種簡寫形式.
與其他大多數運算子不同,指定運算是從右往左執行的.因此,Var1:=Var2:=0這個語句中首先把0賦值給Var2,然後把Var2賦值給Var1.
如果使用指定運算的結果作為其他某些運算子的輸出,那麼輸入的值是變數自身.例如,如果變數Var新增值後大於50,那麼表達式(Var+=2)>50結果為真.這也允許賦值被作為ByRef傳遞,或獲取它的地址;例如:&(x:="abc").
需要避免語法錯誤或提供更直觀的操作時,會自動提升指定運算子的優先順序.例如:notx:=y等價於not(x:=y).同樣地,++Var:=X等價於++(Var:=X);而Z>0?X:=2:Y:=2等價於Z>0?(X:=2):(Y:=2)
由向下相容引起的已知限制(可能會在未來的版本中解決):1)當/=為表達式中最左邊的運算子並且它不是多語句表達式的一部分時,而且輸入都不是浮點數時,它會執行取整除法(在其他所有情況中,/=會執行真除);2)僅當+=和-=為一行中最左邊的運算子時,它們才支援日期/時間的計算;3)運算子+=,-=和*=僅在空變數在單獨一行時才把它們視為零;例如,y:=1,x+=1和MsgBox%x-=3當x為空時都得到空的結果.
,
逗號(多語句)[v1.0.46+].逗號可以用來在單行中書寫多個子表達式.最常用於把多個指定運算或函數呼叫聚集在一起.例如:x:=1,y+=2,++index,func().這樣的語句按從左到右的順序執行.注意:以逗號(或其他任何運算子)開始的行會自動附加到前一行的末尾.另請參閱:逗號的性能.
在v1.0.46.01+,當逗號後緊跟著變數和等號時,則這個等號會被自動當成指定運算子(:=).例如,後面所有的都是指定運算:x:=1,y=2,a=b=c
mod()
round()
abs()
這些和其他內建數學函數在這裡闡述.
func.()
[AHK_L48+]:試圖呼叫物件func的命名的空方法.按照約定,這是物件的"預設"方法.如果func不是物件,則呼叫預設基底物件.
[v1.0.95+]:如果func為函數名,則呼叫這個命名的函數.
F(p*)
[AHK_L60+]:請參閱可變參數函數.
x[y]
[AHK_L31+]:物件存取.從物件x中取值或為其存入值或呼叫其方法,這裡的y是參數列表或計算方法名.請參閱陣列語法和物件語法.
性能:在v1.0.48+,使用逗號運算子常常比分開寫單獨的表達式速度更快,尤其是把一個變數的值賦給另一個變數時(例如x:=y,a:=b).當越多的表達式聯合成單個表達式時,性能會持續得到提升;例如,把五個或十個簡單的表達式聯合成單個表達式速度可能提升35%.
內建變數
下列變數內建於程式中,可以在任何腳本中參考.除了Clipboard,ErrorLevel和命令列參數,其他變數都是唯讀的;即它們的內容無法在腳本中直接修改.
目錄
特殊字元:A_Space,A_Tab
腳本屬性:命令列參數,A_WorkingDir,A_ScriptDir,A_ScriptName,(...更多...)
日期和時間:A_YYYY,A_MM,A_DD,A_Hour,A_Min,A_Sec,(...更多...)
腳本設定:A_IsSuspended,A_BatchLines,A_TitleMatchMode,(...更多...)
使用者閒置時間:A_TimeIdle,A_TimeIdlePhysical
GUI視窗和選單列:A_Gui,A_GuiControl,A_GuiEvent,A_EventInfo
熱鍵,熱字串和自訂選單項目:A_ThisHotkey,A_EndChar,A_ThisMenuItem,(...更多...)
作業系統和使用者資訊:A_OSVersion,A_ScreenWidth,A_ScreenHeight,(...更多...)
雜項:A_Cursor,A_CaretX,A_CaretY,Clipboard,ClipboardAll,ErrorLevel
迴圈:A_Index,(...更多...)
特殊字元
A_Space
此變數包含單個空格字元.請參閱AutoTrim瞭解詳情.
A_Tab
此變數包含單個tab字元.請參閱AutoTrim瞭解詳情.
腳本屬性
1,2,3等
每當啟動帶命令列參數的腳本時,會自動建立這些變數.可以像普通變數一樣修改和參考它們(例如:%1%).變數%0%包含了命令列參數的數目(如果沒有則為0).需瞭解詳情請參閱命令列參數.
A_WorkingDir
腳本目前工作目錄,這是腳本存取文件的預設路徑.除非是根目錄,否則路徑末尾不包含反斜線.兩個示例:C:\和C:\MyDocuments.使用SetWorkingDir可以改變目前工作目錄.
A_ScriptDir
目前腳本所在目錄的絕對路徑.為了向下相容AutoItv2,只為.aut腳本包含路徑末尾的反斜線(甚至根目錄也是如此).對應於.aut腳本的一個示例是C:\MyDocuments\
A_ScriptName
目前腳本的檔名稱,不含路徑,例如MyScript.ahk.
A_ScriptFullPath
上面兩個變數的組合,包含了目前腳本的完整路徑和名稱,例如C:\MyDocuments\MyScript.ahk
A_ScriptHwnd
[v1.1.01+]
腳本隱藏主視窗的唯一ID(HWND/控制代碼).
A_LineNumber
目前腳本中正在執行的行所在的行號(或其#Include文件的行號).這個行號與ListLines顯示的一致;它可以用在報告錯誤的時候,例如:MsgBoxCouldnotwritetologfile(linenumber%A_LineNumber%).
由於已編譯腳本已經把它所有的#Include文件合併成一個大腳本,所以它的行號可能與它在未編譯模式執行時不一樣.
A_LineFile
A_LineNumber所屬文件的完整路徑和名稱,除非目前行屬於未編譯腳本的某個#Include文件,否則它將和A_ScriptFullPath相同.
A_ThisFunc
[v1.0.46.16+]
目前正在執行的自訂函數的名稱(沒有則為空);例如:MyFunction.另請參閱:IsFunc()
A_ThisLabel
[v1.0.46.16+]
目前正在執行的標籤(子程式)的名稱(沒有則為空);例如:MyLabel.每當腳本執行Gosub/Return或Goto時會更新此變數的值.執行自動呼叫的標籤例如計時器,GUI執行緒,選單項目,熱鍵,熱字串,OnClipboardChange和OnExit時也會更新此變數的值.不過,當執行從前面的語句"進入"一個標籤時A_ThisLabel的值不會更新,即此時A_ThisLabel還是保持原來的值.另請參閱:A_ThisHotkey和IsLabel()
A_AhkVersion
在1.0.22之前的版本,此變數為空.否則,它包含了執行目前腳本的AutoHotkey主程式的版本號,例如1.0.22.在已編譯腳本中,它包含了原來編譯時使用的主程式的版本號.格式化的版本號使得腳本可以使用>或>=來檢查A_AhkVersion是否大於某個最小的版本號,例如:ifA_AhkVersion>=1.0.25.07
A_AhkPath
對於未編譯腳本:實際執行目前腳本的EXE文件的完整路徑和名稱.例如:C:\ProgramFiles\AutoHotkey\AutoHotkey.exe
對於已編譯腳本:除了通過登錄檔條目HKEY_LOCAL_MACHINE\SOFTWARE\AutoHotkey\InstallDir獲取AutoHotkey目錄外,其他的和上面相同.如果找不到這個登錄檔條目,則A_AhkPath為空.
A_IsUnicode
當字串為Unicode(16位)時值為1,字串為ANSI(8位)時為空字串(這會被視為false).字串的格式取決於用來執行目前腳本的AutoHotkey.exe,如果為已編譯腳本,則取決於用來編譯它的主程式.
A_IsCompiled
如果目前執行的腳本為已編譯EXE時此變數值為1,否則為空字串(這會被視為false).
A_ExitReason
最近一次要求腳本終止的原因.除非腳本含有OnExit子程式並且此子程式目前正在執行或被退出嘗試至少呼叫過一次,否則此變數為空.請參閱OnExit瞭解詳情.
日期和時間
A_YYYY
4位數表示的目前年份(例如2004).與A_Year含義相同.注意:要獲取符合您區域設定和語言的格式化時間或日期,請使用"FormatTime,OutputVar"(時間和長日期)或"FormatTime,OutputVar,,LongDate"(獲取長格式日期).
A_MM
2位數表示的目前月份(01-12).與A_Mon含義相同.
A_DD
2位數表示的目前月份的日期(01-31).與A_MDay含義相同.
A_MMMM
使用目前使用者語言表示的目前月份的全稱,例如July
A_MMM
使用目前使用者語言表示的目前月份的簡稱,例如Jul
A_DDDD
使用目前使用者語言表示的目前星期幾的全稱,例如Sunday
A_DDD
使用目前使用者語言表示的目前星期幾的3個字母的簡稱,例如Sun
A_WDay
1位數表示的目前星期經過的天數(1-7).在所有區域設定中1都表示星期天.
A_YDay
目前年份中經過的天數(1-366).不會使用零對變數的值進行填充,例如會獲取到9,而不是009.要對變數的值進行零填充,請使用:FormatTime,OutputVar,,YDay0
A_YWeek
符合ISO8601標準的目前的年份和週數(例如200453).要分離年份和週數,請使用StringLeft,Year,A_YWeek,4和StringRight,Week,A_YWeek,2.A_YWeek的準確定義為:如果含有1月1日的星期有四天以上在新年裡,則它被認為是新年的第一個星期.否則,它為前一年的最後一個星期,而下一星期為新年的第一星期.
A_Hour
在24小時制(例如,17表示5pm)中2位數表示的目前小時數(00-23).要獲取帶AM/PM提示的12小時制的時間,請參照此例:FormatTime,OutputVar,,h:mm:sstt
A_Min
2位數表示的目前分鐘數(00-59).
A_Sec
2位數表示的目前秒數(00-59).
A_MSec
3位數表示的目前毫秒數(000-999).要移除前導零,請參照此例:Milliseconds:=A_MSec+0
A_Now
YYYYMMDDHH24MISS格式的目前本地時間.注意:使用EnvAdd和EnvSub可以對日期和時間進行計算.此外,使用FormatTime可以根據您的區域設定或選項來格式化日期和/或時間.
A_NowUTC
YYYYMMDDHH24MISS格式的目前的協調世界時(UTC).UTC本質上和格林威治標準時間(GMT)一致.
A_TickCount
計算機重啟後經過的毫秒數.通過把A_TickCount儲存到變數中,經過一段時間後從最近的A_TickCount值中減去那個變數,可以計算出所經過的時間.例如:
StartTime:=A_TickCount
Sleep,1000
ElapsedTime:=A_TickCount-StartTime
MsgBox,%ElapsedTime%millisecondshaveelapsed.
如果您需要比A_TickCount的10ms更高的精確度,請使用QueryPerformanceCounter().
腳本設定
A_IsSuspended
當腳本擱置時值為1,否則為0.
A_IsPaused
[v1.0.48+]
當緊隨目前執行緒的執行緒被暫停時值為1.否則為0.
A_IsCritical
[v1.0.48+]
目前執行緒的Critical設定關閉時值為0.否則它包含大於零的整數,即Critical使用的訊息檢查頻率.因為"Critical0"關閉了目前執行緒的關鍵性,所以Critical的目前狀態可以這樣來儲存和恢復:Old_IsCritical:=A_IsCritical,後來執行Critical%Old_IsCritical%
A_BatchLines
(同義於A_NumBatchLines)由SetBatchLines設定的目前值.例如:200或10ms(取決於格式).
A_TitleMatchMode
由SetTitleMatchMode設定的目前模式:1,2,3或RegEx.
A_TitleMatchModeSpeed
由SetTitleMatchMode設定的目前匹配速度(fast或slow).
A_DetectHiddenWindows
由DetectHiddenWindows設定的目前模式(On或Off).
A_DetectHiddenText
由DetectHiddenText設定的目前模式(On或Off).
A_AutoTrim
由AutoTrim設定的目前模式(On或Off).
A_StringCaseSense
由StringCaseSense設定的目前模式(On,Off或Locale).
A_FileEncoding
[AHK_L46+]包含了多個命令使用的預設編碼;請參閱FileEncoding.
A_FormatInteger
由SetFormat設定的目前整數格式(H或D).[AHK_L42+]:此變數還可能為小寫字母h.
A_FormatFloat
由SetFormat設定的目前浮點數格式.
A_KeyDelay
由SetKeyDelay設定的目前延遲(總是十進制數,不是十六進制).此延遲適用於傳統的SendEvent模式,不適用於SendPlay.
A_WinDelay
由SetWinDelay設定的目前延遲(總是十進制數,不是十六進制).
A_ControlDelay
由SetControlDelay設定的目前延遲(總是十進制數,不是十六進制).
A_MouseDelay
由SetMouseDelay設定的目前延遲(總是十進制數,不是十六進制).此延遲適用於傳統的SendEvent模式,不適用於SendPlay.
A_DefaultMouseSpeed
由SetDefaultMouseSpeed設定的目前速度(總是十進制數,不是十六進制).
A_RegView
[v1.1.08+]:由SetRegView設定的目前登錄檔檢視。
A_IconHidden
系統列圖示目前隱藏時值為1,否則為0.此圖示可以使用#NoTrayIcon或Menu命令進行隱藏.
A_IconTip
如果使用Menu,Tray,Tip為系統列圖示指定了自訂的工具提示時,變數的值為這個提示的文本;否則為空.
A_IconFile
如果使用Menu,tray,icon指定了自訂的系統列圖示時,變數的值為圖示檔案的完整路徑和名稱;否則為空.已知限制:如果腳本原來傳遞相對路徑給系統的DLL,那麼此變數中的路徑可能不正確;例如,Menu,Tray,Icon,user32.dll,2.
A_IconNumber
當A_IconFile為空時此變數為空.否則,它的值為A_IconFile中的圖示編號(通常為1).
使用者閒置時間
A_TimeIdle
從系統最後一次接收到鍵盤,滑鼠或其他輸入後所經過的毫秒數.這可以用來判斷使用者是否離開.除非作業系統為Windows2000,XP或更高版本,否則此變數為空.使用者的物理輸入和由任何程式或腳本生成的模擬輸入(例如Send或MouseMove命令)會讓此變數重設為零.由於此變數的值趨向於以10的增量增加,所以不應該判斷它是否等於另一個值.相反,應該檢查此變數是否大於或小於另一個值.例如:IfGreater,A_TimeIdle,600000,MsgBox,Thelastkeyboardormouseactivitywasatleast10minutesago.
A_TimeIdlePhysical
與上面類似,但在安裝了相應的鉤子(鍵盤或滑鼠)後會忽略模擬的鍵擊和/或滑鼠點擊;即此變數僅反應物理事件.(這樣避免了由於模擬鍵擊和滑鼠點擊而誤以為使用者存在.)如果兩種鉤子都沒有安裝,則此變數等同於A_TimeIdle.如果僅安裝了一種鉤子,那麼僅此類型的物理輸入才會對A_TimeIdlePhysical起作用(另一種/未安裝鉤子的輸入,包括物理的和模擬的,都會被忽略).
GUI視窗和選單列
A_Gui
啟動了目前執行緒的GUI的名稱或編號.除非目前執行緒是由Gui控制項,選單列項目或Gui事件(例如GuiClose/GuiEscape)啟動的,否則此變數為空.
A_GuiControl
啟動目前執行緒的GUI控制項的關聯變數名.如果那個控制項沒有關聯變數,則A_GuiControl包含此控制項的文本/標題中前63個字元(這常用來避免給每個按鈕分配變數名).出現後面這些情況時A_GuiControl為空:1)A_Gui為空;2)GUI選單列項目或事件(例如GuiClose/GuiEscape)啟動了目前執行緒;3)那個控制項沒有關聯變數,也沒有標題;或4)最初啟動目前執行緒的控制項已經不存在(可能由於GuiDestroy的原因).
A_GuiWidth
A_GuiHeight
在GuiSize子程式中參考時,它們分別包含了GUI視窗的寬度和高度.它們對應於視窗的工作區,這是視窗中不包括標題列,選單列和邊框的區域.
A_GuiX
A_GuiY
它們包含了GuiContextMenu和GuiDropFiles事件中的X和Y坐標.這裡的坐標相對於視窗的左上角.
A_GuiEvent
或A_GuiControlEvent
啟動了目前執行緒的事件類型.如果目前執行緒不是由GUI動作啟動的,則此變數為空.否則,它為下列字串的其中一個:
Normal:此事件是由左鍵按一下和鍵擊(方向鍵,TAB鍵,空格鍵,帶下劃線的快捷鍵等)觸發的.此變數的值還可以用於選單列項目和特殊的Gui事件,例如GuiClose和GuiEscape.
DoubleClick:此事件是由按兩下觸發的.注意:按兩下中的首次按一下仍會引起Normal事件首先被接收到.換句話說,按兩下時子程式會執行兩次:一次在首次按一下時,再次是在第二次按一下時.
RightClick:僅出現在GuiContextMenu,ListViews和TreeViews.
Context-sensitivevalues:要瞭解詳情請參閱GuiContextMenu,GuiDropFiles,Slider,MonthCal,ListView和TreeView.
A_EventInfo
包含下列事件的額外資訊:
OnClipboardChange標籤
滑鼠滾輪熱鍵(WheelDown/Up/Left/Right)
RegisterCallback()
GUI事件,即GuiContextMenu,GuiDropFiles,ListBox,ListView,TreeView和StatusBar.如果一個事件沒有額外的資訊,那麼A_EventInfo的值為0.
注意:與類似A_ThisHotkey這樣的變數不同,每個執行緒會為A_Gui,A_GuiControl,A_GuiX/Y,A_GuiEvent和A_EventInfo儲存它自己本身的值.因此,如果一個執行緒被另一個中斷,在這個執行緒恢復時它仍將看到這些變數的原來/正確的值.
熱鍵,熱字串和自訂選單項目
A_ThisMenuItem
最近選擇的自訂選單項目的名稱(沒有則為空).
A_ThisMenu
A_ThisMenuItem所在選單的名稱.
A_ThisMenuItemPos
表示A_ThisMenuItem在A_ThisMenu當前位置的編號.選單中首個項目為1,第二項為2,依此類推.選單分隔線也計算在內.如果A_ThisMenuItem為空或已不存在於A_ThisMenu中,則此變數為空.如果A_ThisMenu已不存在,則此變數也為空.
A_ThisHotkey
最近執行的熱鍵或非自動替換熱字串的按鍵名稱(如果沒有則為空),例如#z.如果目前執行緒被其他熱鍵中斷,那麼此變數的值會變化,所以如果之後需要在子程式中使用原來的值,則必須馬上把它複製到另一個變數中.
首次建立熱鍵時(通過Hotkey命令或雙冒號標籤),其鍵名以及修飾符的順序成為此熱鍵的固定名稱.另請參閱:A_ThisLabel
A_PriorHotkey
除了儲存前一次熱鍵的名稱外,其他的與上面相同.如果沒有它會為空.
A_PriorKey
[v1.1.01+]:在最近按鍵按下或按鍵釋放前最後按下的按鍵名稱,如果在按鍵歷史中沒有適用的按鍵按下則為空.不包括由AutoHotkey腳本生成的所有輸入.要使用此變數,首先必須安裝鍵盤或滑鼠鉤子同時啟用按鍵歷史.
A_TimeSinceThisHotkey
從A_ThisHotkey按下後到現在經過的毫秒數.如果A_ThisHotkey為空,則此變數的值為-1.
A_TimeSincePriorHotkey
從A_PriorHotkey按下後到現在經過的毫秒數.如果A_PriorHotkey為空,則此變數的值為-1.
A_EndChar
使用者最近按下的觸發了非自動替換熱字串的終止符.如果不需要終止符(由於使用了*選項),那麼此變數將為空.
作業系統和使用者資訊
ComSpec
[v1.0.43.08+]
此變數的值與系統環境變數ComSpec一樣(例如C:\Windows\system32\cmd.exe).常與Run/RunWait一起使用.注意:此變數不帶A_前綴.
A_Temp
[v1.0.43.09+]
存放暫存檔的資料夾的完整路徑和名稱(例如C:\DOCUME~1\UserName\LOCALS~1\Temp).它的值從下列的其中一個位置獲取(按順序):1)環境變數TMP,TEMP或USERPROFILE;2)Windows目錄.在Windows9x中,如果TMP和TEMP都不存在則使用A_WorkingDir的值.
A_OSType
正在執行的作業系統類型。
由於AutoHotkey_L僅支援基於NT的作業系統,所以此變數總是為WIN32_NT。
舊版本的AutoHotkey執行在Windows95/98/ME時會傳回WIN32_WINDOWS。
A_OSVersion
下列字串的其中一個:WIN_7[需要AHK_L]、WIN_8[需要v1.1.08+]、WIN_VISTA、WIN_2003、WIN_XP、WIN_2000。
;這個示例已過時了,裡面的這些作業系統都不再受支援。
ifA_OSVersioninWIN_NT4,WIN_95,WIN_98,WIN_ME;註:逗號兩邊沒有空格。
{
MsgBoxThisscriptrequiresWindows2000/XPorlater.
ExitApp
}
A_Is64bitOS
[v1.1.08+]:如果作業系統為64位則值為1(真),為32位則為0(假)。
A_PtrSize
[AHK_L42+]:包含指標的大小值,單位為位元組.值為4(32位)或8(64位),取決於執行目前腳本的執行程式的類型。
A_Language
目前系統的預設語言,值為這些4-位數字編碼的其中一個.
A_ComputerName
在網路上看到的計算機名稱.
A_UserName
執行目前腳本的使用者的登錄名.
A_WinDir
Windows目錄.例如:C:\Windows
A_ProgramFiles
或ProgramFiles
ProgramFiles目錄(例如C:\ProgramFiles).在v1.0.43.08+,前綴A_可以省略,這樣有助於自然過渡到#NoEnv.
A_AppData
[v1.0.43.09+]
目前使用者的應用程式數據資料夾的完整路徑和名稱.例如:C:\DocumentsandSettings\Username\ApplicationData
A_AppDataCommon
[v1.0.43.09+]
所有使用者的應用程式數據資料夾的完整路徑和名稱.
A_Desktop
目前使用者的桌面資料夾的完整路徑和名稱.
A_DesktopCommon
所有使用者的桌面資料夾的完整路徑和名稱.
A_StartMenu
目前使用者的開始選單資料夾的完整路徑和名稱.
A_StartMenuCommon
所有使用者的開始選單資料夾的完整路徑和名稱.
A_Programs
目前使用者的開始選單中程式資料夾的完整路徑和名稱.
A_ProgramsCommon
所有使用者的開始選單中程式資料夾的完整路徑和名稱.
A_Startup
目前使用者的開始選單中啟動資料夾的完整路徑和名稱.
A_StartupCommon
所有使用者的開始選單中啟動資料夾的完整路徑和名稱.
A_MyDocuments
目前使用者"我的文檔"資料夾的完整路徑和名稱.與大多數類似變數不同,當此資料夾為驅動器的根目錄時,此變數的值不包含最後的反斜線.例如,它的值我M:而不是M:\
A_IsAdmin
如果目前使用者有管理員權限,則此變數的值為1.否則為0.在Windows95/98/Me,此變數的值總是為1.
在WindowsVista或更高版本中,一些腳本可能需要管理員權限才能正常執行(例如與使用管理員權限執行的處理序和視窗進行交互的腳本).為了實現此目錄,請把下列語句添加到腳本的頂部:
ifnotA_IsAdmin
{
Run*RunAs"%A_ScriptFullPath%";需要v1.0.92.01+
ExitApp
}
A_ScreenWidth
A_ScreenHeight
主監視器的寬度和高度,單位為像素(例如1024和768).
要獲取多顯示器系統中其他顯示器的尺寸,請使用SysGet.
要獲取整個桌面(即使它橫跨多個顯示器)的寬度和高度,請使用下面的例子(不過在Windows95/NT中,下面的兩個變數都會被設定為0):
SysGet,VirtualWidth,78
SysGet,VirtualHeight,79
此外,使用SysGet可以獲取顯示器的工作區域,它比顯示器的整個區域小,因為它不包括工作列和其他注冊的桌面工具列.
A_IPAddress1到4
計算機中前4個網卡的IP地址.
雜項
A_Cursor
目前顯示的滑鼠游標類型.其值為下列單詞的其中一個:AppStarting,Arrow,Cross,Help,IBeam,Icon,No,Size,SizeAll,SizeNESW,SizeNS,SizeNWSE,SizeWE,UpArrow,Wait,Unknown.與size指標類型一起的首字母表示方向,例如NESW=NorthEast+SouthWest.手型指標(按一下和抓取)屬於Unknown類別.
Windows95中的已知限制:如果以很高的頻率(即每500ms或更快)重複獲取此變數的內容,那麼可能會干擾使用者按兩下滑鼠.沒有已知的解決方法.
A_CaretX
A_CaretY
目前游標(文本插入點)的X和Y坐標.如果沒有使用CoordMode使得坐標相對於整個螢幕,預設坐標相對於活動視窗.如果沒有活動視窗或無法確定文本插入點的位置,則這兩個變數為空.
下面這個腳本可以讓您在四處移動文本插入點時,查看顯示在自動更新工具提示上的目前位置.注意在某些視窗(例如某些版本的MSWord)會不管文本插入點的實際位置如何都報告同樣的位置.
#Persistent
SetTimer,WatchCaret,100
return
WatchCaret:
ToolTip,X%A_CaretX%Y%A_CaretY%,A_CaretX,A_CaretY-20
return
如果以很高的頻率(即每500ms或更快)重複獲取這些變數的內容,那麼可能會干擾使用者按兩下滑鼠.沒有已知的解決方法.
Clipboard
作業系統剪貼簿的內容,可以從中讀取或寫入內容.請參閱剪貼簿章節.
ClipboardAll
剪貼簿中的完整內容(包含格式和文本).請參閱ClipboardAll.
ErrorLevel
請參閱ErrorLevel.
A_LastError
作業系統GetLastError()函數或最近COM物件呼叫傳回的結果.要瞭解詳情,請參閱DllCall()和Run/RunWait.
Loop
A_Index
目前迴圈重複的次數(64位整數).例如,當腳本首次執行此迴圈體時,此變數的值為1.要瞭解詳情請參閱Loop或While迴圈.
A_LoopFileName等
此變數和其他相關變數僅在文件迴圈中有效.
A_LoopRegName等
此變數和其他相關變數僅在登錄檔迴圈中有效.
A_LoopReadLine
請參閱文件讀取迴圈.
A_LoopField
請參閱解析迴圈.
環境變數與"普通"變數
環境變數由作業系統維護.在命令提示符中輸入SET並回車後,您可以看到環境變數列表.
腳本中可以使用EnvSet建立新的環境變數或改變現有環境變數的內容.但是,這樣的添加和改變都是私有的;它們不會被系統的其他部分看到.一個例外是當腳本使用Run或RunWait執行程式時(甚至是另一個腳本):這樣的程式會繼承其父腳本的環境變數的副本,包括私有的那些.
在v1.0.43.08+,推薦在所有新腳本中使用以下方式獲取環境變數,例如Path:
EnvGet,OutputVar,Path;想瞭解含義,請參閱#NoEnv.
變數的容量和佔用記憶體
每個變數最多可以含有64MB的文本(使用#MaxMem可以增加這個限制).
當賦值給變數比目前更長的內容時,會自動分配額外的系統記憶體給這個變數.
通過賦值為空可以釋放大變數佔用的記憶體,例如var:=""
腳本可以建立的變數數量沒有限制.程式設計用來支援至少幾百萬的變數而不會出現明顯的性能下降.
接受數值輸入的命令,函數和表達式通常可以支援15位的浮點數精度.對於整數,可以支援64位有符號整數,其範圍從-9223372036854775808(-0x8000000000000000)到9223372036854775807(0x7FFFFFFFFFFFFFFF).此範圍外的任何整數不受支援,並可能產生錯誤的結果.與之相比,整數的算數運算結果超出此範圍時會產生溢出(例如0x7FFFFFFFFFFFFFFF+1=-0x8000000000000000).
參見
EN,简
Comments
Signin|RecentSiteActivity|ReportAbuse|PrintPage|PoweredByGoogleSites
延伸文章資訊
- 1AHK積木 - AHK 語法產生器
修改ahk存檔後,要再對右下角的綠色圖示按右鍵>Reload,才能成功運行 ... 可以試試看附圖中的拼法其中變數積木「X」和「Y」要去「變數」裡面新增變數積木哦
- 2[AHK-] AutoHotKey 入門教學- 變數與剪貼簿- 看板EzHotKey
變數與剪貼簿: Using variables and the clipboard http://www.autohotkey.com/docs/Tutorial.htm#Variables 變...
- 3Autohotkey:依序產生變數,以及依序取出變數 - KSL`s Base
Autohotkey:依序產生變數,以及依序取出變數. 可以透過:=左邊也是變數的方式來組合變數,例如透過loop的方式,把行列的值拿來拼成變數,像是%1_1% ...
- 4變數和表達式- AutoHotKey.tw - Google Sites
變數的類型: AutoHotkey 中沒有明確的變數型別. 然而, 只包含數字(可以含有小數點) ... 給變數賦值: 要把字串或數字儲存到變數中, 有兩種方法: 傳統方法和表達式方法.
- 5[Autohotkey入門]你要往盒子裡面裝"點啥"么: 變數- 雪花台湾
摘要每一個變數都是特別的盒子變數的命名與AHK變數命名淺析表達式: 值、運算符Autohotkey中的數據類型變數參與表達式運算符優先順序( . )