[[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 map keys on the Amtelco KB163 Unified Keyboard]]. * [[:using_autohotkey_to_make_a_second_mouse_into_a_multimedia_control|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} ===== Capslock on a timer ===== ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; --- CapsLock hold-to-enable, tap-to-disable --- CapsLock:: capsHoldTime := 500 ; ms required to enable ; If already ON → turn OFF immediately if GetKeyState("CapsLock", "T") { SetCapsLockState, Off SoundBeep, 800, 50 ; disable chirp SoundBeep, 600, 50 return } ; Start hold detection SoundBeep, 600, 40 ; start-of-hold chirp start := A_TickCount while GetKeyState("CapsLock", "P") { if (A_TickCount - start >= capsHoldTime) { SetCapsLockState, On SoundBeep, 600, 50 ; enable chirp SoundBeep, 800, 50 ; --- critical fix --- KeyWait, CapsLock ; wait until key is released return } Sleep, 10 } ; Released early → do nothing return ===== 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") ; < ===== 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