Search code examples
autohotkeyhotkeys

Hotkey to remap keys does not trigger hotstring


I have a hotkey and hotstring that don't seem to work together:

9::(

:?ob0:(::){left 1}

To give some context, in one part of the code I remapped all the symbols to the number below them and vice versa so 9 prints the parenthesis (. Later on I put a hotstring that would type a closed parenthesis after an open one and then places the cursor in between.

Seems simple enough because they both work individually but together when I press the key for 9 and press the Spacebar I only get the open parenthesis ( as if the hotstring was ignored.

Am I missing something obvious?


Solution

  • Try using a combination of Send and InputLevel.

    #InputLevel 1
    9::SendEvent (
    #InputLevel 0
    
    ;; Add closing parenthesis
    :?ob0:(::){left 1}
    

    Explanation

    • #InputLevel

      • By default, hook hotkeys and hotstrings ignore keyboard and mouse events generated by any AutoHotkey script. This behavior can be overridden using SendLevel or #InputLevel
      • By setting the 9 hotkey to a higher InputLevel, it is able to the activate other hotstrings.
    • SendEvent

      • Bizarrely, remapping a numkey to its Shift+# equivalent produced no input when #InputLevel 1 was active.
        • i.e. Couldn't use 1::!, 2::@, 3::#, ..., 8::*, 9::(, etc.
        • A Send command was used to workaround this remapping limitation
      • By default, Send and SendEvent are synonymous with each other.

    Notes

    • SendPlay is not affected by InputLevel.
    • Remarks for Remapping Keys may explain why 9::( wouldn't trigger other hotkeys.
      • "Although a remapped key can trigger normal hotkeys, by default it cannot trigger mouse hotkeys or hook hotkeys."

    Related

    #InputLevel, Send, Remapping (Remarks)