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”
看起来可能是由于手册中的以下行,但不清楚它是如何工作的:
标签 - 可以使用普通标签和热键/热字符串标签。
答案 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")
原始版本的更改:
通过将处理器子例程塞入函数中来防止意外自动执行。
允许我通过将hotkeys
变量的范围从全局范围缩小到静态来减少名称空间污染。
优化:fun
仅在热键定义时查找一次(使用Func()
);在调用时,通过将hotkeys
拆分为两个对象funs
和args
,对象查找减少了四到两个;
由于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