函數- AutoHotKey.tw - Google Sites

文章推薦指數: 80 %
投票人數:10人

同樣地, 使用ByRef 送回長字串給呼叫者通常比類似 Return HugeString 的方式執行的更好. [AHK_L 60+]: 如果傳遞給ByRef 參數的不是可修改的變數, 那麼函數會表現的就像關鍵 ... 首頁簡介變數和表達式函數命令和函數索引{...}(區塊)物件AutoTrimBlockInputBreakCatchClickClipWaitComObjActiveComObjArray()ComObjConnectComObjCreateMsgBoxVar:=expression翻譯詞彙表編輯討論協作平台地圖 函數 函數 目錄 入門和簡單示例 參數 可選參數 可變參數函數 區域變數 動態呼叫函數 最佳化布林求值 在函數中使用子程式 Return,Exit及一般說明 使用#Include在多個腳本間共享函數 函數庫:標準庫和使用者庫 內建函數 入門和簡單示例 函數類似於子程式(Gosub),不過它可以從呼叫者那裡接受參數(輸入).同時,函數還可以傳回值給其呼叫者.思考後面這個接受兩個數字並傳回它們的和的簡單函數: Add(x,y) { returnx+y;"Return"期望表達式. } 上面的被稱為函數定義,因為它建立了一個名稱為"Add"(不區分大小寫)的函數並且確立了呼叫它時必須準確的提供兩個參數(x和y).要呼叫此函數,請把它的結果通過:=運算子賦值給變數.例如: Var:=Add(2,3);數字5將被儲存到Var. 並且,呼叫函數時可以不儲存其傳回值: Add(2,3) 但在這種情況下,函數傳回的任何值會被丟棄;所以除非函數產生了傳回值外的其他效果,否則這個呼叫沒有意義. 由於函數呼叫是表達式,在其參數列表中的任何變數名稱都不應該括在百分號中.與之相比,原義的字串應該括在雙引號中.例如: ifInStr(MyVar,"fox") MsgBoxThevariableMyVarcontainsthewordfox. 最後,可以在任何命令的參數中呼叫函數(除了像StringLen的中的那些OutputVar和InputVar參數).然而,不支援表達式的參數必須加上"%"前綴,例如: MsgBox%"Theansweris:".Add(3,2) 在原生支援表達式的參數中也允許加上"%"前綴,不過它會被簡單的忽略了. 參數 定義函數時,其參數都在其名稱後面的括號中列出(在其名稱和小括號之間不能含有空格).如果函數不接受任何參數,請把括號留空,例如:GetCurrentTimestamp(). ByRef參數:從函數的角度看,參數本質上是區域變數,除非它們被定義為ByRef,例如: Swap(ByRefLeft,ByRefRight) { temp:=Left Left:=Right Right:=temp } 在上述例子中,ByRef的使用讓每個參數變成從呼叫者傳遞進來的變數的一個別名.換句話說,參數和呼叫者的變數都參考記憶體中相同的內容.這樣使得Swap函數可以通過移動Left的內容到Right中來修改呼叫者的變數,反之亦然. 與之相比,在上述例子中如果沒有使用ByRef,Left和Right將是呼叫者變數的副本,因此Swap函數不會對外部產生影響. 由於return只能送回一個值給函數的呼叫者,所以可以使用ByRef送回更多的結果.這是由函數向呼叫者傳遞進來的變數(通常為空)儲存一個值來實現的. 傳遞大字串給函數時,使用ByRef提高了性能並且通過避免生成字串的副本節約了記憶體.同樣地,使用ByRef送回長字串給呼叫者通常比類似ReturnHugeString的方式執行的更好. [AHK_L60+]:如果傳遞給ByRef參數的不是可修改的變數,那麼函數會表現的就像關鍵字"ByRef"沒有那樣.例如,Swap(A_Index,i)儲存A_Index的值到i中,但是當Swap函數傳回時賦給Left的值會被丟棄. [v1.1.01+]:IsByRef()函數可以用來判斷呼叫者是否為指定的ByRef參數提供了變數。

