Sometimes You Want AutoHotkey Hotkeys to Block Other Program Shortcuts While Other Times You Want Both to Work
One of the effects of AutoHotkey Hotkeys includes blocking action for key combinations in Windows and other programs. While often desirable, occasionally you want both the Hotkey and the program shortcut to work. To do this we put a squiggle (tilde prefix ~) in front of the Hotkey combination.
When I added the Arrow keys to the MouseMeasure.ahk script as Hotkeys for precisely locating the mouse cursor onscreen, it triggered the undesirable side effect of blocking the text cursor movement associated with those same keys in editing screens. By placing a tilde (~) in front of each Hotkey, I can accomplish both accurate mouse cursor placement in the invisible GUI and continue using text cursor movement in an editing window without disabling or closing the MouseMeasure.ahk app. (See “Replace Hotkeys with the AutoHotkey GetKeyState() Function” for an introduction to the GDIPlus version of the script. See “How to Draw Lines with AutoHotkey Using Windows GDIPlus Graphics” for information on the GDIPlus functions used in the script.)
When to Use Hotkey Pass-through … or Not!
As a rule, I don’t implement Hotkey pass-through using the tilde (~) unless I discover a reason not to block other program or Windows shortcuts. Allowing Hotkeys to pass-through and work in the currently active process can cause unpredictable or unwanted effects.
If I find that I’ve used a Hotkey which interferes or blocks important native shortcuts in other programs, I usually change the Hotkey. Some key combinations, such as Ctrl+C, Ctrl+V, Ctrl+Z, etc., I consider sacred. If I want to use a close relative to one of those key combos, then I add the Alt, Shift, or Win key (or a combination of them) to the Hotkey. I only resort to making the Hotkey combination fall-through to the currently active app if the situation calls for it.
The MouseMeasure.ahk script presents a few of those situations where pass-through Hotkeys only make sense. The invisible MouseMeasure.ahk markup GUI covers the entire screen—unseen to both the eye and most mouse/keyboard action. While I don’t recommend maintaining the distance-measuring utility loaded at all times, you can operate almost any other program simultaneously without even noticing the active MouseMeasure.ahk app—unless you activate the gauging line using Ctrl+LButton.
Using the Tilde Prefix (~) in the MouseMeasure.ahk Script
Since I always find accurately locating the mouse cursor by hand a little iffy, I added the Arrow keys as pixel-level navigation for exact placement—not unlike the MousePrecise.ahk script. I also defined the Delete key as a Hotkey for erasing any active line and measurement from the screen. Both the cursor (Arrow) keys and the Delete key provide the most intuitive techniques for implementing these options. People will likely test these keys without any prior instruction:
Up::MouseMove, 0, -1, 0, R ; UpArrow hotkey => Move cursor upward Down::MouseMove, 0, 1, 0, R ; DownArrow => Move cursor downward Left::MouseMove, -1, 0, 0, R ; LeftArrow => Move cursor to the left Right::MouseMove, 1, 0, 0, R ; RightArrow => Move cursor to the right Delete:: active_Draw:=0 setTimer updatePos, off SetTimer,DrawStuff,off ToolTip Gdip_GraphicsClear(GdipOBJ.G) UpdateLayeredWindow(GdipOBJ.hwnd, GdipOBJ.hdc) Return
However, when I first added the above precise mouse cursor location Hotkeys to the script using the Arrow keys, I could no longer move the text cursor with those same keys in an editing window—a standard technique for text navigation in most word processing apps. The Hotkeys blocked any text cursor action. Plus, the use of the Delete key to clear the graphic line blocked letter deletion in editing windows.
To resolve these problems, I merely placed a tilde in front of each Hotkey allowing the native program action of the Hotkey to pass-through to the currently active window.
~Up::MouseMove, 0, -1, 0, R ; UpArrow hotkey => Move cursor upward ~Down::MouseMove, 0, 1, 0, R ; DownArrow => Move cursor downward ~Left::MouseMove, -1, 0, 0, R ; LeftArrow => Move cursor to the left ~Right::MouseMove, 1, 0, 0, R ; RightArrow => Move cursor to the right ~Delete:: active_Draw:=0 setTimer updatePos, off SetTimer,DrawStuff,off ToolTip Gdip_GraphicsClear(GdipOBJ.G) UpdateLayeredWindow(GdipOBJ.hwnd, GdipOBJ.hdc) Return
Now, when I use the MouseMeasure.ahk app, I can both accurately place the start and endpoint of the measurement line and use the arrow keys to move the text cursor in the active editor just under the invisible GUI. Each keyboard action functions at the same time. I get a similar effect with the Delete key—although, I recently moved the Delete Hotkey to the inside the #If directive conditional to block the Delete key native function in other programs during line drawing.
Click the Follow button at the top of the sidebar on the right of this page for e-mail notification of new blogs. (If you’re reading this on a tablet or your phone, then you must scroll all the way to the end of the blog—pass any comments—to find the Follow button.)
This post was proofread by Grammarly
(Any other mistakes are all mine.)
(Full disclosure: If you sign up for a free Grammarly account, I get 20¢. I use the spelling/grammar checking service all the time, but, then again, I write a lot more than most people. I recommend Grammarly because it works and it’s free.)
Find my AutoHotkey books at ComputorEdge E-Books!
Find quick-start AutoHotkey classes at “Robotic Desktop Automation with AutoHotkey“!