Back to AutoHotkey Tools
RadMode Tools
Automation scripts and utilities for radiology workflows
How to Use
Complete AutoHotkey v2 script for radiology workflow automation
- 1Download all three files and place them in the same folder. Double-click the Runner (.exe) to launch — a setup GUI window will appear.
- 2Configure your hotkeys and settings in the setup GUI. The launcher minimizes to the system tray after setup — close it to stop the script.
- 3Press Caps + F to enter Rads Mode for dictation shortcuts, and Caps + D to exit.
- 4Hold Alt + Z to trigger Smart Break Glass using the hammer icon. All scripts intended for EPIC, PowerScribe, and Visage workflows.
Quick Reference
Key shortcuts — full list available in the script GUI
Global Shortcuts
Caps LockTrackball Scroll (Hold)
Alt + ZSmart Break Glass
Shift + Alt + ZForce Manual Entry
Alt + PLogin site
Caps + FEnable Rads Mode
Caps + DExit Rads Mode
Rads Mode — Dictation
DToggle dictation
HSave draft (F9)
FNext field
GPrevious field
SBackspace
ANew line
QClose window (Ctrl+W)
Mouse & Pick Lists
RLeft click
EMiddle click
WRight click
Alt + 1–5Pick list choice
Visage viewer:
Z, X, C, VSend to Visage
Download Files
All three files are required — place them in the same folder
Hammer Icon
.pnghammer.png
Required for the "Break the Glass" automation — must be in the same folder as the script.
Download IconFull RadMode Automation Script
View the complete source code or copy it to your clipboard
1#Requires Autohotkey v2
2#SingleInstance Force
3CoordMode "ToolTip", "Screen"
4CoordMode "Mouse", "Screen"
5CoordMode "Pixel", "Screen"
6SetTitleMatchMode 2
7
8; ==============================================================================
9; Version & Configuration Defaults
10; ==============================================================================
11global VERSION := "v22.17"
12global INI_FILE := "rad_helper_settings.ini"
13
14; --- User Variables (Runtime) ---
15global USER := ""
16global PASS := ""
17global KEEPAWAKE := 0
18global TRACKBALL_SCROLL := 1
19global DEBUG_MODE := 0
20global DETECT_HAMMER := 1
21
22; --- Advanced Settings (Loaded from INI) ---
23global BTG_TAB_DELAY := 80
24global BTG_POPUP_DELAY := 500
25global SCROLL_THRESHOLD := 15
26global SCROLL_LOCK_RATIO := 2.0
27
28; --- Marker Customization ---
29global MARKER_SIZE := 5
30global MARKER_COLOR := "FF0000"
31global MARKER_ALPHA := 180
32
33; --- Reliability Settings ---
34SetKeyDelay 10, 10
35global LOGIN_STEP_DELAY := 150
36
37; --- Window Titles ---
38global EPIC_TITLE := "Prod"
39global PS := "PowerScribe"
40global VISAGE := "Visage"
41global VISAGE_LOGIN := "Client Login ahk_class Qt51510QWindowIcon"
42
43global RADSMODE := false
44global MarkerGui := unset
45
46; ==============================================================================
47; Initialization
48; ==============================================================================
49LoadSettings()
50CreateCursorMarker()
51
52; ==============================================================================
53; Main GUI
54; ==============================================================================
55myGui := Gui()
56myGui.Title := "Radiology Helper " . VERSION
57myGui.BackColor := "FBFBFB"
58myGui.SetFont("s10", "Segoe UI")
59
60; --- Login Section ---
61myGui.Add("GroupBox", "x20 y10 w460 h80", "Login Credentials")
62myGui.Add("Text", "x40 y40 w70 h25 +0x200", "Username:")
63Edit1 := myGui.Add("Edit", "x115 y40 w130 h25", USER)
64
65myGui.Add("Text", "x255 y40 w70 h25 +0x200", "Password:")
66Edit2 := myGui.Add("Edit", "x330 y40 w110 h25 +Password", PASS)
67
68; --- Action Button ---
69LaunchButton := myGui.Add("Button", "x20 y100 w260 h50 +Default", "Launch Visage System")
70LaunchButton.OnEvent("Click", LaunchButtonHandler)
71LaunchButton.SetFont("s11 bold")
72
73; --- Config Button ---
74ConfigButton := myGui.Add("Button", "x290 y100 w190 h50", "Advanced Config")
75ConfigButton.OnEvent("Click", OpenConfigMenu)
76
77; --- Options Section ---
78CheckBox1 := myGui.Add("CheckBox", "x40 y160 w150 h25 Checked" . KEEPAWAKE, "Prevent Sleep")
79CheckBox2 := myGui.Add("CheckBox", "x220 y160 w240 h25 Checked" . TRACKBALL_SCROLL, "Hold CapsLock to scroll")
80
81; -- Hammer Checkbox Logic --
82hammerFileExists := FileExist("hammer.png")
83hammerState := hammerFileExists ? DETECT_HAMMER : 0
84hammerOpts := hammerFileExists ? "" : "Disabled"
85CheckBoxHammer := myGui.Add("CheckBox", "x40 y185 w200 h25 Checked" . hammerState . " " . hammerOpts, "Detect 'Hammer' Icon")
86
87CheckBox3 := myGui.Add("CheckBox", "x250 y185 w150 h25 Checked" . DEBUG_MODE, "Debug Mode")
88
89; --- Divider ---
90myGui.Add("Text", "x20 y215 w460 h2 0x10")
91
92; --- Reference Guide (Reformatted) ---
93myGui.SetFont("s9", "Segoe UI")
94RefGroup := myGui.Add("GroupBox", "x20 y220 w460 h185", "Quick Reference Guide")
95
96; Column 1: Global
97myGui.SetFont("s9 w700")
98myGui.Add("Text", "x40 y245 w180", "Global Shortcuts")
99myGui.SetFont("s9 w400")
100myGui.Add("Text", "x40 y265 w200", "Caps + f : Rads Mode ON")
101myGui.Add("Text", "x40 y285 w200", "Caps + d : Rads Mode OFF")
102myGui.Add("Text", "x40 y305 w200", "Alt + p : Auto-Login Site")
103myGui.Add("Text", "x40 y325 w200", "Alt + z : Smart Break Glass")
104myGui.Add("Text", "x40 y345 w200", "S+Alt+z : Force Manual Entry")
105
106; Column 2: Rads Mode
107myGui.SetFont("s9 w700")
108myGui.Add("Text", "x260 y245 w180", "Rads Mode (Vim-Style)")
109myGui.SetFont("s9 w400")
110myGui.Add("Text", "x260 y265 w200", "d : Toggle Dictation")
111myGui.Add("Text", "x260 y285 w200", "h : Save Draft (F9)")
112myGui.Add("Text", "x260 y305 w200", "f / g : Next / Prev Field")
113myGui.Add("Text", "x260 y325 w200", "s / a : Backspace / Enter")
114myGui.Add("Text", "x260 y345 w200", "Alt + 1-5 : Pick List Choice")
115
116; Logic Note
117myGui.SetFont("s8 italic c555555")
118myGui.Add("Text", "x40 y370 w420", "Smart Logic: If 'Hammer' setting is ON & icon found, it clicks the hammer. If OFF or NOT found, it runs the 'Provision' entry workflow.")
119
120; Footer
121myGui.SetFont("s8 c777777")
122myGui.Add("Text", "x20 y415 w460 Center", "Note: Red dot indicator appears when Rads Mode is active.")
123
124myGui.Show("w500 h445")
125
126; ==============================================================================
127; Cursor Marker Logic
128; ==============================================================================
129CreateCursorMarker() {
130 global MarkerGui, MARKER_SIZE, MARKER_COLOR, MARKER_ALPHA
131 if IsSet(MarkerGui)
132 MarkerGui.Destroy()
133 MarkerGui := Gui("+AlwaysOnTop -Caption +ToolWindow +E0x20")
134 MarkerGui.BackColor := MARKER_COLOR
135 D := MARKER_SIZE
136 WinSetRegion("0-0 W" D " H" D " R" D "-" D, MarkerGui.Hwnd)
137 MarkerGui.Opt("+LastFound")
138 WinSetTransparent(MARKER_ALPHA, MarkerGui.Hwnd)
139}
140
141UpdateMarkerPos() {
142 global RADSMODE, MarkerGui, MARKER_SIZE
143 if (RADSMODE) {
144 MouseGetPos(&mX, &mY)
145 MarkerGui.Show("x" (mX + 12) " y" (mY + 12) " w" MARKER_SIZE " h" MARKER_SIZE " NoActivate")
146 } else {
147 MarkerGui.Hide()
148 }
149}
150
151; ==============================================================================
152; Advanced Config Menu
153; ==============================================================================
154OpenConfigMenu(*) {
155 advGui := Gui()
156 advGui.Title := "Advanced Configuration"
157 advGui.SetFont("s9", "Segoe UI")
158
159 advGui.Add("GroupBox", "x10 y10 w380 h100", "Rads Mode Indicator (Dot)")
160 advGui.Add("Text", "x30 y35 w100 h20", "Dot Size (px):")
161 Ctrl_Size := advGui.Add("Edit", "x130 y32 w60 h20 Number", MARKER_SIZE)
162 advGui.Add("Text", "x210 y35 w80 h20", "Hex Color:")
163 Ctrl_Color := advGui.Add("Edit", "x290 y32 w80 h20", MARKER_COLOR)
164 advGui.Add("Text", "x30 y65 w100 h20", "Opacity (0-255):")
165 Ctrl_Alpha := advGui.Add("Edit", "x130 y62 w60 h20 Number", MARKER_ALPHA)
166
167 advGui.Add("GroupBox", "x10 y120 w380 h130", "Workflow Settings")
168 advGui.Add("Text", "x30 y145 w150 h20", "Tab Delay (ms):")
169 Ctrl_TabDelay := advGui.Add("Edit", "x240 y142 w80 h20 Number", BTG_TAB_DELAY)
170 advGui.Add("Text", "x30 y175 w150 h20", "Scroll Sensitivity:")
171 Ctrl_Sens := advGui.Add("Edit", "x240 y172 w80 h20 Number", SCROLL_THRESHOLD)
172 advGui.Add("Text", "x30 y205 w150 h20", "Axis Lock Ratio:")
173 Ctrl_Lock := advGui.Add("Edit", "x240 y202 w80 h20", SCROLL_LOCK_RATIO)
174
175 SaveBtn := advGui.Add("Button", "x90 y270 w100 h30", "Save")
176 CancelBtn := advGui.Add("Button", "x200 y270 w100 h30", "Cancel")
177 SaveBtn.OnEvent("Click", SaveHandler)
178 CancelBtn.OnEvent("Click", (*) => advGui.Destroy())
179 advGui.Show()
180
181 SaveHandler(*) {
182 global BTG_TAB_DELAY, SCROLL_THRESHOLD, SCROLL_LOCK_RATIO
183 global MARKER_SIZE, MARKER_COLOR, MARKER_ALPHA
184 MARKER_SIZE := Ctrl_Size.Value
185 MARKER_COLOR := Ctrl_Color.Value
186 MARKER_ALPHA := Ctrl_Alpha.Value
187 BTG_TAB_DELAY := Ctrl_TabDelay.Value
188 SCROLL_THRESHOLD := Ctrl_Sens.Value
189 SCROLL_LOCK_RATIO := Number(Ctrl_Lock.Value)
190 SaveSettings()
191 CreateCursorMarker()
192 advGui.Destroy()
193 MsgBox("Settings Saved!", "Configuration", "Iconi T1")
194 }
195}
196
197; ==============================================================================
198; INI Persistence Functions
199; ==============================================================================
200LoadSettings() {
201 global BTG_TAB_DELAY, SCROLL_THRESHOLD, SCROLL_LOCK_RATIO
202 global MARKER_SIZE, MARKER_COLOR, MARKER_ALPHA, DETECT_HAMMER
203 if FileExist(INI_FILE) {
204 try {
205 BTG_TAB_DELAY := IniRead(INI_FILE, "Citrix", "TabDelay", 80)
206 SCROLL_THRESHOLD := IniRead(INI_FILE, "Physics", "Sensitivity", 15)
207 SCROLL_LOCK_RATIO := IniRead(INI_FILE, "Physics", "AxisLock", 2.0)
208 MARKER_SIZE := IniRead(INI_FILE, "Marker", "Size", 5)
209 MARKER_COLOR := IniRead(INI_FILE, "Marker", "Color", "FF0000")
210 MARKER_ALPHA := IniRead(INI_FILE, "Marker", "Alpha", 180)
211 DETECT_HAMMER := IniRead(INI_FILE, "Workflow", "DetectHammer", 1)
212 }
213 }
214}
215
216SaveSettings() {
217 IniWrite(BTG_TAB_DELAY, INI_FILE, "Citrix", "TabDelay")
218 IniWrite(SCROLL_THRESHOLD, INI_FILE, "Physics", "Sensitivity")
219 IniWrite(SCROLL_LOCK_RATIO, INI_FILE, "Physics", "AxisLock")
220 IniWrite(MARKER_SIZE, INI_FILE, "Marker", "Size")
221 IniWrite(MARKER_COLOR, INI_FILE, "Marker", "Color")
222 IniWrite(MARKER_ALPHA, INI_FILE, "Marker", "Alpha")
223 IniWrite(CheckBoxHammer.Value, INI_FILE, "Workflow", "DetectHammer")
224}
225
226; ==============================================================================
227; GUI Handlers
228; ==============================================================================
229UpdateGlobals(*) {
230 global USER := Edit1.Value, PASS := Edit2.Value, KEEPAWAKE := CheckBox1.Value
231 global TRACKBALL_SCROLL := CheckBox2.Value, DEBUG_MODE := CheckBox3.Value
232 global DETECT_HAMMER := CheckBoxHammer.Value
233}
234LaunchButtonHandler(*) {
235 LaunchVisage()
236 myGui.Minimize()
237}
238CloseHandler(*) => ExitApp()
239
240; ==============================================================================
241; Core Logic
242; ==============================================================================
243SetTimer StopSleep, 100000
244SetTimer UpdateMarkerPos, 15
245
246LaunchVisage() {
247 if WinExist(VISAGE) {
248 WinActivate(VISAGE)
249 return
250 }
251 if WinExist(VISAGE_LOGIN) {
252 VisageLoginSequence()
253 return
254 }
255 targetLnk := ""
256 loop files A_Desktop "\*Visage*.lnk" {
257 targetLnk := A_LoopFileFullPath
258 break
259 }
260 if (targetLnk == "") {
261 loop files A_DesktopCommon "\*Visage*.lnk" {
262 targetLnk := A_LoopFileFullPath
263 break
264 }
265 }
266 if (targetLnk) {
267 Run(targetLnk)
268 } else {
269 fallbackPath := "C:\Program Files\Visage Imaging\Visage 7.1\bin\arch-Win\vsclient.exe"
270 if FileExist(fallbackPath) {
271 Run(fallbackPath)
272 } else {
273 MsgBox("Could not find Visage executable.", "Error", "Icon!")
274 return
275 }
276 }
277 if WinWait(VISAGE_LOGIN,, 20) {
278 VisageLoginSequence()
279 }
280}
281
282VisageLoginSequence() {
283 global VISAGE_LOGIN, LOGIN_STEP_DELAY
284 global Edit1, Edit2
285
286 if !WinExist(VISAGE_LOGIN)
287 return
288 WinActivate(VISAGE_LOGIN)
289 if !WinWaitActive(VISAGE_LOGIN,, 3)
290 return
291
292 local safeUser := Edit1.Value
293 local safePass := Edit2.Value
294
295 SetKeyDelay 10, 10
296
297 WinGetPos(,, &winW, &winH, VISAGE_LOGIN)
298 oldMode := A_CoordModeMouse
299 CoordMode "Mouse", "Window"
300
301 MouseMove(winW * 0.60, winH * 0.40)
302 Sleep(LOGIN_STEP_DELAY)
303 Click()
304 Sleep(LOGIN_STEP_DELAY)
305
306 SendEvent("^a{Delete}")
307 Sleep(LOGIN_STEP_DELAY)
308 SendEvent("{Raw}VISAGE.NYUMC.ORG")
309 Sleep(LOGIN_STEP_DELAY)
310 SendEvent("{Tab}")
311 Sleep(LOGIN_STEP_DELAY)
312
313 SendEvent("^a{Delete}")
314 Sleep(LOGIN_STEP_DELAY)
315 SendEvent("{Raw}" safeUser)
316 Sleep(LOGIN_STEP_DELAY)
317 SendEvent("{Tab}")
318 Sleep(LOGIN_STEP_DELAY)
319
320 SendEvent("{Raw}" safePass)
321 Sleep(LOGIN_STEP_DELAY + 200)
322
323 SendEvent("{Enter}")
324
325 CoordMode "Mouse", oldMode
326}
327
328breakGlass() {
329 global PASS, BTG_TAB_DELAY, Edit2, DETECT_HAMMER
330 global CheckBoxHammer
331
332 detectEnabled := CheckBoxHammer.Value
333
334 screenLeft := SysGet(76), screenTop := SysGet(77), screenWidth := SysGet(78), screenHeight := SysGet(79)
335 hammerFound := false
336
337 if (detectEnabled && FileExist("hammer.png")) {
338 try {
339 if ImageSearch(&FoundX, &FoundY, screenLeft, screenTop, screenLeft+screenWidth, screenTop+screenHeight, "*75 hammer.png") {
340 hammerFound := true
341 MouseMove(FoundX + 10, FoundY + 10)
342 Click("Down"), Sleep(10), Click("Up"), Sleep(50)
343 Send("{Tab}"), Sleep(50), Send("{Enter}"), Sleep(500)
344 }
345 }
346 }
347
348 if (hammerFound) {
349 ; --- Hammer Found Workflow ---
350 Loop 3 {
351 Send("{Tab}"), Sleep(BTG_TAB_DELAY)
352 }
353 Send("{Enter}"), Sleep(BTG_TAB_DELAY + 100)
354 Loop 5 {
355 Send("{Tab}"), Sleep(BTG_TAB_DELAY)
356 }
357 SendEvent("{Raw}" Edit2.Value)
358 Sleep(BTG_TAB_DELAY), Send("!a")
359 } else {
360 ; --- Fallback to Manual Workflow ---
361 manualBreakGlass()
362 }
363}
364
365manualBreakGlass(*) {
366 global BTG_TAB_DELAY, Edit2
367 ; Presume popup open, cursor in first field
368 SendEvent("{Raw}Provision")
369 Sleep(BTG_TAB_DELAY)
370 Send("{Tab}")
371 Sleep(BTG_TAB_DELAY)
372 Send("{Tab}")
373 Sleep(BTG_TAB_DELAY)
374 SendEvent("{Raw}" Edit2.Value)
375 Sleep(BTG_TAB_DELAY)
376 Send("!a")
377}
378
379; ==============================================================================
380; CAPSLOCK SCROLL
381; ==============================================================================
382TrackballScroll(*) {
383 global SCROLL_THRESHOLD, SCROLL_LOCK_RATIO
384 oldMode := A_CoordModeMouse
385 CoordMode "Mouse", "Screen"
386 MouseGetPos(&startX, &startY)
387 bankX := 0, bankY := 0
388 Loop {
389 if !GetKeyState("CapsLock", "P")
390 break
391 MouseGetPos(¤tX, ¤tY)
392 moveX := currentX - startX, moveY := currentY - startY
393 if (moveX != 0 || moveY != 0) {
394 DllCall("SetCursorPos", "int", startX, "int", startY)
395 }
396 bankX += moveX, bankY += moveY
397 absX := Abs(bankX), absY := Abs(bankY)
398 if (absX > (absY * SCROLL_LOCK_RATIO)) {
399 if (absX >= SCROLL_THRESHOLD) {
400 ticks := Integer(absX / SCROLL_THRESHOLD)
401 direction := (bankX > 0) ? "{WheelRight}" : "{WheelLeft}"
402 Loop ticks
403 Send(direction)
404 bankX := Mod(bankX, SCROLL_THRESHOLD), bankY := 0
405 }
406 } else if (absY > absX) {
407 if (absY >= SCROLL_THRESHOLD) {
408 ticks := Integer(absY / SCROLL_THRESHOLD)
409 direction := (bankY > 0) ? "{WheelDown}" : "{WheelUp}"
410 Loop ticks
411 Send(direction)
412 bankY := Mod(bankY, SCROLL_THRESHOLD), bankX := 0
413 }
414 }
415 Sleep(5)
416 }
417 CoordMode "Mouse", oldMode
418}
419
420; ==============================================================================
421; UTILS & HOTKEYS
422; ==============================================================================
423GetTargetControl() {
424 global PS
425 largestArea := 0, bestControl := ""
426
427 ; STRATEGY: Find the largest visible RichEdit control first.
428 try {
429 ctrlList := WinGetControls(PS)
430 for ctrl in ctrlList {
431 if InStr(ctrl, "RICHEDIT") {
432 try {
433 if ControlGetVisible(ctrl, PS) {
434 ControlGetPos(,, &w, &h, ctrl, PS)
435 if (w * h > largestArea) {
436 largestArea := w * h, bestControl := ctrl
437 }
438 }
439 }
440 }
441 }
442 }
443
444 if (bestControl != "")
445 return bestControl
446
447 try {
448 focusedCtrl := ControlGetFocus(PS)
449 if InStr(focusedCtrl, "RICHEDIT")
450 return focusedCtrl
451 }
452
453 return ""
454}
455
456ActivateAndSend(key, targetSpecificControl := true) {
457 global PS
458 if WinExist(PS) {
459 if !WinActive(PS) {
460 WinActivate(PS), WinWaitActive(PS,, 1), Sleep(50)
461 }
462 target := targetSpecificControl ? GetTargetControl() : ""
463 if (target)
464 ControlSend(key, target, PS)
465 else
466 SendEvent(key)
467 }
468}
469
470StopSleep(*) {
471 if (KEEPAWAKE) {
472 oldMode := A_CoordModeMouse
473 CoordMode("Mouse", "Screen")
474 MouseGetPos(&cX, &cY)
475 MouseMove(cX + 1, cY, 0), MouseMove(cX, cY, 0)
476 CoordMode("Mouse", oldMode)
477 }
478}
479
480loginSite() {
481 global Edit1, Edit2
482 SendEvent("{Raw}" Edit1.Value)
483 Sleep(200)
484 SendEvent("{Tab}")
485 Sleep(200)
486 SendEvent("{Raw}" Edit2.Value)
487 Sleep(200)
488 SendEvent("{Enter}")
489}
490
491pick(num) {
492 global PS
493 MouseGetPos &startX, &startY
494 CoordMode "Mouse", "Client"
495 heightRow := 17
496 if WinExist(PS) {
497 try {
498 for ctrl in WinGetControls(PS) {
499 try {
500 txt := ControlGetText(ctrl, PS)
501 } catch {
502 continue
503 }
504 if (txt == "Pick List Choices") {
505 ControlGetPos(&x, &y, &w, &h, ctrl, PS)
506 targetY := y + Integer(heightRow/2) + (heightRow * num)
507 targetX := x + 20
508 if !WinActive(PS) {
509 WinActivate(PS)
510 WinWaitActive(PS,, 1)
511 }
512 Click(targetX, targetY)
513 Sleep(50)
514 Click(targetX, targetY)
515 CoordMode "Mouse", "Screen"
516 MouseMove(startX, startY)
517 Sleep(50)
518 ActivateAndSend("{Tab}", true)
519 return
520 }
521 }
522 }
523 }
524 CoordMode "Mouse", "Screen"
525}
526
527; -- Common Rads Logic --
528toggleDictation(*) => ActivateAndSend("{F4}", false)
529saveDraft(*) => ActivateAndSend("{F9}", false)
530nextField(*) => ActivateAndSend("{Tab}", true)
531prevField(*) => ActivateAndSend("+{Tab}", true)
532backspace(*) => ActivateAndSend("{Backspace}", true)
533newLine(*) => ActivateAndSend("{Enter}", true)
534
535enableRadsMode(*) {
536 global RADSMODE := true
537}
538exitRadsMode(*) {
539 global RADSMODE := false
540}
541
542#HotIf TRACKBALL_SCROLL
543 $CapsLock::TrackballScroll()
544#HotIf
545
546#HotIf GetKeyState("CapsLock", "P")
547 f:: enableRadsMode()
548 d:: exitRadsMode()
549#HotIf
550
551; -- Global Hotkeys --
552!z:: breakGlass()
553+!z:: manualBreakGlass()
554!p:: loginSite()
555
556#HotIf RADSMODE
557 r::LButton
558 e::MButton
559 w::RButton
560 $d:: toggleDictation()
561 $h:: saveDraft()
562 $f:: nextField()
563 $g:: prevField()
564 $s:: backspace()
565 $a:: newLine()
566 $q:: Send("^w")
567
568 ; -- Pick List Hotkeys --
569 $!1:: pick(1)
570 $!2:: pick(2)
571 $!3:: pick(3)
572 $!4:: pick(4)
573 $!5:: pick(5)
574
575 $z:: (WinActive(PS) ? "" : Send("z"))
576 $x:: (WinActive(PS) ? "" : Send("x"))
577 $c:: (WinActive(PS) ? "" : Send("c"))
578 $v:: (WinActive(PS) ? "" : Send("v"))
579#HotIfThis is the full source code of the RadMode.ahk file. You can copy this into a new .ahk file or download the file directly using the button above.