动态创建AutoHotkey热键到功能/子例程

时间:2012-10-12 03:12:51

标签: function dynamic hotkeys autohotkey subroutine

AutoHotkey命令Hotkey允许在运行时创建动态热键,但其语法和文档似乎将其限制为内置或现有标签/子例程,这使得很多不太有用:

  

Hotkey,KeyName [,Label,Options]

有没有办法让它像普通的硬编码热键一样工作?例如:

#z::MsgBox foobar        ; Typical, hard-coded hotkey pops up a message-box

Hotkey, z, MsgBox foobar ; Nope; complains about missing label “MsgBox foobar”

看起来可能是由于手册中的以下行,但不清楚它是如何工作的:

  

标签 - 可以使用普通标签和热键/热字符串标签。

4 个答案:

答案 0 :(得分:7)

在AutoHotkey中无法完全按照您的要求进行操作。这是我能想到的最接近的方式。

将此文件称为Hotkeys.ahk,并将其放入My Documents/AutoHotkey/Lib。或者创建一个名为Lib的文件夹,并将其放在与主脚本相同的目录中。

Hotkeys := {}

Hotkey(hk, fun, p*) {
    global hotkeys
    hotkeys[hk] := {}
    hotkeys[hk].fun := fun
    hotkeys[hk].p := p
    Hotkey, %hk%, HandleHotkey
}

HandleHotkey:
hotkeys[A_ThisHotkey].fun(hotkeys[A_ThisHotkey].p*)
return

以下是您可以使用它的示例脚本。

Hotkey("e", "msgbox", "foobar")

MsgBox(msg) {
    msgbox % msg
}

#Include <Hotkeys>

第一个参数是热键,第二个参数是要调用的函数,之后的所有内容都传递给函数。

答案 1 :(得分:7)

这是对FakeRainBrigand的回答的改进。它使用完全相同:

Hotkey("x", "Foo", "Bar") ; this defines:  x:: Foo("Bar")

原始版本的更改:

  1. 通过将处理器子例程塞入函数中来防止意外自动执行

  2. 允许我通过将hotkeys变量的范围从全局范围缩小到静态来减少名称空间污染

  3. 优化fun仅在热键定义时查找一次(使用Func());在调用时,通过将hotkeys拆分为两个对象funsargs,对象查找减少了四到两个;

  4. 由于Object符号和可变arg*语法,这当然依赖于AutoLotKey的_L版本。

    Hotkey(hk, fun, arg*) {
        Static funs := {}, args := {}
        funs[hk] := Func(fun), args[hk] := arg
        Hotkey, %hk%, Hotkey_Handle
        Return
    Hotkey_Handle:
        funs[A_ThisHotkey].(args[A_ThisHotkey]*)
        Return
    }
    

答案 2 :(得分:0)

这是你在找什么?

#Persistent
#SingleInstance Force
#installKeybdHook

Hotkey, #z, MyLabel

MyLabel:
    MsgBox,OK
Return

答案 3 :(得分:0)

在较新的 ahk 版本中,您现在可以使用函数作为标签参数。见https://www.autohotkey.com/docs/commands/Hotkey.htm