KeyChord is a class for AutoHotkey v2 that allows you to create complex key chords (key sequences, key chains, whatever you want to call them). It enables you to bind multiple actions to a series of keystrokes, creating a flexible and customizable hotkey system. KeyChord extends the Map class, and as such all of it's methods and properties are available, and they can be enumerated.
Thank you to Descolada, The __Enum method was really cleared up for me after reading a discord post they made.
Thank you to Nikola for the MouseHook script that helped me understand DllCalls and aided in the creation of the KCInputHook class.
- Create nested key chord sequences
 - Support for various types of actions (strings, numbers, functions, and nested KeyChords, to name a few)
 - Customizable timeout for key input
 - Mouse Button support (
Lbutton,RButton,XButton1, etc...) - Conditional actions. Only executed if the attached condition is true.
- Conditions can be any valid expression that evaluates to true or false.
 - Conditions can not be set on hotkeys that fire a nested KeyChord. This is a known limitation, and I may fix this in the future.
 
 - Wildcard key matching
?matches any single character producing key, likec,a, or9. (noNumpad4,PgUp,Delete, etc...)*can be used to match key names and represent multiple valid candidates.F*would match any keyF1toF24.F1*would match any keyF1, andF10-F19Num*would match any key that starts with Num (Numpad1,NumLock,NumpadEnd, etc...)*PgUpwould matchPgUporNumpadPgUp
a-bis the range operator. It matches any key in the ascii rangeatobinclusive.a-f,0-9, etc...- This matches based on the numeric character code (Ord), so any ASCII range where 
Ord(a) <= Ord(b)is valid. :-@would match any of the following characters::,;,<,=,>,?,@(ASCII Range 58-64).- ASCII Character Table
 
- This matches based on the numeric character code (Ord), so any ASCII range where 
 
 - Useful Help window that can be attached to a hotkey.
 - KeyChord class is fully enumerable, returning up to 5 values.
 KeyChord.Transform(func)function provides a powerful way to modify your KeyChords.
class KeyChord
- 
KeyChord(actions*)actions*: A list of KCAction objects to add to the KeyChord, optional
exampleChord := KeyChord( KCAction("^a", Send.Bind("^a"), True, "Select all"), KCAction("^c", Send.Bind("^c"), True, "Copy") ) exampleChord := KeyChord({ Key: "^a", Command: () => Send("^a"), Condition: True, Description: "Select all" }, { Key: "^c", Command: Send.Bind("^c"), Condition: True, Description: "Copy" } ) - 
- Native:
RemindKeys: Whether to remind the user of the keys in the KeyChordLength: The number of actions in the KeyChord
 
 - Native:
 - 
- 
Native:
- 
AddActions(actions*)- Adds one or more KCAction objects to the KeyChord
 actions*: The KCAction objects to add
exampleAction := KCAction("^m", Run.Bind("notepad"), () => (A_Hour > 12)) exampleChord := KeyChord() exampleChord.Add(exampleAction)
 - 
Set(key, action, condition := True, description := "Description not set.")- Sets a key-action pair in the KeyChord
 key: The key which the user will press to executeactionaction: The action to execute when the user presseskeycondition: A condition to evaluate before executing the action, optionaldescription: A description of the action, optional
exampleChord := KeyChord() exampleChord.Set("^s", "Save File", True, "Saves the current file")
 - 
Get(key)- Gets a 
KCActionfrom the KeyChord, given a key key: The key to get the action for- Returns: 
KCActionobject 
action := exampleChord.Get("^s") MsgBox(action.Description)
 - Gets a 
 - 
Has(key)- Checks if the KeyChord contains a key
 key: The key to check for- Returns: Boolean
 
if exampleChord.Has("^s") MsgBox("Save action exists")
 - 
Remove(key)- Removes an action by key
 key: The key of the action to remove
exampleChord.Remove("^s")
 - 
Clear()- Removes all actions from the KeyChord
 
exampleChord.Clear()
 - 
Merge(keychords*)- Merges this KeyChord with other KeyChords
 keychords*: The KeyChords to merge with- Returns: This KeyChord with merged actions
 
chord1 := KeyChord(KCAction("^a", "Select All")) chord2 := KeyChord(KCAction("^c", "Copy")) mergedChord := chord1.Merge(chord2)
 - 
SortByKey()- Returns a new KeyChord with actions sorted by key
 - Returns: New KeyChord with sorted actions
 
sortedChord := exampleChord.SortByKey()
 - 
ValidateAll()- Validates all actions in the KeyChord
 - Returns: Boolean indicating if all actions are valid
 
if exampleChord.ValidateAll() MsgBox("All actions are valid")
 - 
Clone()- Creates a deep copy of the KeyChord
 - Returns: New KeyChord with copied actions
 
clonedChord := exampleChord.Clone() - 
FindIndexes(comparisonFunc)- Finds indexes of actions that match a given comparison function
 comparisonFunc: A function that takes an action and returns true if it matches the criteria- Returns: Array of indexes where matching actions are found
 
indexes := exampleChord.FindIndexes((action) => action.Key == "^s") - 
FirstIndexOf(key)- Finds the index of the first occurrence of a key
 key: The key to search for- Returns: Integer index of the first occurrence of the key, or 0 if not found
 
index := exampleChord.FirstIndexOf("^s") - 
LastIndexOf(key)- Finds the index of the last occurrence of a key
 key: The key to search for- Returns: Integer index of the last occurrence of the key, or 0 if not found
 
index := exampleChord.LastIndexOf("^s") - 
AllIndexesOf(key)- Finds all indexes of a key
 key: The key to search for- Returns: Array of all indexes where the key is found
 