已知限制: 物件字段在ByRef的目的中不會被視為變數.例如,如果foo.bar傳遞給ByRef參數,那麼它將表現的就像ByRef沒有那樣. 不能傳遞Clipboard,內建變數或環境變數給函數的ByRef參數,即使腳本中沒有#NoEnv時. 儘管函數可以遞迴呼叫它自己,但是如果它傳遞它自己的一個區域變數或非ByRef參數給自己的ByRef,那麼新一層的ByRef參數將參考它自己那個名稱的區域變數而不是之前層的.然而,當函數傳遞給它自己全域變數,靜態變數或ByRef參數時不會產生這樣的問題. 如果一個參數在函數呼叫中被解析為一個變數(例如Var或++Var或Var*=2),它左邊或右邊的其他參數可能在它被傳遞給函數前修改這個變數.例如,當Var初始為0時func(Var,Var++)會意外地傳遞1和0,即使函數的首個參數不是ByRef類型時.因為這種行為是違反常規的,所以可能在將來的版本中改變. 可選參數 定義函數時,可以把它的一個或多個參數標記為可選的.這可以通過在參數後添加一個等號後面跟著預設值完成.後面的函數中其Z參數被標記為可選的: Add(X,Y,Z=0){ returnX+Y+Z } 當呼叫者傳遞三個參數給上面的函數時,Z的預設值被忽略.但當呼叫者僅傳遞兩個參數時,Z自動接受預設值0. 可選參數不能孤立地放在參數列表的中間.換句話說,在首個可選參數右邊的所有參數都必須標記為可選的.[AHK_L31+]:呼叫函數時參數列表中間的可選參數可以省略,除非函數呼叫是動態的: Func(1,,3) Func(X,Y=2,Z=0){;請注意此時Z必須是可選的. MsgBox%X%,%Y%,%Z% } 在v1.0.46.13+,ByRef參數也支援預設值;例如:Func(ByRefp1="").每當呼叫者省略這樣的參數時,函數會建立一個包含預設值的區域變數;換句話說,函數表現的就像關鍵字"ByRef"沒有那樣. 參數的預設值必須是下列形式的其中一種:true,false,原義的整數,原義的浮點數或引號包圍的/原義的字串例如"fox"或""(但在1.0.46.13+之前的版本中字串只支援""). 可變參數函數[AHK_L60+] 定義函數時,在最後一個參數後面寫一個星號來標記此函數為可變參數的,這樣讓它可以接收可變數目的參數: Join(sep,params*){ forindex,paraminparams str.=param.sep returnSubStr(str,1,-StrLen(sep)) } MsgBox%Join("`n","one","two","three") 呼叫可變參數函數時,通過儲存在函數的最後參數中的物件可以存取剩餘的參數.函數的首個剩餘參數在params[1],第二個在params[2]等等.和所有的標準物件一樣,使用params.MaxIndex()可以確定最大的索引值(這裡為參數的數目).但是如果沒有參數,MaxIndex會傳回空字串. 注意: "可變"參數只可以出現在形式參數列表的末尾. RegEx調出函數不是可變參數的,雖然允許使用「可變的」參數但會被留空。

回調函數通過地址而不是陣列傳遞剩餘參數。

可變參數函數呼叫 雖然可變參數函數可以接受可變數目的參數,不過在函數呼叫中使用相同的語法可以把陣列作為參數傳遞給任何函數: substrings:=["one","two","three"] MsgBox%Join("`n",substrings*) 注意: 在源陣列中參數的編號從1開始. 陣列中的可選參數可以完全省略. 直接呼叫自訂函數時由陣列參數可以包含命名項。

目標函數也可以是可變的,此時命名項被覆制,即使它們沒有一致的形式參數. 這樣的語法還可以用於呼叫物件的方法或獲取物件的屬性;例如,Object.Property[Params*]. 已知限制: 只有實際的最後一個參數才可以這樣展開。

