Loop { Input ch, I L1 V HOTY = %HOT% HOT = } NumpadEnter:: ; use your favorite trigger key here ^Space:: ; just another example If (Asc(A_PriorHotKey) = Asc(":") and HOTY <> "") Send % "{BS " StrLen(A_PriorHotKey)-5 "}" HOTY Return :*B0:rtfm:: HOT = read the fantastic manual Return :*B0:btw:: HOT = by the way ReturnThe HotStrings now don't require ending characters (*) and they don't erase the typed abbreviation (B0). They only assign the replacement text to the variable HOT.
There is an infinite loop, monitoring the characters typed. Whenever a new alphanumeric key is entered, the HOTY variable gets the value of the HOT variable, which, in turn, gets erased. It means that at the last key of a HotString the HOTY variable contains the active replacement text, but pressing any other alphanumeric key will move the already empty HOT variable to HOTY.
The desired end-characters are defined as HotKeys. They check if the previous HotKey was a HotString (their labels start with ":") and if the HOTY variable is not empty, that is, the end-char immediately follows the last HotString abbreviation. If yes, the abbreviation is erased with the right number of backspaces (5 more than the abbreviation, for the ":*B0:") and the replacement text, contained in HOTY, is sent to the active window.