indexes := exampleChord.AllIndexesOf("^s") - 
Transform(func, filterMode := false)- Transforms the KeyChord by applying a function to each action
 func: The function to apply to each actionfilterMode: If true, filters out actions for which func returns false- Returns: New KeyChord with transformed actions
 
transformedChord := exampleChord.Transform((action) => (action.Description .= " (modified)"))
 - 
FindTrue(key)- Finds actions with true conditions for a given key
 key: The key to search for- Returns: KeyChord with matching actions
 
trueActions := exampleChord.FindTrue("^s") - 
FirstTrue(key)- Finds the first action with a matching key and true condition
 key: The key to match- Returns: KCAction or undefined if none found
 
firstTrueAction := exampleChord.FirstTrue("^s") - 
LastTrue(key)- Finds the last action with a matching key and true condition
 key: The key to match- Returns: KCAction or undefined if none found
 
lastTrueAction := exampleChord.LastTrue("^s") - 
GetCommandsByType(type)- Returns all commands of a specific type
 type: The type of commands to return- Returns: Array of commands of the specified type
 
stringCommands := exampleChord.GetCommandsByType("String") - 
ToString(indent := "")- Returns a string representation of the KeyChord, including nested KeyChords
 indent: The indentation string for formatting nested structures- Returns: Formatted string representation of the KeyChord
 
chordString := exampleChord.ToString() MsgBox(chordString) 
 - 
 - 
Static:
- 
MatchKey(pattern, input)- Matches a key pattern against an input
 pattern: The key pattern to matchinput: The input to match against- Returns: Boolean indicating if the input matches the pattern
 
if KeyChord.MatchKey("^p-t", "^s") MsgBox("Key matched!")
 
 - 
 
 - 
 
class KCAction
- 
KCAction(key, command, condition?, description?)key: The key or key combination that triggers the action.command: The command to execute when the action is triggered.condition: (Optional) A condition that must be true for the action to be executed.description: (Optional) A description of the action.
action := KCAction("a", () => MsgBox("A pressed"), () => true, "Press A to show message")
 - 
- 
Key: The key or key combination that triggers the action. - 
Command: The command to execute when the action is triggered. - 
Condition: The condition that must be true for the action to be executed. - 
Description: A description of the action. - 
ReadableKey: A human-readable representation of the key.action := KCAction("^a", Run.Bind("notepad")) MsgBox(action.Key) ; Displays "^a" MsgBox(action.ReadableKey) ; Displays "Ctrl+a"
 
 - 
 - 
- Native:
- 
Execute(timeout?, parent_key?)- Executes the action.
 timeout: (Optional) The timeout for execution.parent_key: (Optional) The parent key string.
action.Execute(5, "Ctrl+a") ; Executes the action with a 5-second timeout and "Ctrl+a" as the parent key
 - 
IsTrue()- Checks if the condition for the action is true.
 - Returns: 
Boolean- True if the condition is met, False otherwise. 
if (action.IsTrue()) MsgBox("Action condition is true")
 - 
ToString(indent?)- Returns a string representation of the action.
 indent: (Optional) The indentation string for formatting.- Returns: 
String- A formatted string representation of the action. 
MsgBox(action.ToString(" ")) ; Displays the action details with 2-space indentation
 - 
static EqualsObject(obj)- Checks if an object is equivalent to a KCAction.
 obj: The object to compare.- Returns: 
Boolean- True if the object is equivalent to a KCAction, False otherwise. 
obj := {Key: "a", Command: () => MsgBox("A pressed"), Condition: () => true, Description: "Press A to show message"} if (KCAction.EqualsObject(obj)) MsgBox("Object is equivalent to a KCAction") 
 - 
 
 - Native:
 
class KCManager
- 
- 
Native:
- 
TimedToolTip(text, duration?)- Displays a timed tooltip
 text: The text to displayduration: The duration to display the tooltip in seconds, optional. Defaults to 3 seconds.
KCManager.TimedToolTip("Hello, World!", 5)
 - 
Execute(keychord, mode := 1, timeout := 3, parent_key := A_ThisHotkey)- Executes a KeyChord
 keychord: The KeyChord to executemode: The execution mode (1: first, 2: last, 3: all), optionaltimeout: The timeout for execution in seconds, optionalparent_key: The parent key string, optional- Returns: Boolean indicating if execution was successful
 
myKeyChord := KeyChord() myKeyChord.Set("a", () => MsgBox("A pressed")) result := KCManager.Execute(myKeyChord, 1, 5)
 - 
GetUserInput(timeout := 0)- Gets user input for a KeyChord
 timeout: The timeout for input in seconds- Returns: String representing the user's input
 
userInput := KCManager.GetUserInput(5) MsgBox("User pressed: " . userInput)
 - 
Help(keychord, parent_key := A_ThisHotkey)- Displays help for a KeyChord
 keychord: The KeyChord to display help forparent_key: The parent key string, optional
myKeyChord := KeyChord() myKeyChord.Set("a", () => MsgBox("A pressed"), , "Press A for message") KCManager.Help(myKeyChord, "Ctrl+")
 - 
ParseKey(key)- Parses a key string into a more readable format
 key: The key string to parse- Returns: String representing the parsed key string
 
parsedKey := KCManager.ParseKey("^!a") MsgBox("Parsed key: " . parsedKey) ; Displays "Parsed key: Ctrl+Alt+a"
 
 - 
 
 - 
 - 
- 
Native:
- 
Create()- Creates or returns the existing BlockingOverlay instance
 
KCManager.BlockingOverlay.Create()
 - 
Destroy()- Destroys the BlockingOverlay instance
 
KCManager.BlockingOverlay.Destroy()
 
 - 
 
 -