(more after the break)
Usage
Install AutoHotkey
Open Notepad
Paste code below
Save as {whatever}.ahk
run {whatever}.ahk
Tada
Functionality
The Numlock controls what mode you're in.
NumLock On = Typing Mode
NumLock Off = Mouse Mode
The typing method is the same as your cell phone (no predictive, just straight characters)
Layout For Typing Mode.
(might seem upsidedown, but it makes sense if you're used to a cell phone)
Timeout is set for 1 second so just tap away at the key until you see the character you're looking for.
NumLock = Mouse/Keyboard Toggle
/ = backspace
* = nothing currently
- = ScrollWheelUp
+ = ScrollWheelDown
Enter = Enter
7 = ( , ) , [ , ] , 1
8 = a , b , c , 2 , @
9 = d , e , f , 3 , #
4 = g , h , i , 4 , $
5 = j , k , l , 5 , %
6 = m , n , o , 6 , ^
1 = p , q , r , s , &
2 = t , u , v , 8 , ~
3 = w , x , y , z , 9, '
0 = [Space] , 0
. = \ , . : ; ! ?
Layout For Mouse Mode.
There is acceleration built into this so it will speed up gradually as the mouse moves.
NumLock = Mouse/Keyboard Combo
/ = Back
* = Forward
- = ScrollWheelUp
+ = ScrollWheelDown
Enter = Enter
7 = MouseUpLeft
8 = MouseUp
9 = MouseUpRight
4 = MouseLeft
5 = Center Button Click
6 = MouseRight
1 = MouseDownLeft
2 = MouseDown
3 = MouseDownRight
0 = Left Button Click
. = Right Button Click
Enter = Enter
Code
setscrolllockstate=on
setnumlockstate=off
{
;START OF CONFIG SECTION
#SingleInstance force
#MaxHotkeysPerInterval 500
#UseHook
MouseSpeed = 3
MouseAccelerationSpeed = 3
MouseMaxSpeed = 7
MouseWheelSpeed = 1
MouseWheelAccelerationSpeed = 1
MouseWheelMaxSpeed = 5
MouseRotationAngle = 0
;END OF CONFIG SECTION
#InstallKeybdHook
Temp = 0
Temp2 = 0
MouseRotationAnglePart = %MouseRotationAngle%
;Divide by 45º because MouseMove only supports whole numbers,
;and changing the mouse rotation to a number lesser than 45º
;could make strange movements.
;
;For example: 22.5º when pressing NumPadUp:
; First it would move upwards until the speed
; to the side reaches 1.
MouseRotationAnglePart /= 45
MouseCurrentAccelerationSpeed = 0
MouseCurrentSpeed = %MouseSpeed%
MouseWheelCurrentAccelerationSpeed = 0
MouseWheelCurrentSpeed = %MouseSpeed%
SetKeyDelay, -1
SetMouseDelay, -1
Hotkey, *NumPad0, ButtonLeftClick
Hotkey, *NumpadIns, ButtonLeftClickIns
Hotkey, *NumPad5, ButtonMiddleClick
Hotkey, *NumpadClear, ButtonMiddleClickClear
Hotkey, *NumPadDot, ButtonRightClick
Hotkey, *NumPadDel, ButtonRightClickDel
Hotkey, *NumPadDiv, ButtonX1Click
Hotkey, *NumPadMult, ButtonX2Click
;Hotkey, *NumpadSub, ButtonWheelUp
;Hotkey, *NumpadAdd, ButtonWheelDown
Hotkey, *NumPadUp, ButtonUp
Hotkey, *NumPadDown, ButtonDown
Hotkey, *NumPadLeft, ButtonLeft
Hotkey, *NumPadRight, ButtonRight
Hotkey, *NumPadHome, ButtonUpLeft
Hotkey, *NumPadEnd, ButtonUpRight
Hotkey, *NumPadPgUp, ButtonDownLeft
Hotkey, *NumPadPgDn, ButtonDownRight
;Key activation support
Hotkey, *NumPad0, on
Hotkey, *NumpadIns, on
Hotkey, *NumPad5, on
Hotkey, *NumPadDot, on
Hotkey, *NumPadDel, on
Hotkey, *NumPadDiv, on
Hotkey, *NumPadMult, on
; Hotkey, *NumpadSub, on
; Hotkey, *NumpadAdd, on
Hotkey, *NumPadUp, on
Hotkey, *NumPadDown, on
Hotkey, *NumPadLeft, on
Hotkey, *NumPadRight, on
Hotkey, *NumPadHome, on
Hotkey, *NumPadEnd, on
Hotkey, *NumPadPgUp, on
Hotkey, *NumPadPgDn, on
;Mouse click support
ButtonLeftClick:
GetKeyState, already_down_state, LButton
If already_down_state = D
return
Button2 = NumPad0
ButtonClick = Left
Goto ButtonClickStart
ButtonLeftClickIns:
GetKeyState, already_down_state, LButton
If already_down_state = D
return
Button2 = NumPadIns
ButtonClick = Left
Goto ButtonClickStart
ButtonMiddleClick:
GetKeyState, already_down_state, MButton
If already_down_state = D
return
Button2 = NumPad5
ButtonClick = Middle
Goto ButtonClickStart
ButtonMiddleClickClear:
GetKeyState, already_down_state, MButton
If already_down_state = D
return
Button2 = NumPadClear
ButtonClick = Middle
Goto ButtonClickStart
ButtonRightClick:
GetKeyState, already_down_state, RButton
If already_down_state = D
return
Button2 = NumPadDot
ButtonClick = Right
Goto ButtonClickStart
ButtonRightClickDel:
GetKeyState, already_down_state, RButton
If already_down_state = D
return
Button2 = NumPadDel
ButtonClick = Right
Goto ButtonClickStart
ButtonX1Click:
GetKeyState, already_down_state, XButton1
If already_down_state = D
return
Button2 = NumPadDiv
ButtonClick = X1
Goto ButtonClickStart
ButtonX2Click:
GetKeyState, already_down_state, XButton2
If already_down_state = D
return
Button2 = NumPadMult
ButtonClick = X2
Goto ButtonClickStart
ButtonClickStart:
MouseClick, %ButtonClick%,,, 1, 0, D
SetTimer, ButtonClickEnd, 10
return
ButtonClickEnd:
GetKeyState, kclickstate, %Button2%, P
if kclickstate = D
return
SetTimer, ButtonClickEnd, off
MouseClick, %ButtonClick%,,, 1, 0, U
return
;Mouse movement support
ButtonSpeedUp:
MouseSpeed++
ToolTip, Mouse speed: %MouseSpeed% pixels
SetTimer, RemoveToolTip, 1000
return
ButtonSpeedDown:
If MouseSpeed > 1
MouseSpeed--
If MouseSpeed = 1
ToolTip, Mouse speed: %MouseSpeed% pixel
else
ToolTip, Mouse speed: %MouseSpeed% pixels
SetTimer, RemoveToolTip, 1000
return
ButtonAccelerationSpeedUp:
MouseAccelerationSpeed++
ToolTip, Mouse acceleration speed: %MouseAccelerationSpeed% pixels
SetTimer, RemoveToolTip, 1000
return
ButtonAccelerationSpeedDown:
If MouseAccelerationSpeed > 1
MouseAccelerationSpeed--
If MouseAccelerationSpeed = 1
ToolTip, Mouse acceleration speed: %MouseAccelerationSpeed% pixel
else
ToolTip, Mouse acceleration speed: %MouseAccelerationSpeed% pixels
SetTimer, RemoveToolTip, 1000
return
ButtonMaxSpeedUp:
MouseMaxSpeed++
ToolTip, Mouse maximum speed: %MouseMaxSpeed% pixels
SetTimer, RemoveToolTip, 1000
return
ButtonMaxSpeedDown:
If MouseMaxSpeed > 1
MouseMaxSpeed--
If MouseMaxSpeed = 1
ToolTip, Mouse maximum speed: %MouseMaxSpeed% pixel
else
ToolTip, Mouse maximum speed: %MouseMaxSpeed% pixels
SetTimer, RemoveToolTip, 1000
return
ButtonRotationAngleUp:
MouseRotationAnglePart++
If MouseRotationAnglePart >= 8
MouseRotationAnglePart = 0
MouseRotationAngle = %MouseRotationAnglePart%
MouseRotationAngle *= 45
ToolTip, Mouse rotation angle: %MouseRotationAngle%°
SetTimer, RemoveToolTip, 1000
return
ButtonRotationAngleDown:
MouseRotationAnglePart--
If MouseRotationAnglePart < 0
MouseRotationAnglePart = 7
MouseRotationAngle = %MouseRotationAnglePart%
MouseRotationAngle *= 45
ToolTip, Mouse rotation angle: %MouseRotationAngle%°
SetTimer, RemoveToolTip, 1000
return
ButtonUp:
ButtonDown:
ButtonLeft:
ButtonRight:
ButtonUpLeft:
ButtonUpRight:
ButtonDownLeft:
ButtonDownRight:
If Button <> 0
{
IfNotInString, A_ThisHotkey, %Button%
{
MouseCurrentAccelerationSpeed = 0
MouseCurrentSpeed = %MouseSpeed%
}
}
StringReplace, Button, A_ThisHotkey, *
ButtonAccelerationStart:
If MouseAccelerationSpeed >= 1
{
If MouseMaxSpeed > %MouseCurrentSpeed%
{
Temp = 0.001
Temp *= %MouseAccelerationSpeed%
MouseCurrentAccelerationSpeed += %Temp%
MouseCurrentSpeed += %MouseCurrentAccelerationSpeed%
}
}
;MouseRotationAngle convertion to speed of button direction
{
MouseCurrentSpeedToDirection = %MouseRotationAngle%
MouseCurrentSpeedToDirection /= 90.0
Temp = %MouseCurrentSpeedToDirection%
if Temp >= 0
{
if Temp < 1
{
MouseCurrentSpeedToDirection = 1
MouseCurrentSpeedToDirection -= %Temp%
Goto EndMouseCurrentSpeedToDirectionCalculation
}
}
if Temp >= 1
{
if Temp < 2
{
MouseCurrentSpeedToDirection = 0
Temp -= 1
MouseCurrentSpeedToDirection -= %Temp%
Goto EndMouseCurrentSpeedToDirectionCalculation
}
}
if Temp >= 2
{
if Temp < 3
{
MouseCurrentSpeedToDirection = -1
Temp -= 2
MouseCurrentSpeedToDirection += %Temp%
Goto EndMouseCurrentSpeedToDirectionCalculation
}
}
if Temp >= 3
{
if Temp < 4
{
MouseCurrentSpeedToDirection = 0
Temp -= 3
MouseCurrentSpeedToDirection += %Temp%
Goto EndMouseCurrentSpeedToDirectionCalculation
}
}
}
EndMouseCurrentSpeedToDirectionCalculation:
;MouseRotationAngle convertion to speed of 90 degrees to right
{
MouseCurrentSpeedToSide = %MouseRotationAngle%
MouseCurrentSpeedToSide /= 90.0
Temp = %MouseCurrentSpeedToSide%
Transform, Temp, mod, %Temp%, 4
if Temp >= 0
{
if Temp < 1
{
MouseCurrentSpeedToSide = 0
MouseCurrentSpeedToSide += %Temp%
Goto EndMouseCurrentSpeedToSideCalculation
}
}
if Temp >= 1
{
if Temp < 2
{
MouseCurrentSpeedToSide = 1
Temp -= 1
MouseCurrentSpeedToSide -= %Temp%
Goto EndMouseCurrentSpeedToSideCalculation
}
}
if Temp >= 2
{
if Temp < 3
{
MouseCurrentSpeedToSide = 0
Temp -= 2
MouseCurrentSpeedToSide -= %Temp%
Goto EndMouseCurrentSpeedToSideCalculation
}
}
if Temp >= 3
{
if Temp < 4
{
MouseCurrentSpeedToSide = -1
Temp -= 3
MouseCurrentSpeedToSide += %Temp%
Goto EndMouseCurrentSpeedToSideCalculation
}
}
}
EndMouseCurrentSpeedToSideCalculation:
MouseCurrentSpeedToDirection *= %MouseCurrentSpeed%
MouseCurrentSpeedToSide *= %MouseCurrentSpeed%
Temp = %MouseRotationAnglePart%
Transform, Temp, Mod, %Temp%, 2
If Button = NumPadUp
{
if Temp = 1
{
MouseCurrentSpeedToSide *= 2
MouseCurrentSpeedToDirection *= 2
}
MouseCurrentSpeedToDirection *= -1
MouseMove, %MouseCurrentSpeedToSide%, %MouseCurrentSpeedToDirection%, 0, R
}
else if Button = NumPadDown
{
if Temp = 1
{
MouseCurrentSpeedToSide *= 2
MouseCurrentSpeedToDirection *= 2
}
MouseCurrentSpeedToSide *= -1
MouseMove, %MouseCurrentSpeedToSide%, %MouseCurrentSpeedToDirection%, 0, R
}
else if Button = NumPadLeft
{
if Temp = 1
{
MouseCurrentSpeedToSide *= 2
MouseCurrentSpeedToDirection *= 2
}
MouseCurrentSpeedToSide *= -1
MouseCurrentSpeedToDirection *= -1
MouseMove, %MouseCurrentSpeedToDirection%, %MouseCurrentSpeedToSide%, 0, R
}
else if Button = NumPadRight
{
if Temp = 1
{
MouseCurrentSpeedToSide *= 2
MouseCurrentSpeedToDirection *= 2
}
MouseMove, %MouseCurrentSpeedToDirection%, %MouseCurrentSpeedToSide%, 0, R
}
else if Button = NumPadHome
{
Temp = %MouseCurrentSpeedToDirection%
Temp -= %MouseCurrentSpeedToSide%
Temp *= -1
Temp2 = %MouseCurrentSpeedToDirection%
Temp2 += %MouseCurrentSpeedToSide%
Temp2 *= -1
MouseMove, %Temp%, %Temp2%, 0, R
}
else if Button = NumPadPgUp
{
Temp = %MouseCurrentSpeedToDirection%
Temp += %MouseCurrentSpeedToSide%
Temp2 = %MouseCurrentSpeedToDirection%
Temp2 -= %MouseCurrentSpeedToSide%
Temp2 *= -1
MouseMove, %Temp%, %Temp2%, 0, R
}
else if Button = NumPadEnd
{
Temp = %MouseCurrentSpeedToDirection%
Temp += %MouseCurrentSpeedToSide%
Temp *= -1
Temp2 = %MouseCurrentSpeedToDirection%
Temp2 -= %MouseCurrentSpeedToSide%
MouseMove, %Temp%, %Temp2%, 0, R
}
else if Button = NumPadPgDn
{
Temp = %MouseCurrentSpeedToDirection%
Temp -= %MouseCurrentSpeedToSide%
Temp2 *= -1
Temp2 = %MouseCurrentSpeedToDirection%
Temp2 += %MouseCurrentSpeedToSide%
MouseMove, %Temp%, %Temp2%, 0, R
}
SetTimer, ButtonAccelerationEnd, 10
return
ButtonAccelerationEnd:
GetKeyState, kstate, %Button%, P
if kstate = D
Goto ButtonAccelerationStart
SetTimer, ButtonAccelerationEnd, off
MouseCurrentAccelerationSpeed = 0
MouseCurrentSpeed = %MouseSpeed%
Button = 0
return
;Mouse wheel movement support
ButtonWheelSpeedUp:
MouseWheelSpeed++
RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines
If MouseWheelSpeedMultiplier <= 0
MouseWheelSpeedMultiplier = 1
MouseWheelSpeedReal = %MouseWheelSpeed%
MouseWheelSpeedReal *= %MouseWheelSpeedMultiplier%
ToolTip, Mouse wheel speed: %MouseWheelSpeedReal% lines
SetTimer, RemoveToolTip, 1000
return
ButtonWheelSpeedDown:
RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines
If MouseWheelSpeedMultiplier <= 0
MouseWheelSpeedMultiplier = 1
If MouseWheelSpeedReal > %MouseWheelSpeedMultiplier%
{
MouseWheelSpeed--
MouseWheelSpeedReal = %MouseWheelSpeed%
MouseWheelSpeedReal *= %MouseWheelSpeedMultiplier%
}
If MouseWheelSpeedReal = 1
ToolTip, Mouse wheel speed: %MouseWheelSpeedReal% line
else
ToolTip, Mouse wheel speed: %MouseWheelSpeedReal% lines
SetTimer, RemoveToolTip, 1000
return
ButtonWheelAccelerationSpeedUp:
MouseWheelAccelerationSpeed++
RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines
If MouseWheelSpeedMultiplier <= 0
MouseWheelSpeedMultiplier = 1
MouseWheelAccelerationSpeedReal = %MouseWheelAccelerationSpeed%
MouseWheelAccelerationSpeedReal *= %MouseWheelSpeedMultiplier%
ToolTip, Mouse wheel acceleration speed: %MouseWheelAccelerationSpeedReal% lines
SetTimer, RemoveToolTip, 1000
return
ButtonWheelAccelerationSpeedDown:
RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines
If MouseWheelSpeedMultiplier <= 0
MouseWheelSpeedMultiplier = 1
If MouseWheelAccelerationSpeed > 1
{
MouseWheelAccelerationSpeed--
MouseWheelAccelerationSpeedReal = %MouseWheelAccelerationSpeed%
MouseWheelAccelerationSpeedReal *= %MouseWheelSpeedMultiplier%
}
If MouseWheelAccelerationSpeedReal = 1
ToolTip, Mouse wheel acceleration speed: %MouseWheelAccelerationSpeedReal% line
else
ToolTip, Mouse wheel acceleration speed: %MouseWheelAccelerationSpeedReal% lines
SetTimer, RemoveToolTip, 1000
return
ButtonWheelMaxSpeedUp:
MouseWheelMaxSpeed++
RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines
If MouseWheelSpeedMultiplier <= 0
MouseWheelSpeedMultiplier = 1
MouseWheelMaxSpeedReal = %MouseWheelMaxSpeed%
MouseWheelMaxSpeedReal *= %MouseWheelSpeedMultiplier%
ToolTip, Mouse wheel maximum speed: %MouseWheelMaxSpeedReal% lines
SetTimer, RemoveToolTip, 1000
return
ButtonWheelMaxSpeedDown:
RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines
If MouseWheelSpeedMultiplier <= 0
MouseWheelSpeedMultiplier = 1
If MouseWheelMaxSpeed > 1
{
MouseWheelMaxSpeed--
MouseWheelMaxSpeedReal = %MouseWheelMaxSpeed%
MouseWheelMaxSpeedReal *= %MouseWheelSpeedMultiplier%
}
If MouseWheelMaxSpeedReal = 1
ToolTip, Mouse wheel maximum speed: %MouseWheelMaxSpeedReal% line
else
ToolTip, Mouse wheel maximum speed: %MouseWheelMaxSpeedReal% lines
SetTimer, RemoveToolTip, 1000
return
ButtonWheelUp:
ButtonWheelDown:
If Button <> 0
{
If Button <> %A_ThisHotkey%
{
MouseWheelCurrentAccelerationSpeed = 0
MouseWheelCurrentSpeed = %MouseWheelSpeed%
}
}
StringReplace, Button, A_ThisHotkey, *
ButtonWheelAccelerationStart:
If MouseWheelAccelerationSpeed >= 1
{
If MouseWheelMaxSpeed > %MouseWheelCurrentSpeed%
{
Temp = 0.001
Temp *= %MouseWheelAccelerationSpeed%
MouseWheelCurrentAccelerationSpeed += %Temp%
MouseWheelCurrentSpeed += %MouseWheelCurrentAccelerationSpeed%
}
}
;If Button = NumPadSub
; MouseClick, wheelup,,, %MouseWheelCurrentSpeed%, 0, D
;else if Button = NumPadAdd
; MouseClick, wheeldown,,, %MouseWheelCurrentSpeed%, 0, D
SetTimer, ButtonWheelAccelerationEnd, 100
return
ButtonWheelAccelerationEnd:
GetKeyState, kstate, %Button%, P
if kstate = D
Goto ButtonWheelAccelerationStart
MouseWheelCurrentAccelerationSpeed = 0
MouseWheelCurrentSpeed = %MouseWheelSpeed%
Button = 0
return
RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
return
}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Typing Keys
{
Mods = ^!+#
Numpad7::KeyBD("()[]7")
Numpad8::KeyBD("ABC8@")
Numpad9::KeyBD("DEF9#")
Numpad4::KeyBD("GHI4$")
Numpad5::KeyBD("JKL5%")
Numpad6::KeyBD("MNO6^")
Numpad1::KeyBD("PQRS1&")
Numpad2::KeyBD("TUV2~")
Numpad3::KeyBD("WXYZ3'")
Numpad0::KeyBD(" 0")
Numpaddot::KeyBD("\,.:;!?")
NumpadDiv:: ; BackSpace
IfEqual Mod,, Send {BackSpace}
Else {
IfEqual c,, StringTrimRight Mod, Mod, 1
Else c =
ModTip(Mod,c)
}
Return
$NumpadEnter:: ; Enter / Execute commnad
IfEqual Mod,, Send {Enter}
Else {
Send %Mod%%c%
Mod = ; Exit cmd mode
TrayTip
}
Return
KeyBD(list)
{
Static i ; index of the character in the list, to be sent
Global Caps, Mod, c
If (A_ThisHotKey = A_PriorHotKey and A_TimeSincePriorHotkey < 1000)
{
IfEqual Mod,,Send {BS} ; erase the char this key has inserted
i++ ; index of next char, wrapped around
IfGreater i,% StrLen(list), SetEnv i,1
}
Else i = 1 ; at new key send first char from list
StringMid c, list, i, 1
IfEqual Mod,, {
IfEqual Caps,1, StringUpper c,c
Else StringLower c,c
SendRaw %c% ; send selected
}
Else {
StringLower c,c
ModTip(Mod,c)
}
}
}
ModTip(s,c)
{
StringReplace s, s, ^, Ctrl-, All
StringReplace s, s, !, Alt-, All
StringReplace s, s, +, Shift-,All
StringReplace s, s, #, Win-, All
TrayTip,,Cmd = %s%%c%
}
~Numlock:: ; detect NumLock without blocking it (~)
if (GetKeyState("NumLock", "T")) ; get the toggle-state of NumLock
MsgBox,,,Typing Mode,1
else
MsgBox,,,Mouse Mode,1
return
setnumlockstate=off
{
;START OF CONFIG SECTION
#SingleInstance force
#MaxHotkeysPerInterval 500
#UseHook
MouseSpeed = 3
MouseAccelerationSpeed = 3
MouseMaxSpeed = 7
MouseWheelSpeed = 1
MouseWheelAccelerationSpeed = 1
MouseWheelMaxSpeed = 5
MouseRotationAngle = 0
;END OF CONFIG SECTION
#InstallKeybdHook
Temp = 0
Temp2 = 0
MouseRotationAnglePart = %MouseRotationAngle%
;Divide by 45º because MouseMove only supports whole numbers,
;and changing the mouse rotation to a number lesser than 45º
;could make strange movements.
;
;For example: 22.5º when pressing NumPadUp:
; First it would move upwards until the speed
; to the side reaches 1.
MouseRotationAnglePart /= 45
MouseCurrentAccelerationSpeed = 0
MouseCurrentSpeed = %MouseSpeed%
MouseWheelCurrentAccelerationSpeed = 0
MouseWheelCurrentSpeed = %MouseSpeed%
SetKeyDelay, -1
SetMouseDelay, -1
Hotkey, *NumPad0, ButtonLeftClick
Hotkey, *NumpadIns, ButtonLeftClickIns
Hotkey, *NumPad5, ButtonMiddleClick
Hotkey, *NumpadClear, ButtonMiddleClickClear
Hotkey, *NumPadDot, ButtonRightClick
Hotkey, *NumPadDel, ButtonRightClickDel
Hotkey, *NumPadDiv, ButtonX1Click
Hotkey, *NumPadMult, ButtonX2Click
;Hotkey, *NumpadSub, ButtonWheelUp
;Hotkey, *NumpadAdd, ButtonWheelDown
Hotkey, *NumPadUp, ButtonUp
Hotkey, *NumPadDown, ButtonDown
Hotkey, *NumPadLeft, ButtonLeft
Hotkey, *NumPadRight, ButtonRight
Hotkey, *NumPadHome, ButtonUpLeft
Hotkey, *NumPadEnd, ButtonUpRight
Hotkey, *NumPadPgUp, ButtonDownLeft
Hotkey, *NumPadPgDn, ButtonDownRight
;Key activation support
Hotkey, *NumPad0, on
Hotkey, *NumpadIns, on
Hotkey, *NumPad5, on
Hotkey, *NumPadDot, on
Hotkey, *NumPadDel, on
Hotkey, *NumPadDiv, on
Hotkey, *NumPadMult, on
; Hotkey, *NumpadSub, on
; Hotkey, *NumpadAdd, on
Hotkey, *NumPadUp, on
Hotkey, *NumPadDown, on
Hotkey, *NumPadLeft, on
Hotkey, *NumPadRight, on
Hotkey, *NumPadHome, on
Hotkey, *NumPadEnd, on
Hotkey, *NumPadPgUp, on
Hotkey, *NumPadPgDn, on
;Mouse click support
ButtonLeftClick:
GetKeyState, already_down_state, LButton
If already_down_state = D
return
Button2 = NumPad0
ButtonClick = Left
Goto ButtonClickStart
ButtonLeftClickIns:
GetKeyState, already_down_state, LButton
If already_down_state = D
return
Button2 = NumPadIns
ButtonClick = Left
Goto ButtonClickStart
ButtonMiddleClick:
GetKeyState, already_down_state, MButton
If already_down_state = D
return
Button2 = NumPad5
ButtonClick = Middle
Goto ButtonClickStart
ButtonMiddleClickClear:
GetKeyState, already_down_state, MButton
If already_down_state = D
return
Button2 = NumPadClear
ButtonClick = Middle
Goto ButtonClickStart
ButtonRightClick:
GetKeyState, already_down_state, RButton
If already_down_state = D
return
Button2 = NumPadDot
ButtonClick = Right
Goto ButtonClickStart
ButtonRightClickDel:
GetKeyState, already_down_state, RButton
If already_down_state = D
return
Button2 = NumPadDel
ButtonClick = Right
Goto ButtonClickStart
ButtonX1Click:
GetKeyState, already_down_state, XButton1
If already_down_state = D
return
Button2 = NumPadDiv
ButtonClick = X1
Goto ButtonClickStart
ButtonX2Click:
GetKeyState, already_down_state, XButton2
If already_down_state = D
return
Button2 = NumPadMult
ButtonClick = X2
Goto ButtonClickStart
ButtonClickStart:
MouseClick, %ButtonClick%,,, 1, 0, D
SetTimer, ButtonClickEnd, 10
return
ButtonClickEnd:
GetKeyState, kclickstate, %Button2%, P
if kclickstate = D
return
SetTimer, ButtonClickEnd, off
MouseClick, %ButtonClick%,,, 1, 0, U
return
;Mouse movement support
ButtonSpeedUp:
MouseSpeed++
ToolTip, Mouse speed: %MouseSpeed% pixels
SetTimer, RemoveToolTip, 1000
return
ButtonSpeedDown:
If MouseSpeed > 1
MouseSpeed--
If MouseSpeed = 1
ToolTip, Mouse speed: %MouseSpeed% pixel
else
ToolTip, Mouse speed: %MouseSpeed% pixels
SetTimer, RemoveToolTip, 1000
return
ButtonAccelerationSpeedUp:
MouseAccelerationSpeed++
ToolTip, Mouse acceleration speed: %MouseAccelerationSpeed% pixels
SetTimer, RemoveToolTip, 1000
return
ButtonAccelerationSpeedDown:
If MouseAccelerationSpeed > 1
MouseAccelerationSpeed--
If MouseAccelerationSpeed = 1
ToolTip, Mouse acceleration speed: %MouseAccelerationSpeed% pixel
else
ToolTip, Mouse acceleration speed: %MouseAccelerationSpeed% pixels
SetTimer, RemoveToolTip, 1000
return
ButtonMaxSpeedUp:
MouseMaxSpeed++
ToolTip, Mouse maximum speed: %MouseMaxSpeed% pixels
SetTimer, RemoveToolTip, 1000
return
ButtonMaxSpeedDown:
If MouseMaxSpeed > 1
MouseMaxSpeed--
If MouseMaxSpeed = 1
ToolTip, Mouse maximum speed: %MouseMaxSpeed% pixel
else
ToolTip, Mouse maximum speed: %MouseMaxSpeed% pixels
SetTimer, RemoveToolTip, 1000
return
ButtonRotationAngleUp:
MouseRotationAnglePart++
If MouseRotationAnglePart >= 8
MouseRotationAnglePart = 0
MouseRotationAngle = %MouseRotationAnglePart%
MouseRotationAngle *= 45
ToolTip, Mouse rotation angle: %MouseRotationAngle%°
SetTimer, RemoveToolTip, 1000
return
ButtonRotationAngleDown:
MouseRotationAnglePart--
If MouseRotationAnglePart < 0
MouseRotationAnglePart = 7
MouseRotationAngle = %MouseRotationAnglePart%
MouseRotationAngle *= 45
ToolTip, Mouse rotation angle: %MouseRotationAngle%°
SetTimer, RemoveToolTip, 1000
return
ButtonUp:
ButtonDown:
ButtonLeft:
ButtonRight:
ButtonUpLeft:
ButtonUpRight:
ButtonDownLeft:
ButtonDownRight:
If Button <> 0
{
IfNotInString, A_ThisHotkey, %Button%
{
MouseCurrentAccelerationSpeed = 0
MouseCurrentSpeed = %MouseSpeed%
}
}
StringReplace, Button, A_ThisHotkey, *
ButtonAccelerationStart:
If MouseAccelerationSpeed >= 1
{
If MouseMaxSpeed > %MouseCurrentSpeed%
{
Temp = 0.001
Temp *= %MouseAccelerationSpeed%
MouseCurrentAccelerationSpeed += %Temp%
MouseCurrentSpeed += %MouseCurrentAccelerationSpeed%
}
}
;MouseRotationAngle convertion to speed of button direction
{
MouseCurrentSpeedToDirection = %MouseRotationAngle%
MouseCurrentSpeedToDirection /= 90.0
Temp = %MouseCurrentSpeedToDirection%
if Temp >= 0
{
if Temp < 1
{
MouseCurrentSpeedToDirection = 1
MouseCurrentSpeedToDirection -= %Temp%
Goto EndMouseCurrentSpeedToDirectionCalculation
}
}
if Temp >= 1
{
if Temp < 2
{
MouseCurrentSpeedToDirection = 0
Temp -= 1
MouseCurrentSpeedToDirection -= %Temp%
Goto EndMouseCurrentSpeedToDirectionCalculation
}
}
if Temp >= 2
{
if Temp < 3
{
MouseCurrentSpeedToDirection = -1
Temp -= 2
MouseCurrentSpeedToDirection += %Temp%
Goto EndMouseCurrentSpeedToDirectionCalculation
}
}
if Temp >= 3
{
if Temp < 4
{
MouseCurrentSpeedToDirection = 0
Temp -= 3
MouseCurrentSpeedToDirection += %Temp%
Goto EndMouseCurrentSpeedToDirectionCalculation
}
}
}
EndMouseCurrentSpeedToDirectionCalculation:
;MouseRotationAngle convertion to speed of 90 degrees to right
{
MouseCurrentSpeedToSide = %MouseRotationAngle%
MouseCurrentSpeedToSide /= 90.0
Temp = %MouseCurrentSpeedToSide%
Transform, Temp, mod, %Temp%, 4
if Temp >= 0
{
if Temp < 1
{
MouseCurrentSpeedToSide = 0
MouseCurrentSpeedToSide += %Temp%
Goto EndMouseCurrentSpeedToSideCalculation
}
}
if Temp >= 1
{
if Temp < 2
{
MouseCurrentSpeedToSide = 1
Temp -= 1
MouseCurrentSpeedToSide -= %Temp%
Goto EndMouseCurrentSpeedToSideCalculation
}
}
if Temp >= 2
{
if Temp < 3
{
MouseCurrentSpeedToSide = 0
Temp -= 2
MouseCurrentSpeedToSide -= %Temp%
Goto EndMouseCurrentSpeedToSideCalculation
}
}
if Temp >= 3
{
if Temp < 4
{
MouseCurrentSpeedToSide = -1
Temp -= 3
MouseCurrentSpeedToSide += %Temp%
Goto EndMouseCurrentSpeedToSideCalculation
}
}
}
EndMouseCurrentSpeedToSideCalculation:
MouseCurrentSpeedToDirection *= %MouseCurrentSpeed%
MouseCurrentSpeedToSide *= %MouseCurrentSpeed%
Temp = %MouseRotationAnglePart%
Transform, Temp, Mod, %Temp%, 2
If Button = NumPadUp
{
if Temp = 1
{
MouseCurrentSpeedToSide *= 2
MouseCurrentSpeedToDirection *= 2
}
MouseCurrentSpeedToDirection *= -1
MouseMove, %MouseCurrentSpeedToSide%, %MouseCurrentSpeedToDirection%, 0, R
}
else if Button = NumPadDown
{
if Temp = 1
{
MouseCurrentSpeedToSide *= 2
MouseCurrentSpeedToDirection *= 2
}
MouseCurrentSpeedToSide *= -1
MouseMove, %MouseCurrentSpeedToSide%, %MouseCurrentSpeedToDirection%, 0, R
}
else if Button = NumPadLeft
{
if Temp = 1
{
MouseCurrentSpeedToSide *= 2
MouseCurrentSpeedToDirection *= 2
}
MouseCurrentSpeedToSide *= -1
MouseCurrentSpeedToDirection *= -1
MouseMove, %MouseCurrentSpeedToDirection%, %MouseCurrentSpeedToSide%, 0, R
}
else if Button = NumPadRight
{
if Temp = 1
{
MouseCurrentSpeedToSide *= 2
MouseCurrentSpeedToDirection *= 2
}
MouseMove, %MouseCurrentSpeedToDirection%, %MouseCurrentSpeedToSide%, 0, R
}
else if Button = NumPadHome
{
Temp = %MouseCurrentSpeedToDirection%
Temp -= %MouseCurrentSpeedToSide%
Temp *= -1
Temp2 = %MouseCurrentSpeedToDirection%
Temp2 += %MouseCurrentSpeedToSide%
Temp2 *= -1
MouseMove, %Temp%, %Temp2%, 0, R
}
else if Button = NumPadPgUp
{
Temp = %MouseCurrentSpeedToDirection%
Temp += %MouseCurrentSpeedToSide%
Temp2 = %MouseCurrentSpeedToDirection%
Temp2 -= %MouseCurrentSpeedToSide%
Temp2 *= -1
MouseMove, %Temp%, %Temp2%, 0, R
}
else if Button = NumPadEnd
{
Temp = %MouseCurrentSpeedToDirection%
Temp += %MouseCurrentSpeedToSide%
Temp *= -1
Temp2 = %MouseCurrentSpeedToDirection%
Temp2 -= %MouseCurrentSpeedToSide%
MouseMove, %Temp%, %Temp2%, 0, R
}
else if Button = NumPadPgDn
{
Temp = %MouseCurrentSpeedToDirection%
Temp -= %MouseCurrentSpeedToSide%
Temp2 *= -1
Temp2 = %MouseCurrentSpeedToDirection%
Temp2 += %MouseCurrentSpeedToSide%
MouseMove, %Temp%, %Temp2%, 0, R
}
SetTimer, ButtonAccelerationEnd, 10
return
ButtonAccelerationEnd:
GetKeyState, kstate, %Button%, P
if kstate = D
Goto ButtonAccelerationStart
SetTimer, ButtonAccelerationEnd, off
MouseCurrentAccelerationSpeed = 0
MouseCurrentSpeed = %MouseSpeed%
Button = 0
return
;Mouse wheel movement support
ButtonWheelSpeedUp:
MouseWheelSpeed++
RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines
If MouseWheelSpeedMultiplier <= 0
MouseWheelSpeedMultiplier = 1
MouseWheelSpeedReal = %MouseWheelSpeed%
MouseWheelSpeedReal *= %MouseWheelSpeedMultiplier%
ToolTip, Mouse wheel speed: %MouseWheelSpeedReal% lines
SetTimer, RemoveToolTip, 1000
return
ButtonWheelSpeedDown:
RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines
If MouseWheelSpeedMultiplier <= 0
MouseWheelSpeedMultiplier = 1
If MouseWheelSpeedReal > %MouseWheelSpeedMultiplier%
{
MouseWheelSpeed--
MouseWheelSpeedReal = %MouseWheelSpeed%
MouseWheelSpeedReal *= %MouseWheelSpeedMultiplier%
}
If MouseWheelSpeedReal = 1
ToolTip, Mouse wheel speed: %MouseWheelSpeedReal% line
else
ToolTip, Mouse wheel speed: %MouseWheelSpeedReal% lines
SetTimer, RemoveToolTip, 1000
return
ButtonWheelAccelerationSpeedUp:
MouseWheelAccelerationSpeed++
RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines
If MouseWheelSpeedMultiplier <= 0
MouseWheelSpeedMultiplier = 1
MouseWheelAccelerationSpeedReal = %MouseWheelAccelerationSpeed%
MouseWheelAccelerationSpeedReal *= %MouseWheelSpeedMultiplier%
ToolTip, Mouse wheel acceleration speed: %MouseWheelAccelerationSpeedReal% lines
SetTimer, RemoveToolTip, 1000
return
ButtonWheelAccelerationSpeedDown:
RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines
If MouseWheelSpeedMultiplier <= 0
MouseWheelSpeedMultiplier = 1
If MouseWheelAccelerationSpeed > 1
{
MouseWheelAccelerationSpeed--
MouseWheelAccelerationSpeedReal = %MouseWheelAccelerationSpeed%
MouseWheelAccelerationSpeedReal *= %MouseWheelSpeedMultiplier%
}
If MouseWheelAccelerationSpeedReal = 1
ToolTip, Mouse wheel acceleration speed: %MouseWheelAccelerationSpeedReal% line
else
ToolTip, Mouse wheel acceleration speed: %MouseWheelAccelerationSpeedReal% lines
SetTimer, RemoveToolTip, 1000
return
ButtonWheelMaxSpeedUp:
MouseWheelMaxSpeed++
RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines
If MouseWheelSpeedMultiplier <= 0
MouseWheelSpeedMultiplier = 1
MouseWheelMaxSpeedReal = %MouseWheelMaxSpeed%
MouseWheelMaxSpeedReal *= %MouseWheelSpeedMultiplier%
ToolTip, Mouse wheel maximum speed: %MouseWheelMaxSpeedReal% lines
SetTimer, RemoveToolTip, 1000
return
ButtonWheelMaxSpeedDown:
RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines
If MouseWheelSpeedMultiplier <= 0
MouseWheelSpeedMultiplier = 1
If MouseWheelMaxSpeed > 1
{
MouseWheelMaxSpeed--
MouseWheelMaxSpeedReal = %MouseWheelMaxSpeed%
MouseWheelMaxSpeedReal *= %MouseWheelSpeedMultiplier%
}
If MouseWheelMaxSpeedReal = 1
ToolTip, Mouse wheel maximum speed: %MouseWheelMaxSpeedReal% line
else
ToolTip, Mouse wheel maximum speed: %MouseWheelMaxSpeedReal% lines
SetTimer, RemoveToolTip, 1000
return
ButtonWheelUp:
ButtonWheelDown:
If Button <> 0
{
If Button <> %A_ThisHotkey%
{
MouseWheelCurrentAccelerationSpeed = 0
MouseWheelCurrentSpeed = %MouseWheelSpeed%
}
}
StringReplace, Button, A_ThisHotkey, *
ButtonWheelAccelerationStart:
If MouseWheelAccelerationSpeed >= 1
{
If MouseWheelMaxSpeed > %MouseWheelCurrentSpeed%
{
Temp = 0.001
Temp *= %MouseWheelAccelerationSpeed%
MouseWheelCurrentAccelerationSpeed += %Temp%
MouseWheelCurrentSpeed += %MouseWheelCurrentAccelerationSpeed%
}
}
;If Button = NumPadSub
; MouseClick, wheelup,,, %MouseWheelCurrentSpeed%, 0, D
;else if Button = NumPadAdd
; MouseClick, wheeldown,,, %MouseWheelCurrentSpeed%, 0, D
SetTimer, ButtonWheelAccelerationEnd, 100
return
ButtonWheelAccelerationEnd:
GetKeyState, kstate, %Button%, P
if kstate = D
Goto ButtonWheelAccelerationStart
MouseWheelCurrentAccelerationSpeed = 0
MouseWheelCurrentSpeed = %MouseWheelSpeed%
Button = 0
return
RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
return
}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Typing Keys
{
Mods = ^!+#
Numpad7::KeyBD("()[]7")
Numpad8::KeyBD("ABC8@")
Numpad9::KeyBD("DEF9#")
Numpad4::KeyBD("GHI4$")
Numpad5::KeyBD("JKL5%")
Numpad6::KeyBD("MNO6^")
Numpad1::KeyBD("PQRS1&")
Numpad2::KeyBD("TUV2~")
Numpad3::KeyBD("WXYZ3'")
Numpad0::KeyBD(" 0")
Numpaddot::KeyBD("\,.:;!?")
NumpadDiv:: ; BackSpace
IfEqual Mod,, Send {BackSpace}
Else {
IfEqual c,, StringTrimRight Mod, Mod, 1
Else c =
ModTip(Mod,c)
}
Return
$NumpadEnter:: ; Enter / Execute commnad
IfEqual Mod,, Send {Enter}
Else {
Send %Mod%%c%
Mod = ; Exit cmd mode
TrayTip
}
Return
KeyBD(list)
{
Static i ; index of the character in the list, to be sent
Global Caps, Mod, c
If (A_ThisHotKey = A_PriorHotKey and A_TimeSincePriorHotkey < 1000)
{
IfEqual Mod,,Send {BS} ; erase the char this key has inserted
i++ ; index of next char, wrapped around
IfGreater i,% StrLen(list), SetEnv i,1
}
Else i = 1 ; at new key send first char from list
StringMid c, list, i, 1
IfEqual Mod,, {
IfEqual Caps,1, StringUpper c,c
Else StringLower c,c
SendRaw %c% ; send selected
}
Else {
StringLower c,c
ModTip(Mod,c)
}
}
}
ModTip(s,c)
{
StringReplace s, s, ^, Ctrl-, All
StringReplace s, s, !, Alt-, All
StringReplace s, s, +, Shift-,All
StringReplace s, s, #, Win-, All
TrayTip,,Cmd = %s%%c%
}
~Numlock:: ; detect NumLock without blocking it (~)
if (GetKeyState("NumLock", "T")) ; get the toggle-state of NumLock
MsgBox,,,Typing Mode,1
else
MsgBox,,,Mouse Mode,1
return
Nice article, infact great blog, some good posts. Definitely going to be looking at your caar PC controller one soon.
ReplyDeleteThis post gave me an idea to re-purpose an old numpad for use in controlling photoshop most used tools and action shortcuts.
http://i56.tinypic.com/ivzm9h.jpg
With AHK as:
-------
Menu, Tray, Icon, %A_ScriptDir%\pspad.ico
#SingleInstance force
settitlematchmode 2
:*:000::
IfWinNotExist, Adobe Photoshop CS5
{
Run, "C:\Program Files (x86)\Adobe\Adobe Photoshop CS5\Photoshop.exe"
}
else
{
WinWait, Adobe Photoshop CS5 Extended,
IfWinNotActive, Adobe Photoshop CS5 Extended, , WinActivate, Adobe Photoshop CS5 Extended,
WinWaitActive, Adobe Photoshop CS5 Extended,
}
return
#ifWinActive ahk_class Photoshop
{
;Bind + to increase brush size
numpadadd::
{
Send, ]
Sleep, 100
return
}
;Bind - to decrease brush size
numpadsub::
{
Send, [
Sleep, 100
return
}
;Bind / to paint bucket
numpaddiv::
{
Send, +g
Sleep, 100
return
}
;Bind * to lasso
numpadmult::
{
Send, +l
Sleep, 100
return
}
;Bind backspace to wizard tool
backspace::
{
Send, +w
Sleep, 100
return
}
;Bind 0 to landscape resizer action
numpad0::
{
Send, ^{F12}
Sleep, 100
return
}
;Bind 1 to Wedding Clean action
numpad1::
{
Send, +{F12}
Sleep, 100
return
}
;Bind 2 to Model Skin action
numpad2::
{
Send, +{F11}
Sleep, 100
return
}
;Bind 3 to Save As
numpad3::
{
Send, +^s
Sleep, 100
return
}
;Bind 4 to heal tool
numpad4::
{
Send, +j
Sleep, 100
return
}
;Bind 5 to clone tool
numpad5::
{
Send, +s
Sleep, 100
return
}
;Bind 6 to duplicate layer
numpad6::
{
Send, ^j
Sleep, 100
return
}
;Bind 7 to brush tool
numpad7::
{
Send, +b
Sleep, 100
return
}
;Bind 8 to pen tool
numpad8::
{
Send, +p
Sleep, 100
return
}
;Bind 9 to brush tool
numpad9::
{
Send, +e
Sleep, 100
return
}
;Bind enter to undo
NumpadEnter::
{
Send, !^z
Sleep, 100
return
}
}
------
Cheers for the post and idea :)
~Shepy
Thanks for the props. And that's a great idea on the photoshop mod. I'm not a heavy photoshop user, but the next time I have the need I'm going to have to steal this.
ReplyDelete