例如,支援Func(x,y*)但不支援Func(x*,y). 這種語法不能用於設定物件的屬性,因為最後一個物理參數實際上為用於分配的值. 在星號(*)和參數列表中最後的形式參數間不能存在任何的非空白字元. 區域變數和全域變數 區域變數 預設情況下,在函數中建立或存取的所有變數都是局部的(除了超級全域變數和內建變數,例如Clipboard,ErrorLevel和A_TimeIdle).每個區域變數的內容只在它所在的函數中可見.因此,一個區域變數可以和一個全域變數有相同的名稱卻有著不同的內容.最後,所有的區域變數在每次呼叫函數時都以空值開始. 全域變數 要在函數中參考現有的全域變數(或建立新的),需要在使用前宣告此變數為全域的.例如: LogToFile(TextToLog) { globalLogFileName;此全域變數之前已經在函數外的某個地方賦值了. FileAppend,%TextToLog%`n,%LogFileName% } 假設全域模式:如果函數需要存取或建立大量的全域變數,通過在函數的首行使用單詞"global"或宣告區域變數可以把函數定義為假設其所有的變數都是全域的(除了它的參數).例如: SetDefaults() { global;如果此函數的首行是類似於"localMyVar"這樣的,那麼這個單詞可以省略. MyGlobal:=33;把33賦值給全域變數,必要時首先建立這個變數. localx,y:=0,z;在這種模式中區域變數必須進行宣告,否則會假設它們為全域的. } 函數還可以使用這種假設全域模式來建立全域陣列,例如賦值給Array%A_Index%的迴圈. 超級全域變數[v1.1.05+]:如果全域宣告出現在任何函數的外面,預設情況下它可以對所有函數有效.這樣可以避免在每個函數中重複宣告變數的需要.不過,如果宣告了含有相同名稱的函數參數或區域變數,那麼它會優先於全域變數.由class關鍵字建立的變數也是超級全域的. 靜態變數 靜態變數總是隱式的區域變數,但和區域變數的區別是它們的值在多次呼叫期間是記住的.例如: LogToFile(TextToLog) { staticLoggedLines=0 LoggedLines+=1;保持局部的計數(它的值在多次呼叫期間是記住的). globalLogFileName FileAppend,%LineCount%:%TextToLog%`n,%LogFileName% } 靜態初始化:在1.0.46以前的版本中,所有的靜態變數都是以空值開始;所以要檢查靜態變數首次被使用的唯一方法是檢查它是否為空值.在v1.0.46+,靜態變數可以初始化為""外的其他值,通過在後面跟著:=或=及後面這些形式的其中一種:true,false,原義的整數,原義的浮點數或引號包圍的/原義的字串,如"fox".例如:staticX:=0,Y:="fox".每個靜態變數只初始化一次(在腳本開始執行前). [AHK_L58+]:支援Staticvar:=expression.根據這些表達式在腳本中出現的順序對它們進行計算,緊接著才進入腳本的自動執行段。

