Welcome back.
This is one I made and use regularly:
;
; AutoHotkey Version: 1.1.36.02
; Script Version: 0.5.0
; Language: English
; Platform: Win 11
; Author: Drake <https://wowlazymacros.com/u/drake>
;
; Script Function:
; Easy configure action key spam toggle with robust modifier keys support. Set your
; activation key, and save. Start the macro by pressing that key, and insert modifiers
; by holding down any combination of alt, ctrl, and shift. Stop the macro by pressing
; the activation key again. A non-interactable display in the top-center of your
; monitor will tell you if the macro is currently active (toggleable).
;
; Of Note:
; Testing in-game found that wow does not recognize the difference between left and
; right modifier keys in their macros. That still leaves 8 total combinations when you
; include [nomod].
; Additionally:
; Some modifier and hotkey combos do not work as expected. Particularly Shift+Numpad or letters
;
; Please make sure you are running the lastest version of AutoHotKey <https://www.autohotkey.com/>
;
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
#SingleInstance Force
#MaxThreadsPerHotkey 2
; ================= Start User Configurable Values =================
SingleKeySpam := true ; Pressing a hotkey will disable any other hotkeys
monitor := true ; Set if monitor display is active
; βββββββββββ
; β Block A β
; βββββββββββ
ActiveA := true ; Set to use this key block
RunSpeedA := "250" ; Milliseconds delay between keypresses
KeyPressA := "XButton2" ; Set the mouse or keyboard key to start macro
KeySpamA := "=" ; Set the ingame key being spammed
; βββββββββββ
; β Block B β
; βββββββββββ
ActiveB := true
RunSpeedB := "250"
KeyPressB := "+XButton2"
KeySpamB := "-"
; βββββββββββ
; β Block C β
; βββββββββββ
ActiveC := false
RunSpeedC := "200"
KeyPressC := "1"
KeySpamC := "1"
; ================= End User Configurable Values =================
; ================= Start Macro Monitor =================
if (monitor)
_mvar := ""
if not monitor
_mvar := "hide "
MacroRunning := false
UpdateMonitor()
{
global
If(!MacroRunning) and (ToggleA or ToggleB or ToggleC) {
MacroRunning := true
Progress, M B1 X5 Y5 C1 W75 ZH-5 ZX0 ZY0 FM0 FS25 WM1 WS600 CT40FF06 CW000000, ON,,ON,Verdana
} Else If(MacroRunning) and not (ToggleA or ToggleB or ToggleC) {
MacroRunning := false
Progress, Off
}
RunningA := ((ToggleA) ? "On " : "Off" )
RunningB := ((ToggleB) ? "On " : "Off" )
RunningC := ((ToggleC) ? "On " : "Off" )
MonitorText := ""
If(ActiveA) {
MonitorText .= """" KeyPressA """ -> " KeySpamA " @" RunSpeedA "ms | " RunningA "`n"
}
If(ActiveB) {
MonitorText .= """" KeyPressB """ -> " KeySpamB " @" RunSpeedB "ms | " RunningB "`n"
}
If(ActiveC) {
MonitorText .= """" KeyPressC """ -> " KeySpamC " @" RunSpeedC "ms | " RunningC "`n"
}
ModKeys := ""
if GetKeyState("Shift", "P")
{
ModKeys .= "shift+"
}
if GetKeyState("Ctrl", "P")
{
ModKeys .= "ctrl+"
}
if GetKeyState("Alt", "P")
{
ModKeys .= "alt+"
}
GuiControl,, MyText, %MonitorText%
return
}
UpdateMonitor()
CustomColor := "EEAA99" ; Can be any RGB color (it will be made transparent below).
Gui +LastFound +AlwaysOnTop -Caption +ToolWindow ; +ToolWindow avoids a taskbar button and an alt-tab menu item.
Gui, Color, %CustomColor%
Gui, Font, s12, Courier New ; Set a large font size (32-point).
Gui, Add, Text, vMyText cyellow 0x2, %MonitorText%
; Make all pixels of this color transparent and make the text itself translucent (150):
WinSet, TransColor, %CustomColor% 150
Gui, Show
return
Guisize:
guiheight := A_guiheight
guiwidth := A_guiwidth
gui,show, % _mvar "x" (A_ScreenWidth/2) - (GuiWidth/2) " y0 w" Guiwidth " h" GuiHeight NoActivate
; ================= End Macro Monitor =================
; ================= Main =================
Hotkey, IfWinActive, World of Warcraft ; Only run if window "World of Warcraft" is active
If(ActiveA) {
Hotkey, $%KeyPressA%, LabelA
}
If(ActiveB) {
Hotkey, $%KeyPressB%, LabelB
}
If(ActiveC) {
Hotkey, $%KeyPressC%, LabelC
}
return
ToggleA := 0
ToggleB := 0
ToggleC := 0
LabelA:
If(ToggleA) {
If(SingleKeySpam) {
ToggleA := 0
UpdateMonitor()
SetTimer, SpamKeyA, Off
SetTimer, SpamKeyB, Off
SetTimer, SpamKeyC, Off
} Else {
ToggleA := 0
UpdateMonitor()
SetTimer, SpamKeyA, Off
}
} Else {
If(SingleKeySpam) {
ToggleA := 1
ToggleB := 0
ToggleC := 0
SetTimer, SpamKeyA, %RunSpeedA%
SetTimer, SpamKeyB, Off
SetTimer, SpamKeyC, Off
} Else {
ToggleA := 1
SetTimer, SpamKeyA, %RunSpeedA%
}
}
return
LabelB:
If(ToggleB) {
If(SingleKeySpam) {
ToggleB := 0
UpdateMonitor()
SetTimer, SpamKeyA, Off
SetTimer, SpamKeyB, Off
SetTimer, SpamKeyC, Off
} Else {
ToggleB := 0
UpdateMonitor()
SetTimer, SpamKeyB, Off
}
} Else {
If(SingleKeySpam) {
ToggleA := 0
ToggleB := 1
ToggleC := 0
SetTimer, SpamKeyA, Off
SetTimer, SpamKeyB, %RunSpeedB%
SetTimer, SpamKeyC, Off
} Else {
ToggleB := 1
SetTimer, SpamKeyB, %RunSpeedB%
}
}
return
LabelC:
If(ToggleC) {
If(SingleKeySpam) {
ToggleC := 0
UpdateMonitor()
SetTimer, SpamKeyA, Off
SetTimer, SpamKeyB, Off
SetTimer, SpamKeyC, Off
} Else {
ToggleC := 0
UpdateMonitor()
SetTimer, SpamKeyC, Off
}
} Else {
If(SingleKeySpam) {
ToggleA := 0
ToggleB := 0
ToggleC := 1
SetTimer, SpamKeyA, Off
SetTimer, SpamKeyB, Off
SetTimer, SpamKeyC, %RunSpeedC%
} Else {
ToggleC := 1
SetTimer, SpamKeyC, %RunSpeedC%
}
}
return
;; blind mode to send modifiers
SpamKeyA:
Send, {Blind}{%KeySpamA%}
UpdateMonitor()
return
SpamKeyB:
Send, {Blind}{%KeySpamB%}
UpdateMonitor()
return
SpamKeyC:
Send, {Blind}{%KeySpamC%}
UpdateMonitor()
return
;; #################################
;; CONTROLS
;; #################################
^PgDn::Suspend ;; Ctrl + PageDown to suspend script (if you want to chat)
^PgUp::Reload ;; Ctrl + PageUP to reload script
^End::ExitApp ;; Ctrl + End to terminate script