Dynamically Create AutoHotkey Hotkey to Function/Subroutine
autohotkey, dynamic, function, hotkeys, subroutine
Solution
Doing exactly what you want isn't possible in AutoHotkey. This is the closest way I can think of.
Call this file `Hotkeys.ahk`, and put it in `My Documents/AutoHotkey/Lib`. Alternatively make a folder called Lib, and put it in the same directory as your main script.
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
Here's an example script that you could use it with.
Hotkey("e", "msgbox", "foobar")
MsgBox(msg) {
msgbox % msg
}
#Include <Hotkeys>
The first parameter is the hotkey, the second is the function to call, and everything after that is passed to the function.
Problem
The AutoHotkey command `Hotkey` allows for the creation of dynamic hotkeys at runtime, but its syntax and documentation seems to limit it to built-in or existing labels/subroutines, which makes it much less useful: Hotkey, KeyName [, Label, Options] Is there a way to get it to work like regular, hard-coded hotkeys? For example: ``` #z::MsgBox foobar ; Typical, hard-coded hotkey pops up a message-box Hotkey, z, MsgBox foobar ; Nope; complains about missing label “MsgBox foobar” ``` It looks like it might be possible due to the following line from the manual, however it is not clear how it would work: Label - Both normal labels and hotkey/hotstring labels can be used.