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”
由于手册中的以下行,这似乎是可能的,但尚不清楚它是如何工作的:
Label - Both normal labels and hotkey/hotstring labels can be used.
最佳答案
这是 FakeRainBrigand 答案的改进。它的用法完全相同:
Hotkey("x", "Foo", "Bar") ; this defines: x:: Foo("Bar")
与原始版本相比的变化:
通过将处理程序子例程塞入函数中来防止意外自动执行。
允许我通过将
hotkeys
变量的范围从全局缩小到静态来减少命名空间污染。优化:
fun
在热键定义时仅查找一次(使用Func()
);在调用时,通过将hotkeys
拆分为两个对象funs
和args
,对象查找减少了四到两个;
由于对象表示法和可变 arg*
语法,这当然仍然依赖于 _L 版本的 AutoHotKey。
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
}
关于function - 动态创建函数/子程序的 AutoHotkey 热键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12851677/