7

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

热键、键名 [、标签、选项]

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

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

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

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

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

4

4 回答 4

8

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

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

与原作的变化:

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

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

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

arg*由于对象表示法和可变参数语法,这当然仍然依赖于 AutoHotKey 的 _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
}
于 2013-07-29T19:16:00.363 回答
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>

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

于 2012-10-13T17:13:22.257 回答
0

这是你想要的?

#Persistent
#SingleInstance Force
#installKeybdHook

Hotkey, #z, MyLabel

MyLabel:
    MsgBox,OK
Return
于 2012-10-12T08:25:19.327 回答
0

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

于 2021-04-04T18:01:29.483 回答