假設靜態模式[v1.0.48+]:通過在函數的首行使用單詞"static"可以把函數定義為假設其所有的變數都是靜態的(除了它的參數).例如: GetFromStaticArray(WhichItemNumber) { static staticFirstCallToUs:=true;靜態宣告初始化仍然只執行一次(在腳本執行前). ifFirstCallToUs;在首次呼叫而不在後續的呼叫時建立靜態陣列. { FirstCallToUs:=false Loop10 StaticArray%A_Index%:="Value#".A_Index } returnStaticArray%WhichItemNumber% } 在假設靜態模式中,任何非靜態變數都必須宣告為區域變數或全域變數. 關於局部和全域的更多資訊 通過逗號分隔多個變數這樣可以在同一行宣告它們,例如: globalLogFileName,MaxRetries:=5 staticTotalAttempts=0,PrevResult 在v1.0.46+,通過後面跟著:=or=及任意表達式局部或全域變數可以在同一行初始化,如同宣告那樣(在宣告時=運算子和:=作用相同).與靜態初始化不同,在每次呼叫函數時都會對區域變數和全域變數進行初始化,但只在控制流實際達到它們所在的語句時.換句話說,像localx=0這樣的一行和寫成單獨的兩行有同樣的效果:localx後面跟著x=0. 因為單詞local,global和static都是在腳本執行時立即處理的,所以不能使用IF語句有條件的宣告變數.換句話說,IF或ELSE的區塊內的宣告無條件對宣告和函數的閉括號之間的所有行生效.同時還需注意目前還不支援宣告動態變數,例如globalArray%i%. 對於建立陣列的命令(例如StringSplit),如果假設全域模式沒有生效或陣列的首個元素已經宣告為區域變數時建立的陣列是局部的(如果函數的某個參數被傳遞時也是如此,即使此參數為ByRef類型,因為參數類似於區域變數).相反地,如果首個元素已經宣告為全域的,那麼建立全域的陣列.不過,後面混亂的常見根源也適用於這些情況.StringSplit建立的陣列首個元素為ArrayName0.對於其他建立陣列的命令,例如WinGetList,首個元素為ArrayName(即沒有數字). 在函數中,任何動態變數參考,例如Array%i%,總是解析為區域變數,僅當這樣名稱的區域變數不存在而全域變數存在時才解析為全域變數.如果兩者都不存在並且需要建立此變數時,當假設全域模式沒有生效時它被建立為區域變數.因此,僅當函數被定義為假設全域函數時,函數中才可以手動建立全域陣列(通過使用類似Array%i%:=A_Index的方法). 混亂的常見根源:任何對非動態參考都會在腳本執行時建立那個變數.例如,在函數外使用時,MsgBox%Array1%會在腳本執行的時候建立Array1為全域變數.相反地,在函數中使用MsgBox%Array1%會在腳本執行的時候建立Array1為函數的一個區域變數(除非假設全域模式生效),即使Array和Array0都宣告為全域的. 動態呼叫函數 在v1.0.47.06+,通過百分號可以動態呼叫函數(包括內建函數).例如,%Var%(x,"fox")將呼叫名稱儲存在Var中的函數.同樣地,Func%A_Index%()將呼叫Func1()或Func2()等,這取決於A_Index的目前值. 在v1.1.07.00+,在%Var%()中的Var可包含函數名,函數參考或模仿函數的物件.如果此函數不存在,則呼叫預設基底物件的__Call元函數. 如果由於下面的某個原因無法呼叫函數,計算包含呼叫的表達式時可能會過早靜默停止,這樣可能會產生問題. 呼叫不存在的函數,這可以通過使用IfIsFunc(VarContainingFuncName)來避免.除了內建函數,被呼叫函數的定義必須明確存在於腳本中,通過類似#Include或對庫函數的非動態呼叫的方法. 傳遞過少的參數,這可以通過檢查IsFunc()的傳回值來避免(這是強制參數的數目加上一的數字).注意:在v1.0.48+,允許傳遞過多的參數;每個額外的參數在被完全計算(包括任何函數呼叫)後丟棄. 最後,對函數的動態呼叫比正常呼叫稍慢,因為正常的呼叫在腳本開始執行前解析(查詢). 最佳化布林求值 當在表達式中使用AND,OR和三元運算子時,會對它們進行最佳化來提高性能(不管目前是否存在函數呼叫).通過不計算表達式中那些不影響最終結果的部分來進行最佳化運算.為了說明這個概念,請看這個例子: if(ColorName<>""ANDnotFindColor(ColorName)) MsgBox%ColorName%couldnotbefound. 在上面的例子中,如果ColorName變數為空則永遠不會呼叫FindColor()函數.這是由於AND的左側結果將為false,因此其右邊不可能讓最終的結果為true. 由於此特性,所以需要注意到,如果在AND或OR的右側呼叫函數,那麼函數可能永遠不會產生副作用(例如改變全域變數的內容). 還需要注意在嵌套的AND和OR串聯表達式的求值最佳化.例如,在後面的表達式中每當ColorName為空時只會進行最左邊的比較.這是因為此時最左邊的比較已經足以確定最終的結果: if(ColorName=""ORFindColor(ColorName,Region1)ORFindColor(ColorName,Region2)) break;搜索內容為空或找到了匹配. 從上面的例子可以看出,任何耗時的函數一般應該在AND或OR的右側呼叫從而提高性能.這種方法還能避免呼叫接受了一個不合適的值例如空字串的函數. 在v1.0.46+,三元條件運算子(?:)也通過不計算丟棄的分支進行求值最佳化. 在函數中使用子程式 儘管在一個函數中不能定義其他函數,但它可以含有子程式.與其他子程式一樣使用Gosub執行它們且使用Return傳回(此時Return屬於Gosub而不是函數). 已知限制:目前每個子程式(標籤)的名稱在整個腳本中必須是唯一的.如果存在重複的標籤,在執行前程式會通知您. 如果函數使用Gosub跳轉到公共子程式(在函數外部的子程式),那麼所有外面的變數都是全域的而且在子程式傳回前無法參考函數自身的區域變數.不過,A_ThisFunc仍將包含正在執行的函數名稱. 儘管不能使用Goto從函數中跳轉到外面,但可以在函數中使用Gosub到外部/公共的子程式,然後在那裡使用Goto. 儘管一般不鼓勵使用Goto,但它能用來在同個函數中的一個位置跳轉到其他位置.這樣有助於簡化包含許多個傳回點而所有這些點在傳回前需要進行一些清理的複雜函數. 函數可以包含能被外部呼叫的子程式,例如計時器、GUIg標籤和選單項目。

