2012-10-02 103 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

相关问题