2

我编写了包含许多热键的脚本(一般结构如下)。我想创建另一个,按下时会显示所有热键的列表及其相应的描述,脚本包含在一个漂亮的格式化表格中。

由于 AutoHotkey 的输出仅限于消息框,因此格式化和显示很脆弱,但可能。更多问题是获取热键和相应的描述。

热键都使用不同的参数调用相同的函数。我考虑向函数添加一个变量,以便根据值,该函数在由普通热键触发时执行正常功能,或者在由特殊显示热键触发时构建字符串或其他内容。

我根本想不出一种以编程方式访问脚本热键的方法。我检查了文档,似乎没有任何A_变量可用于此目的,该Hotkey命令也不能很好地发挥作用(它可用于测试是否存在热键,但循环遍历无数组合是,在最好的,乏味的)。

失败的尝试:

  • 我尝试使用 Elliot 的解析脚本本身的建议(用 %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.
4

2 回答 2

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
于 2012-10-03T16:48:23.080 回答
0

我找到了解决方案。它并不完美(或理想),希望将来可以使用适当的内置方法,但它工作得很好(足够)并且适用于原始和编译的脚本。

我所做的是使用FileInstall命令告诉编译器将文件添加到可执行文件(并在运行时提取它)。

遗憾的是,该FileInstall命令不允许对源文件使用变量,因此我不能简单地包含脚本本身(FileInstall, %A_ScriptFullPath%, %A_Temp%\%A_ScriptName%, 1)。

作为一种解决方法,我最终将所有所需的热键提取到第二个文件中,然后按照 Elliot 的建议进行解析,然后删除,并#Include在我的脚本末尾(它必须在末尾,因为热键将终止自动执行部分)。

;;;;; 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
于 2012-10-12T17:42:35.630 回答