Autohotkey 显示自动热键热键列表
我已经编写了包含许多热键的脚本(一般结构如下)。我想创建另一个,当按下时,它会显示脚本包含在一个漂亮的格式化表中的所有热键及其相应描述的列表 由于AutoHotkey的输出仅限于消息框,因此格式和显示很脆弱,但可能会出现错误。更麻烦的是获取热键和相应的描述 热键都使用不同的参数调用相同的函数。我考虑在函数中添加一个变量,以便根据值,函数在由普通热键触发时执行普通函数,或者在由特殊显示热键触发时生成字符串或其他内容 我根本无法找到一种通过编程方式访问脚本热键的方法。我检查了文档,似乎没有任何可用于此目的的Autohotkey 显示自动热键热键列表,autohotkey,tabular,hotkeys,Autohotkey,Tabular,Hotkeys,我已经编写了包含许多热键的脚本(一般结构如下)。我想创建另一个,当按下时,它会显示脚本包含在一个漂亮的格式化表中的所有热键及其相应描述的列表 由于AutoHotkey的输出仅限于消息框,因此格式和显示很脆弱,但可能会出现错误。更麻烦的是获取热键和相应的描述 热键都使用不同的参数调用相同的函数。我考虑在函数中添加一个变量,以便根据值,函数在由普通热键触发时执行普通函数,或者在由特殊显示热键触发时生成字符串或其他内容 我根本无法找到一种通过编程方式访问脚本热键的方法。我检查了文档,似乎没有任何可用于
A_uu
变量,Hotkey
命令本身也不适用(它可用于测试热键是否存在,但在无数的组合中循环充其量是乏味的)
失败的尝试:
- 我尝试使用Elliot的建议来解析脚本本身(将路径替换为%A_ScriptFullPath%),虽然它确实适用于原始脚本,但在编译脚本时并不适用
- 我尝试将脚本的整个热键部分作为延续部分分配给变量,然后使用
命令解析变量并创建热键。这在最后一部分之前一直运行良好,因为该命令无法将任意命令作为目标,并且需要现有标签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.
我唯一能想到的是单独读取脚本的每一行并对其进行解析。此代码一次读取一行脚本(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
我找到了一个解决方案。它不是完美的(或理想的),希望将来能有一个合适的内置方法,但它很好(足够)并且适用于原始脚本和编译脚本 我所做的是使用命令告诉编译器向可执行文件添加一个文件(并在运行时提取) 遗憾的是,
FileInstall
命令不允许对源文件使用变量,因此我不能简单地包含脚本本身(FileInstall,%A\u ScriptFullPath%,%A\u Temp%\%A\u ScriptName%,1
)
作为一种解决方法,我最终将所有需要的热键提取到第二个文件中,然后按照Elliot的建议对其进行解析,然后删除,并在脚本末尾包含(必须在结尾,因为热键将终止该部分)
哎哟!这当然不理想。不过这个想法很有趣,我想它可以用于一个简单的脚本(比如这个)只需执行一次。我将检查是否有方法访问文件名而不是硬编码。可以使用
a_ScriptFullPath
而不是硬编码路径。我分析了修饰符以显示CASW
,而不是^!++
,并对空格进行了修剪。我目前正在对其进行格式化更好(不幸的是,messagebox的宽度有限,并且使用了比例字体,这意味着文本未对齐或每行有一个热键)。我可能最终会构建一个GUI来显示热键,但是上面的方法对于解析热键非常有效,特别是因为它只需要在启动时执行一次(至少在他们添加一个内置方法来访问数组或其他东西之前)。干杯。哦!大问题。如果脚本被编译,这个方法不起作用。:-(
;;;;; 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