[[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