通常把它們封裝到一個單獨的文件中供#Include使用,這樣避免了它們和腳本的自動執行段的衝突.不過,還存在下面這些限制: 如果它們所在的函數曾經被正常呼叫,那麼這樣的子程式應該只使用靜態和全域變數(不使用局部變數).這是由於中斷函數呼叫執行緒的子程式執行緒(反之亦然)可以改變被中斷執行緒看到的區域變數的值.此外,在任何時候函數傳回到其呼叫者時,它包含的所有區域變數都被置空來釋放佔用的記憶體. 這樣的子程式應該只使用全域變數(不使用靜態變數)作為GUI控制項的變數. 當一個子程式執行緒進入函數後,在此執行緒中任何對動態變數的參考都被視為是全域的(包括建立陣列的那些命令). Return,Exit及一般說明 如果函數內的執行流在遇到Return前到達了函數的閉括號,那麼函數結束並傳回空值(空字串)給其呼叫者.當函數明確省略Return的參數時也傳回空值. 當函數使用Exit命令終止目前執行緒時,其呼叫者不會接收到傳回值.例如,這個語句Var:=Add(2,3)中,如果Add()退出了那麼Var會保持不變.如果函數出現了執行時錯誤,例如執行了一個不存在的文件(當UseErrorLevel選項不存在時),也會出現同樣的情況. 如果要傳回一個額外的容易記住的值,那麼函數可以修改ErrorLevel的值來實現. 要使用一個或多個空值(空字串)呼叫函數,可以使用空的引號對,例如:FindColor(ColorName,"") 因為呼叫函數不會開啟新執行緒,所以函數對設定例如SendMode和SetTitleMatchMode做出的任何改變對其呼叫者同樣有效. 函數的呼叫者可以傳遞不存在的變數或陣列元素給它,當函數期望和ByRef一致的參數時這很有用.例如,呼叫GetNextLine(BlankArray%i%)會自動地建立局部或全域的變數BlankArray%i%(是局部還是全域取決於呼叫者是否在函數內並且它的假設全域模式是否有效). 在函數中使用ListVars時,它會顯示函數的區域變數及其內容.這樣可以說明調試腳本. 風格和命名約定 您也許會發現,如果給複雜函數中的特定變數加上獨特的前綴會讓函數更容易閱讀和維護.例如,使用"p"或"p_"開頭來命名函數中的每個參數可以讓它們的性質一目瞭然,尤其是當函數中有許多區域變數吸引您的注意力的時候.同樣地,前綴"r"或"r_"可以用於ByRef參數,而"s"或"s_"可以用於靜態變數. 在定義函數時可以使用OneTrueBrace(OTB)風格.例如: Add(x,y){ returnx+y } 使用#Include在多個腳本間共享函數 可以使用#Include指令(即使在腳本的頂部)從外部文件中加載函數. 說明:當腳本的執行流遇到函數定義時,它會跳過函數(使用一種瞬時的方法)並在函數閉括號後恢復執行.因此,開始執行時執行流不會陷入函數中,也不會因為在腳本的最頂部存在一個或多個函數而影響到自動執行段. 函數庫:標準庫和使用者庫[v1.0.47+] 腳本中可以不需要通過#Include而呼叫外部文件中的函數.要達到此目的,一個和函數相同名稱的文件必須存在於下面庫目錄的其中一個: %A_ScriptDir%\Lib\;局部庫-需要AHK_L42+. %A_MyDocuments%\AutoHotkey\Lib\;使用者庫. path-to-the-currently-running-AutoHotkey.exe\Lib\;標準庫. 例如,當腳本呼叫不存在的函數MyFunc()時,程式會在使用者庫中搜索名為MyFunc.ahk的文件.如果沒有找到,會繼續在標準庫中搜索此文件.如果仍然沒有找到匹配的文件且函數的名稱含有下劃線(例如MyPrefix_MyFunc),那麼程式會在兩個庫中搜索名為MyPrefix.ahk的文件,如果找到則加載它.這樣使得MyPrefix.ahk可以同時包含MyPrefix_MyFunc函數和其他名稱以MyPrefix_開始的相關函數. [AHK_L42+]:支援局部庫且局部庫優先於使用者庫和標準庫. 雖然庫文件通常只包含和它的檔名稱相同的單個函數,但它還可以包含僅被此函數呼叫的私有函數和子程式.然而,這樣的函數應該使用相當特殊的名稱,因為它們仍屬於全域命名空間;也就是說,可以在腳本的任意位置呼叫它們. 如果在庫文件中使用#Include,那麼#Include的工作目錄為庫文件自身所在的目錄.利用這個特性可以重定向到較大的庫文件,其中包含此函數及相關內容. 腳本編譯器(ahk2exe)同樣支援庫函數.不過,它要求在編譯器目錄的上一級目錄中存在AutoHotkey.exe的副本(通常是這樣).如果不存在AutoHotkey.exe,編譯器仍可以執行但無法自動包含庫函數. 包含在庫中的函數和其他函數執行的一樣好,因為在腳本開始執行前已經預加載了它們. 內建函數 在內建函數參數列表末尾的任何可選參數可以完全省略.例如,WinExist("Untitled-Notepad")是有效的,因為它的其他三個參數被認為是空的. 如果腳本定義了與內建函數同名的函數,那麼內建函數會被覆蓋.例如,腳本會呼叫它自己定義的WinExist()函數來代替標準的那個.然而,這樣腳本將無法呼叫原來的函數. 在DLL文件中的外部函數可以使用DllCall()呼叫. 常用函數 FileExist(FilePattern):如果FilePattern不存在(如果未指定絕對路徑,則假定FilePattern在A_WorkingDir中)則傳回空值(空字串).否則,它傳回首個匹配的文件或資料夾的屬性字串("RASHNDOCT"的子集).如果文件沒有屬性(很少見),則傳回"X".FilePattern可以是文件或資料夾的準確名稱或包含萬用字元(*或?).由於空字串被視為"false",所以總可以把函數的傳回值作為準真假值來使用.例如,ifFileExist("C:\MyFile.txt")語句當文件存在時則為真,否則為假.同樣地,ifInStr(FileExist("C:\MyFolder"),"D")語句僅當文件存在並且為目錄時才為真.相關命令:IfExist和FileGetAttrib. GetKeyState(KeyName[,"P"或"T"]):與GetKeyState命令(它在按下時傳回D而彈起時傳回U)不同,此函數在按下時傳回true(1)而彈起時傳回false(0)。

