- 標(biāo)題:
動(dòng)態(tài)創(chuàng)建按鍵 / 用戶定義的按鍵 / 可修改的按鍵 - 標(biāo)簽:
AutoHotkey | AHK | IniRead | 讀取配置文件 | IniWrite | 寫入配置文件 | Try | Catch | 嘗試 | 守護(hù) | 異常 | Hotkey | 動(dòng)態(tài)熱鍵 | 靈活 | 適應(yīng) | 參數(shù) | 面向用戶 - 標(biāo)注:
http://www.itdecent.cn/p/bbdddfad1f08
http://www.itdecent.cn/u/1275d25b625e
在編寫對靈活性有一定要求的腳本時(shí),我們希望腳本能通過某種媒介與用戶達(dá)成一定程度上的客制化約定;這時(shí),直接把熱鍵固定在腳本中的寫法就顯得不那么妥當(dāng)。
本文將為您介紹,如何通過讀取配置文件來為腳本動(dòng)態(tài)創(chuàng)建和變更熱鍵。
-
讀取配置文件
動(dòng)態(tài)創(chuàng)建熱鍵有強(qiáng)制創(chuàng)建和適應(yīng)創(chuàng)建兩種情況,前者在需要腳本內(nèi)部提供熱鍵默認(rèn)值方面區(qū)別于后者。
Global 原始按鍵_A1 := "c" Global 原始按鍵_A2 := "e" Global 映射按鍵_A1 := "m" Global 映射按鍵_A2 := "r" Global 原始按鍵_B1 := "k" Global 映射按鍵_B1 := A_Space ; 若不強(qiáng)制創(chuàng)建熱鍵則使用此內(nèi)置變量配合IniRead語句.隨后,使用IniRead語句讀取配置文件。
Global 配置文件名 := "配置文件.ini" ; 配置文件名也可通過其他方式動(dòng)態(tài)獲取. IniRead, 原始按鍵_A1, %配置文件名%, 按鍵A組, 原鍵1, %原始按鍵_A1% IniRead, 原始按鍵_A2, %配置文件名%, 按鍵A組, 原鍵2, %原始按鍵_A2% IniRead, 映射按鍵_A1, %配置文件名%, 按鍵A組, 熱鍵1, %映射按鍵_A1% IniRead, 映射按鍵_A2, %配置文件名%, 按鍵A組, 熱鍵2, %映射按鍵_A2% IniRead, 原始按鍵_B1, %配置文件名%, 按鍵B組, 原鍵1, %原始按鍵_B1% IniRead, 映射按鍵_B1, %配置文件名%, 按鍵B組, 熱鍵1, %映射按鍵_B1%IniRead, 輸出變量, 文件名稱, 配置段名, 配置鍵名, 默認(rèn)值
輸出變量:腳本定義的變量;語句會(huì)在執(zhí)行后修改此值,不存在則創(chuàng)建。
文件名稱、配置段名、配置鍵名、默認(rèn)值:字符串;可用百分號(hào)語法置入變量。該語句對于空鍵和空值兩種情形不總是采用默認(rèn)值。您可能會(huì)想,為何不把
映射按鍵_B1初始化為""而是采用了A_Space呢?- 如果文件不存在,或文件中沒有相關(guān)鍵名,該語句會(huì)將輸出變量設(shè)置為默認(rèn)值;
- 其中,如果復(fù)制于默認(rèn)值處的變量值為空(
""),語句執(zhí)行結(jié)果為"ERROR"。Global 映射按鍵_B1 := "" IniRead, 映射按鍵_B1, %配置文件名%, 按鍵B組, 熱鍵1, %映射按鍵_B1% ; 映射按鍵_B1 = "ERROR" - 而如果默認(rèn)值處直接填寫
"",語句執(zhí)行結(jié)果為""""。IniRead, 映射按鍵_B1, %配置文件名%, 按鍵B組, 熱鍵1, "" ; 映射按鍵_B1 = """" - 若使用
A_Space,語句執(zhí)行結(jié)果可正確為空("")。Global 映射按鍵_B1 := A_Space IniRead, 映射按鍵_B1, %配置文件名%, 按鍵B組, 熱鍵1, %映射按鍵_B1% ; 映射按鍵_B1 = ""IniRead, 映射按鍵_B1, %配置文件名%, 按鍵B組, 熱鍵1, %A_Space% ; 映射按鍵_B1 = ""
- 其中,如果復(fù)制于默認(rèn)值處的變量值為空(
- 文件內(nèi)有鍵而沒有值,該語句通常將輸出變量設(shè)置為空(
"")。[按鍵B組] 熱鍵1=IniRead, 映射按鍵_B1, %配置文件名%, 按鍵B組, 熱鍵1, 我是默認(rèn)值 ; 映射按鍵_B1 = ""
為使得兩種情況皆可使用空值表達(dá)式進(jìn)行判斷,非強(qiáng)制創(chuàng)建的熱鍵默認(rèn)值應(yīng)初始化為
A_Space。 - 如果文件不存在,或文件中沒有相關(guān)鍵名,該語句會(huì)將輸出變量設(shè)置為默認(rèn)值;
-
寫入配置文件
為避免因用戶錯(cuò)誤修改配置而導(dǎo)致的問題持續(xù)存在,在每次讀取配置后應(yīng)當(dāng)及時(shí)刷新文件。
If FileExist(配置文件名) FileDelete, %配置文件名%通過FileExist和FileDelete刪除配置文件;隨后,使用IniWrite語句寫入配置文件。
IniWrite, %原始按鍵_A1%, %配置文件名%, 按鍵A組, 原鍵1 IniWrite, %原始按鍵_A2%, %配置文件名%, 按鍵A組, 原鍵2 IniWrite, %映射按鍵_A1%, %配置文件名%, 按鍵A組, 熱鍵1 IniWrite, %映射按鍵_A2%`n, %配置文件名%, 按鍵A組, 熱鍵2 IniWrite, %原始按鍵_B1%, %配置文件名%, 按鍵B組, 原鍵1 IniWrite, %映射按鍵_B1%, %配置文件名%, 按鍵B組, 熱鍵1IniWrite, 配置鍵值, 文件名稱, 配置段名, 配置鍵名
配置鍵值、文件名稱、配置段名、配置鍵名:字符串;可用百分號(hào)語法置入變量。 -
檢查按鍵有效性
AutoHotkey沒有在If var is [not] type中提供類似
key的類型,我們需要用其它判定邏輯趕在腳本拋出錯(cuò)誤之前得知用戶所提供的的按鍵是否是一個(gè)有效的按鍵;其意義不僅僅是將冗長難懂的報(bào)錯(cuò)翻譯成簡短精煉的信息以彰顯腳本的健壯程度,更多是因?yàn)榻?jīng)過編譯的可執(zhí)行文件甚至沒有報(bào)錯(cuò)環(huán)節(jié)來告知用戶腳本正在發(fā)生的問題——錯(cuò)誤會(huì)潛伏在不知覺中向未來帶去危險(xiǎn)。檢查按鍵有效性(按鍵名稱) { ; 函數(shù): 當(dāng)參數(shù)不是有效按鍵時(shí)告知用戶并退出腳本. If !是有效按鍵(按鍵名稱) { ; 如果不是有效按鍵, MsgBox , 16, ERROR, 無法解析的按鍵名稱: "%按鍵名稱%".;通過消息框顯示問題, IfMsgBox, OK, ExitApp ; 然后在用戶確認(rèn)后退出腳本. } } ; END FUNC : 檢查按鍵有效性 / 是有效按鍵(按鍵名稱) { ; 函數(shù): 當(dāng)參數(shù)不是有效按鍵時(shí)返回0, 否則返回1. Try Hotkey, %按鍵名稱%, 是有效按鍵_內(nèi)部標(biāo)簽, Off ; 嘗試以關(guān)閉模式創(chuàng)建臨時(shí)熱鍵; Catch ; 當(dāng)熱鍵創(chuàng)建失敗時(shí)- Return 0 ; 返回0, Return 1 ; 否則返回1. 是有效按鍵_內(nèi)部標(biāo)簽: ; 不會(huì)被調(diào)用的空標(biāo)簽. } ; END FUNC : 是有效按鍵 /將使用Try-Catch和Hotkey語句的邏輯封入函數(shù),隨后按順序調(diào)用檢查。
; 對于需要大量檢查的情況請考慮使用數(shù)組和循環(huán). 檢查按鍵有效性(原始按鍵_A1) 檢查按鍵有效性(原始按鍵_A2) 檢查按鍵有效性(映射按鍵_A1) 檢查按鍵有效性(映射按鍵_A2) 檢查按鍵有效性(原始按鍵_B1) If (映射按鍵_B1 != "") ; 對于非強(qiáng)制創(chuàng)建的熱鍵應(yīng)先判斷其內(nèi)容是否為空. 檢查按鍵有效性(映射按鍵_B1)Hotkey, 按鍵名稱, 標(biāo)簽名稱/狀態(tài)選項(xiàng), 選項(xiàng)
按鍵名稱、標(biāo)簽名稱:字符串;可用百分號(hào)語法置入變量。
狀態(tài)選項(xiàng)、選項(xiàng):特定值。 -
檢查和創(chuàng)建熱鍵
檢查與創(chuàng)建流程通常發(fā)生在相近位置,除非有特殊需求將它們分離。
創(chuàng)建熱鍵(按鍵名稱, 標(biāo)簽名稱, 啟用檢查 := 1) { ; 函數(shù): 檢查按鍵名稱并為指定標(biāo)簽創(chuàng)建熱鍵. If 啟用檢查 ; 如果需要對按鍵進(jìn)行名稱檢查- 檢查按鍵有效性(按鍵名稱) ; 則調(diào)用檢查函數(shù), Hotkey, 按鍵名稱, 標(biāo)簽名稱, On ; 否則直接以啟用模式創(chuàng)建熱鍵. } ; END FUNC : 創(chuàng)建熱鍵 /將檢測邏輯與創(chuàng)建語句一同封入函數(shù),上文所展示的順序檢查可替換如下。
檢查按鍵有效性(原始按鍵_A1) 檢查按鍵有效性(原始按鍵_A2) 創(chuàng)建熱鍵(映射按鍵_A1, "測試標(biāo)簽") 創(chuàng)建熱鍵(映射按鍵_A2, "測試標(biāo)簽") If (映射按鍵_B1 != "") { ; 對于非強(qiáng)制創(chuàng)建的熱鍵應(yīng)先判斷其內(nèi)容是否為空. 檢查按鍵有效性(原始按鍵_B1) 創(chuàng)建熱鍵(映射按鍵_B1, "測試標(biāo)簽") } Return ; END AUTO-EXECUTE | 測試標(biāo)簽: ; 標(biāo)簽: 僅供測試. MsgBox, %A_ThisHotkey% Return ; END LABEL : 測試標(biāo)簽 /可用IsLabel語句檢查動(dòng)態(tài)標(biāo)簽是否存在,就像動(dòng)態(tài)按鍵那樣。
一個(gè)標(biāo)簽可對應(yīng)多個(gè)熱鍵,而單個(gè)熱鍵只能對應(yīng)一個(gè)標(biāo)簽;基于此特性,上述文中先把所有按鍵創(chuàng)建于同一標(biāo)簽,然后再逐一頂替和啟用。
至此,腳本已可動(dòng)態(tài)創(chuàng)建按鍵。