2012-10-02 96 views
1

我已經編寫了包含許多熱鍵的腳本(一般結構如下)。我想創建另一個按下時顯示一個列表中的所有熱鍵及其相應的描述,腳本包含在一個不錯的格式化表格中。顯示AutoHotkey熱鍵列表

由於AutoHotkey的輸出僅限於消息框,但可能會導致格式化和顯示效果不佳。更麻煩的是獲取熱鍵和相應的描述。

熱鍵全部調用具有不同參數的相同函數。我考慮在函數中添加一個變量,以便取決於該值,函數可以在普通熱鍵​​觸發時執行普通函數,或者在特殊顯示熱鍵觸發時生成字符串或其他內容。

我找不出一種以編程方式訪問腳本的熱鍵的方法。我檢查了文檔,似乎沒有任何A_變量可以用於此目的,Hotkey命令也不適用(它可以用來測試熱鍵是否存在,但循環無數組合是,至多,單調乏味)。

失敗的嘗試:

  • 我嘗試使用解析腳本本身(替換用%A_ScriptFullPath%的路徑艾略特的建議,雖然它的工作爲原始腳本,當腳本編譯它不
  • 我試着將腳本的整個熱鍵部分分配給一個變量作爲延續部分,然後使用Hotkey命令解析變量並創建熱鍵。直到最後一部分這個工作正常,因爲Hotkey命令不能執行任意命令作爲目的地,並要求已有標籤。
  • ListHotkeys命令不適用,因爲它只在控制窗口中以純文本形式顯示熱鍵。

有誰知道我可以如何顯示熱鍵列表及其相應的參數或註釋?


示例腳本:

SomeFunc(foobar) 
{ 
    MsgBox %foobar% 
} 

     !^#A::SomeFunc("a") ; blah 
^+NumpadMult::SomeFunc("c") ; blivet 
     ^+!#`::SomeFunc("b") ; baz 
     ^#Space::SomeFunc("d") ; ermahgerd 
… 

實施例期望的「輸出」:

C+A+ W+ A a | C+ S+ NumpadMult b 
------------------+---------------------- 
C+A+S+W+ ` c | C+ W+ Space  d 

Ctrl Alt Shift Win Key   Action 
----------------------------------------- 
× ×   × A   blah 
×  ×   NumpadMult baz 
× × ×  × `   blivet 
×    × Space  ermahgerd 

etc. 

回答

0

我找到了解決方案。它不是完美的(或理想的),並且希望將來可以使用適當的內置方法,但它可以很好地運行(足夠),並且適用於原始腳本和編譯腳本。

我所做的就是使用FileInstall命令,它告訴編譯器向可執行文件添加一個文件(並在運行時解壓縮它)。

不幸的是,FileInstall命令將不允許使用源文件的變量,所以我不能簡單地包含腳本本身(FileInstall, %A_ScriptFullPath%, %A_Temp%\%A_ScriptName%, 1)。

作爲一種變通,我結束了所有需要的熱鍵提取到第二個文件,然後我解析爲艾略特建議,然後刪除,並#Include在我的腳本結束(它必須是在因爲熱鍵將終止autoexecute部分)。

;;;;; Test.ahk ;;;;; 

; Add hotkey file to executable and extract to Temp directory at runtime 
FileInstall, Hotkeys.ahk, %A_Temp%\Hotkeys.ahk, 1 

Loop 
{ 
    ;Read a line from the extracted hotkey script and quit if error 
    FileReadLine, line, %A_Temp%\Hotkeys.ahk, %A_Index% 
    if ErrorLevel 
     break 

    ;Trim whitespace 
    line=%line% 

    ; Parse the line as in Elliot’s answer, but with tweaks as necessary 
    ParseHotkey(line) 
    … 
} 

FileDelete, %A_Temp%\Hotkeys.ahk ; Delete the extracted script 
DisplayHotkeys()     ; I ended up bulding and using a GUI instead 
#Include, Hotkeys.ahk   ; It is included at compile-time, so no A_Temp 



;;;;; Hotkeys.ahk ;;;;; 

z::MsgBox foo 
y::MsgBox bar 
1

我能想到的唯一的一點是要讀取的每行你的腳本單獨解析它。此代碼一次讀取一行腳本(script.ahk)並解析它。這應該讓你開始。另外,你也可以解析該行來檢查修飾符。

Loop 
{ 
    FileReadLine, line, C:\script.ahk, %A_Index% 
    if ErrorLevel 
     break 

    If Instr(line, "::") 
    { 
     StringSplit, linearray, line, ::, 

     key := linearray1 
     StringSplit, commandarray, linearray3, `; 

     action := commandarray2 

     hotkeyline := "key: " . key . "`tAction: " . action 
     final .= hotkeyline . "`r" 

    } 
} 
msgbox % final 

return 
+0

哎唷!這當然不是理想的。雖然有趣的想法,我想它可以爲一個簡單的腳本(像這樣),只需要做一次。我會檢查是否有一種方法可以訪問文件名,而不是硬編碼。 – Synetech

+0

而不是硬編碼路徑,可以使用'A_ScriptFullPath'。我解析了修飾符以顯示'CASW'而不是'^!+#',並修剪了空白。目前我正在更好地格式化它(不幸的是,messagebox的寬度有限,並使用比例字體,這意味着文本未對齊或每行一個熱鍵)。我可能最終會構建一個GUI來顯示熱鍵,但上面的方法對解析它們非常適用,尤其是因爲它只需在啓動時執行一次(至少在添加內置方法以訪問它們在一個數組或其他東西)。乾杯。 – Synetech

+0

呃哦!大問題。如果編譯腳本,此方法不起作用。 '':-( – Synetech