如果KeyName無效,則傳回空字串.請參閱GetKeyState瞭解其他傳回值和用法. InStr(Haystack,Needle[,CaseSensitive=false,StartingPos=1,Occurrence=1]):傳回字串Needle在字串Haystack中的出現位置.與StringGetPos不同,首個字元位置為1;這是由於0相當於"false",使其成為直觀的"未找到"的提示.如果參數CaseSensitive省略或為false,搜索不區分大小寫(不區分的模式取決於StringCaseSense);否則,必須準確匹配大小寫.如果StartingPos省略,那麼使用預設值1(Haystack的起始處).否則,從Haystack的第二個字元開始請指定2,從第三個開始為3,等等.如果StartingPos超過了Haystack的長度,則傳回0.如果StartingPos為0或負數,搜索將從末尾的偏移處開始反向進行(從右往左).不論StartingPos的值是多少,傳回的位置總是相對於Haystack的首個字元.例如,"abc"在"123abc789"中的位置總為4.在Occurrence中指定2來傳回第二個匹配的位置,3為第三個,等等.相關項:RegExMatch(),IfInString和StringGetPos. RegExMatch(Haystack,NeedleRegEx[,UnquotedOutputVar="",StartingPos=1]):請參閱RegExMatch(). RegExReplace(Haystack,NeedleRegEx[,Replacement="",OutputVarCount="",Limit=-1,StartingPos=1]):請參閱RegExReplace(). SubStr(String,StartingPos[,Length])[v1.0.46+]:在String中從StartingPos開始向右複製不超過Length長度的子字串(如果Length省略,則預設為"所有字元").對於StartingPos,指定1從首個字元開始,2從第二個開始等(如果StartingPos超過了String長度,則傳回空字串).如果StartingPos小於1,那麼它被看成是從字串末尾開始的偏移.例如,0提取最後一個字元而-1提取最後兩個字元(但如果StartingPos超過了字串的左端,則提取又從首個字元開始).Length是需提取字元的最大數目(當字串剩餘部分太短時提取的數目會比最大值少).指定負的Length從而在傳回字串的末尾省略這個數目的字元(如果省略了全部或過多字元則傳回空字串).相關項:RegExMatch(),StringMid,StringLeft/Right,StringTrimLeft/Right. StrLen(String):傳回String的長度.如果String是由ClipboardAll之前所賦值的變數,則傳回其總大小.相關命令:StringLen. WinActive([WinTitle,WinText,ExcludeTitle,ExcludeText]):如果活動視窗匹配指定的條件,則傳回其唯一ID(HWND)。

如果不匹配,則函數傳回0.因為所有非零值都被視為"true",所以每當WinTitle活動時,ifWinActive("WinTitle")語句為真.WinTitle參數支援ahk_id,ahk_class及其他特殊字串.關於視窗激活的這些內容和其他相關資訊請參閱IfWinActive瞭解詳情.注意:獲取活動視窗的唯一ID的簡便方法是使用ActiveHwnd:=WinExist("A") WinExist([WinTitle,WinText,ExcludeTitle,ExcludeText]):傳回以十六進制整數表示的首個匹配視窗的唯一ID(HWND)(沒有找到則為0)。

