function - 动态创建函数/子程序的 AutoHotkey 热键

标签 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”

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

Label - Both normal labels and hotkey/hotstring labels can be used.

最佳答案

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

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

与原始版本相比的变化:

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

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

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

由于对象表示法和可变 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/

相关文章:

C# 全局热键在第一次最小化到托盘时不起作用,但在显示并再次最小化后它可以工作

arrays - C中偶数数组的递归

c# - 从 C# 在我的数据库中创建一个表用户定义函数

javascript - 将数据发送到 parse.com 并更新 Angular $scope

PHP 试图在类中创建动态变量

.net - C# Hide() 在启动时,没有 ShowInTaskbar 为 false

javascript - 函数中的变量范围

无法在结构中声明二维动态数组

c++ - 可变类型 vector 的 vector

delphi - 找出哪个进程注册了全局热键? (Windows API)