显示 AutoHotkey 热键列表

Posted

技术标签:

【中文标题】显示 AutoHotkey 热键列表【英文标题】:Displaying List of AutoHotkey Hotkeys 【发布时间】:2012-09-22 23:26:33 【问题描述】:

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

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

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

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

尝试失败:

我尝试使用 Elliot 的建议来解析脚本本身(将路径替换为 %A_ScriptFullPath%,虽然它适用于原始脚本,但在编译脚本时却不起作用 我尝试将脚本的整个热键部分分配给一个变量作为延续部分,然后解析变量并使用Hotkey 命令创建热键。这一直到最后一部分都运行良好,因为Hotkey 命令不能将任意命令作为目标,并且需要现有标签。 ListHotkeys 命令不适用,因为它仅在控制窗口中将热键显示为纯文本。

有谁知道如何显示热键列表及其对应的参数或 cmets?


示例脚本:
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.

【问题讨论】:

【参考方案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

【讨论】:

哎哟!这当然不理想。不过有趣的想法,我想它可以用于一个简单的脚本(比如这个),并且只需要完成一次。我会检查是否有办法访问文件名而不是硬编码。 可以使用A_ScriptFullPath,而不是硬编码路径。我解析了修饰符以显示CASW 而不是^!+#,并修剪了空白。我目前正在努力对其进行更好的格式化(不幸的是,消息框的宽度有限,并且使用了比例字体,这意味着文本未对齐或每行一个热键)。我可能最终会构建一个 GUI 来显示热键,但是上面的方法可以很好地解析它们,特别是因为它只需要在启动时完成一次(至少在他们添加一个内置方法来访问它们之前)在数组或其他东西中)。干杯。 哦哦!大问题。如果脚本被编译,此方法不起作用。 :-(【参考方案2】:

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

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

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

作为一种解决方法,我最终将所有所需的热键提取到第二个文件中,然后按照 Elliot 的建议进行解析,然后删除,并在我的脚本末尾添加 #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

【讨论】:

以上是关于显示 AutoHotkey 热键列表的主要内容,如果未能解决你的问题,请参考以下文章

autohotkey:停止/结束包含多个块的当前热键线程

开机时自动启动的AutoHotkey脚本

AutoHotkey 初探

Autohotkey 同时多个热键(中键、左键、鼠标右键同时按下)

如何强制 Windows 忽略 AutoHotKey 并将该热键直接传递给活动窗口?

推荐一款轻量小众却高效免费开源windows热键脚本语言Autohotkey