動(dòng)態(tài)創(chuàng)建按鍵/用戶定義的按鍵/可修改的按鍵[AutoHotkey|AHK][IniRead|讀取配置文件][IniWrite|寫入配置文件][Try|Catch|嘗試|守護(hù)|異常][Hotkey...

  • 標(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 = ""
        
    • 文件內(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。

  • 寫入配置文件

    為避免因用戶錯(cuò)誤修改配置而導(dǎo)致的問題持續(xù)存在,在每次讀取配置后應(yīng)當(dāng)及時(shí)刷新文件。

    If FileExist(配置文件名)
      FileDelete, %配置文件名%
    

    通過FileExistFileDelete刪除配置文件;隨后,使用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組, 熱鍵1
    

    IniWrite, 配置鍵值, 文件名稱, 配置段名, 配置鍵名
    配置鍵值、文件名稱、配置段名、配置鍵名:字符串;可用百分號(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-CatchHotkey語句的邏輯封入函數(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)建按鍵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容