[[http://www.autohotkey.com/|AutoHotKey]] does input macro programming and keyboard remapping in Windows. Key docs:
* [[http://www.autohotkey.com/docs/misc/Remap.htm|Remapping keys and buttons]]
* [[http://www.autohotkey.com/docs/Hotkeys.htm|Hotkeys]]
* [[http://www.autohotkey.com/docs/commands/Send.htm|The Send command]]
* [[http://www.autohotkey.com/docs/commands/IfEqual.htm|Conditionals]]
====== Recipes ======
Below are some useful recipes. See also:
* [[Using AutoHotKey to map keys on the Amtelco KB163 Unified Keyboard]].
* [[Using AutoHotkey to make a second mouse into a multimedia control]]
===== General =====
; General controls:
; Win+Esc to reload
; Win+Shift+Esc to exit
; Win+Ctrl+Esc to exit
#Escape::Reload
#+Escape::ExitApp
#^Escape::Edit
; Win+F12 = Sleep
#F12::DllCall("PowrProf\SetSuspendState", "int", 0, "int", 0, "int", 0)
; Win+M = toggle mute
#m::Send {Volume_Mute}
; Alt+Backtick -> Shift+Win_Right (move window to next monitor) -- a shortcut I used on Ultramon for years
!`::Send +#{Right}
===== Hold down any key =====
; do right win key + whatever to hold that key down (if it's listed below)
>#w::Send {w down}
>#a::Send {a down}
>#s::Send {s down}
>#d::Send {d down}
>#LButton::Send {LButton down}
>#MButton::Send {MButton down}
>#RButton::Send {RButton down}
>#q::Send {q down}
>#e::Send {e down}
===== Map gamepad buttons to winamp controls =====
All the function gunk around Joy2 and Joy3 is for keyboard auto-repeat of Win+A and Win+S (which I map to winamp volume control elsewhere).
; winamp control (if winamp is running)
#If WinExist("ahk_class BaseWindow_RootWnd") ; << this badly named thing refers to winamp
Joy1::Send {Media_Play_Pause}
Joy4::Send {Media_Stop}
Joy6::Send {Media_Next}
Joy8::Send {Media_Prev}
Joy2::
Send {LWin down}{s down}
SetTimer, WaitForJoy2, 30 ; 30ms
return
WaitForJoy2:
if not GetKeyState("Joy2") ; The button has been released.
{
Send {LWin up}{s up} ; Release the spacebar.
SetTimer, WaitForJoy2, off ; Stop monitoring the button.
return
}
; Since above didn't "return", the button is still being held down.
Send {LWin down}{s down} ; Send another Spacebar keystroke.
return
Joy3::
Send {LWin down}{a down}
SetTimer, WaitForJoy3, 30 ; 30ms
return
WaitForJoy3:
if not GetKeyState("Joy3") ; The button has been released.
{
Send {LWin up}{a up} ; Release the spacebar.
SetTimer, WaitForJoy3, off ; Stop monitoring the button.
return
}
; Since above didn't "return", the button is still being held down.
Send {LWin down}{a down} ; Send another Spacebar keystroke.
return
#If ; EndIf
===== Make the top edge of the main monitor "sticky" =====
If you have a second monitor //above// the main one, this script will help you still be able to click stuff at the top of the screen without accidentally wandering into the upper monitor.
SetupClipCheck() ; enable the mouse confinement system (defined below)
; get access to the winapi ClipCursor function, which limits cursor boundaries
ClipCursor( Confine=True, x1=0 , y1=0, x2=1, y2=1 )
{
VarSetCapacity(R,16,0), NumPut(x1,&R+0),NumPut(y1,&R+4),NumPut(x2,&R+8),NumPut(y2,&R+12)
Return Confine ? DllCall( "ClipCursor", UInt,&R ) : DllCall( "ClipCursor" )
}
; count the number of loop iterations the mouse has been near the top and un-confine the mouse if there's been enough
SetupClipCheck() {
SetTimer, ClipCheck, 10
return
}
top_tick_count := 0
ClipCheck:
CoordMode, Mouse, Screen
MouseGetPos,x,y
;ToolTip,%x%:%y%:%top_tick_count%
If (y < 10) {
top_tick_count++
} Else {
top_tick_count := 0
}
if (top_tick_count>15) {
ClipCursor(False)
} Else {
ClipCursor(True, -10000, 0, 10000, 10000)
}
return
===== Extended mouse buttons mapped to media control =====
XButton2::Media_Play_Pause
XButton1::Media_Next
===== Mouse click spam =====
Press F7 to toggle auto-clicking over and over as fast as possible.
i:=0
F7::SetTimer, Spam, % (i:=!i) ? "10" : "Off" ; uses ternary
Spam:
Click
Send {LButton}
return
===== Winkey shortcut overrides =====
Windows by default binds Win+X, Win+B, and Win+Space to stuff I don't care about. The script below will remap these to media keys or other key combos that apps can hook without issue.
; WinAmp+Launchy remaps
#z::Media_Prev
#x::Media_Play_Pause
#c::Media_Play_Pause
#v::Media_Stop
#b::Media_Next
#space::Send ^+{Space}
; ^ Win+Space -> Ctrl+Shift+Space
; old simple winamp remaps -- the newer ones above let it work for non-winamps, such as spotify
;#x::#^x
;#b::#^b
===== Auto mouse =====
; Auto mouse click:
; Win+Shift+I to auto click slowly
; Win+Shift+Ctrl+I to auto click quickly
; Win+I to auto stop
#+i::
SetTimer DoClick,500
SoundBeep 440,100
SoundBeep 660,100
return
#+^i::
SetTimer DoClick,50
SoundBeep 440,100
SoundBeep 660,100
SoundBeep 880,100
return
#i::
SetTimer DoClick,off
SoundBeep 660,100
SoundBeep 440,100
return
DoClick:
Send {LButton}
SoundBeep 200,10
return
===== FoxIt =====
The F5 for reload only works if the active file is the most recently opened.
; FoxIt keys: F5=reload
#IfWinActive, ahk_class classFoxitReader
F5::Send ^w!fr1
#IfWinActive
===== Terraria =====
; Terraria: middle click is turbo left click
#IfWinActive, ahk_class WindowsForms10.Window.8.app.0.ea7f4a_r16_ad1
MButton::
SetTimer DoClick,50
SoundBeep 880,50
return
MButton up::
SetTimer DoClick,off
SoundBeep 440,50
return
#IfWinActive
===== Suppress F1 in Explorer, Word, and Excel =====
The code below will replace the annoying help popup with a low-pitched beep. Change "SoundBeep..." to "Return" for silent operation.
; Suppress F1 in Explorer/Word/Excel -- replace the annoying help popup with a low-pitched beep
#IfWinActive ahk_class CabinetWClass
F1::SoundBeep 110,100
#IfWinActive ahk_class OpusApp
F1::SoundBeep 110,100
#IfWinActive ahk_class XLMAIN
F1::SoundBeep 110,100
#IfWinActive
===== Minecraft movement =====
; Ctrl+W = hold W (auto-run)
; Ctrl+LButton = hold LButton (auto-mine)
; Ctrl+RButton = hold RButton (auto-use)
; MButton = Sprint without double-tapping W
; Ctrl+MButton = hold MButton (auto-sprint)
#IfWinActive Minecraft ahk_class SunAwtFrame
^w::
Send {w down}
SoundBeep 500,100
return
^LButton::
Send {LButton down}
SoundBeep 500,100
return
^RButton::
Send {RButton down}
SoundBeep 500,100
return
MButton::
SetKeyDelay 55
Send {w down}{w up}{w down}
KeyWait MButton
Send {w up}
return
^MButton::
SetKeyDelay 55
Send {w down}{w up}{w down}
SoundBeep 500,100
return
#IfWinActive