由於所有非零值都被視為"true",所以每當WinTitle存在時,ifWinExist("WinTitle")語句為真.WinTitle參數支援ahk_id,ahk_class及其他特殊字串.關於視窗查找的這些內容和其他相關資訊請參閱IfWinExist瞭解詳情. 雜項函數 Asc(String):傳回String中首個字元的字元編碼(介於1和255(在ANSI版本中)或65535(在Unicode版本中)的數字).如果String為空,則傳回0. Chr(Number):傳回與Number表示的字元編碼相對應的單個字元.如果Number不在有效的字元編碼範圍內,則傳回空字串.常用的字元編碼包括9(tab),10(換行),13(回車),32(空格),48-57(數字0-9),65-90(大寫字母A-Z)和97-122(小寫字母a-z). DllCall():請參閱DllCall(). FileOpen():提供物件導向的文件I/O.請參閱FileOpen()瞭解更多細節. Func(FunctionName)[v1.1.00+]:如果FunctionName沒有顯式出現在腳本中(通過例如#Include或對庫函數的非動態呼叫的方法),則Func()傳回0.否則,它傳回到函數的參考.這可以用來呼叫函數或獲取類似參數的最小和最大數目的資訊. GetKeyName(Key),GetKeyVK(Key),GetKeySC(Key)[v1.1.01+]:獲取按鍵的名稱/文本,虛擬按鍵碼或掃瞄碼.Key可以為VK或SC碼,例如"vkA2"或"sc01D",以及兩者的組合或鍵名.例如,GetKeyName("vk1B")和GetKeyName("Esc")都傳回"Escape",而GetKeyVK("Esc")傳回27. IsByRef(Var)[v1.1.01+]:當Var為ByRef參數且呼叫者提供了變數時傳回1;否則當Var為其他類型的變數時傳回0. IsFunc(FunctionName)[v1.0.48+]:如果FunctionName不是顯式出現在腳本中(通過例如#Include或對庫函數的非動態呼叫的方法),則IsFunc()傳回0.否則它傳回函數的強制參數個數加一的數字(例如1為函數可以不需要參數,2為函數需要1個參數等等)。

例如,函數存在時ifIsFunc("MyFunc")和ifIsFunc(VarContainingFunctionName)語句為真,否則為假.在v1.1.00+,FunctionName為可以代替函數名的函數參考.另請參閱:動態函數呼叫,A_ThisFunc IsLabel(LabelName):如果LabelName作為子程式,熱鍵或熱字串(不包括LabelName中末尾的冒號)存在於腳本中則傳回非零數字.例如,標籤存在時ifIsLabel(VarContainingLabelName)將為真,否則為假.在類似Gosub,Hotkey,Menu和Gui命令中指定動態標籤時,使用此函數可以避免執行時錯誤.另請參閱:Labels. IsObject()[AHK_L31+]:判斷某個值是否為物件.另請參閱:物件. ListView和TreeView函數:請參閱ListView和TreeView頁面瞭解詳情. NumGet(VarOrAddress[,Offset=0][,Type="UPtr"])[v1.0.47+]:傳回在指定地址+偏移的位置儲存的二進制數.對於VarOrAddress,傳遞MyVar相當於傳遞&MyVar.然而,省略"&"可以執行的更好並確保目標地址是有效的(無效的地址會傳回"").與之相比,傳遞給VarOrAddress除裸變數之外的任何值都被視為原始地址;因此,指定MyVar+0會強制使用MyVar中的數字代替MyVar的地址.對於Type,可以指定為UInt,Int,Int64,Short,UShort,Char,UChar,Double,Float或Ptr(不過與DllCall不同的是,作為原義字串使用時它們必須包圍在引號中);詳情請參閱DllCall類型.[AHK_L57+]:Offset可以完全省略;例如,NumGet(var,"int")是有效的. NumPut(Number,VarOrAddress[,Offset=0][,Type="UPtr"])[v1.0.47+]:以二進制格式把Number儲存到指定地址+偏移的位置並傳回剛寫入項目右邊的地址.對於VarOrAddress,傳遞MyVar相當於傳遞&MyVar.然而,省略"&"可以執行的更好並確保目標地址是有效的(無效的地址會傳回"").與之相比,傳遞給VarOrAddress除裸變數之外的任何值都被視為原始地址;因此,指定MyVar+0會強制使用MyVar中的數字代替MyVar的地址.對於Type,可以指定為UInt,Int,Int64,Short,UShort,Char,UChar,Double,Float或Ptr(不過與DllCall不同的是,作為原義字串使用時它們必須包圍在引號中)(在v1.0.48+還支援UInt64);詳情請參閱DllCall類型.如果整數太大而無法用指定的Type儲存,那麼它的高位會被忽略;例如NumPut(257,var,0,"Char")將儲存數字1.[AHK_L57+]:Offset可以完全省略;例如,NumPut(x,var,"int")是有效的. OnMessage(MsgNumber[,"FunctionName"]):監視訊息/事件.請參閱OnMessage()瞭解詳情. StrGet(Address[,Length][,Encoding=None])[AHK_L46+]:從記憶體地址複製字串,並可以對其在不同代碼頁間進行轉換.請參閱StrGet()瞭解詳情. StrPut(String,Address[,Length][,Encoding=None])[AHK_L46+]:複製字串到記憶體地址,並可以對其在不同代碼頁間進行轉換.請參閱StrPut()瞭解詳情. RegisterCallback():請參閱RegisterCallback(). Trim()[AHK_L31+]:請參閱Trim(). VarSetCapacity(UnquotedVarName[,RequestedCapacity,FillByte]):增加或清空變數佔用的記憶體.請參閱VarSetCapacity()瞭解詳情. 通用數學函數 注意:如果某個傳入參數為非數值時,那麼數學函數通常傳回空值(空字串). Abs(Number):傳回Number的絕對值.傳回值的類型與Number相同(整數或浮點數). Ceil(Number):傳回由Number向上取整到最近的整數(不帶任何.00後綴)。

例如,Ceil(1.2)的結果為2而Ceil(-1.2)結果為-1. Exp(N):傳回e(其近似值為2.71828182845905)的N次冪.N可以為負數,也可以為小數.要計算e以外的其他數的次冪,請使用**運算子. Floor(Number):傳回由Number向下取整到最近的整數(不帶任何.00後綴).例如,Floor(1.2)的結果為1而Floor(-1.2)結果為-2. Log(Number):傳回Number的對數(底數為10).結果格式化為浮點數.如果Number為負數,則傳回空字串. Ln(Number):傳回Number的自然對數(底數為e).結果格式化為浮點數.如果Number為負數,則傳回空字串. Mod(Dividend,Divisor):求模.傳回被除數Dividend除以除數Divisor後得到的餘數.結果的正負總是與被除數一致.例如,mod(5,3)和mod(5,-3)的結果都為2,但mod(-5,3)和mod(-5,-3)的結果為-2.如果其中一個參數為浮點數,那麼結果也是浮點數.例如,mod(5.0,3)的結果為2.0而mod(5,3.5)的結果為1.5.如果除數為零,則函數傳回空值(空字串). Round(Number[,N]):如果N省略或為0,則Number被取整到最近的整數.如果N為正數,則Number被取整到N個小數位.如果N為負數,則Number被取整到十進制小數點左邊N位.例如,Round(345,-1)的結果為350而Round(345,-2)的結果為300.與TransformRound不同,每當N省略或小於1時結果不帶.000後綴.在v1.0.44.01+,N值大於零時會準確顯示N個小數位而不遵循SetFormat的設定.要避免這種情況,需要對Round()的傳回值再進行一次數學運算;例如:Round(3.333,1)+0. Sqrt(Number):傳回Number的平方根.結果格式化為浮點數.如果Number為負數,則函數傳回空字值(空字串). 三角函數 Sin(Number)|Cos(Number)|Tan(Number):傳回Number的正弦|餘弦|正切三角函數值.Number必須用弧度表示. ASin(Number):傳回弧度表示的反正弦值(其正弦值為Number).如果Number小於-1或大於1,則函數傳回空值(空字串). ACos(Number):傳回弧度表示的反餘弦值(其餘弦值為Number).如果Number小於-1或大於1,則函數傳回空值(空字串). ATan(Number):傳回弧度表示的反正切值(其正切值為Number). 注意:要將弧度轉換成角度,請將其乘以180/pi(約為57.29578).要將角度轉換成弧度,請將其乘以pi/180(約為0.01745329252).pi的值(約為3.141592653589793)為1的反正切值的4倍. 其他函數 Titan的命令函數:為每個有OutputVar的AutoHotkey命令提供了可呼叫的函數.可以通過#Include把這個庫包含在任何腳本中. 參見 EN,简 Comments Signin|RecentSiteActivity|ReportAbuse|PrintPage|PoweredByGoogleSites



請為這篇文章評分?