functiondynamichotkeysautohotkeysubroutine

Dynamically Create AutoHotkey Hotkey to Function/Subroutine


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.


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.