Professional Documents
Culture Documents
Mouse Using Numpad
Mouse Using Numpad
; http://www.autohotkey.com
; This script makes mousing with your keyboard almost as easy
; as using a real mouse (maybe even easier for some tasks).
; It supports up to five mouse buttons and the turning of the
; mouse wheel. It also features customizable movement speed,
; acceleration, and "axis inversion".
/*
o----------------------------------------------------------------------------------
------o
|Using Keyboard Numpad as a Mouse
|
(----------------------------------------------------------------------------------
------)
| ver. 1.0 by deguix / A Script file for AutoHotkey 1.0.22+
|
|
--------------------------------------------------------------------|
|
|
| This script is an example of use of AutoHotkey. It uses the remapping of numpad
keys |
| of a keyboard to transform it into a mouse. Some features are the acceleration
which |
| enables you to increase the mouse movement when holding a key for a long time,
and the |
| rotation which makes the numpad mouse to "turn". I.e. NumpadDown as NumpadUp and
|
| vice-versa. See the list of keys used below:
|
|
|
|----------------------------------------------------------------------------------
------|
| Keys | Description
|
|----------------------------------------------------------------------------------
------|
| ScrollLock (toggle on)| Activates numpad mouse mode.
|
|-----------------------|----------------------------------------------------------
------|
| Numpad0 | Left mouse button click.
|
| Numpad5 | Middle mouse button click.
|
| NumpadDot | Right mouse button click.
|
| NumpadDiv/NumpadMult | X1/X2 mouse button click. (Win 2k+)
|
| NumpadSub/NumpadAdd | Moves up/down the mouse wheel.
|
| |
|
|-----------------------|----------------------------------------------------------
------|
| NumLock (toggled off) | Activates mouse movement mode.
|
|-----------------------|----------------------------------------------------------
------|
| NumpadEnd/Down/PgDn/ | Mouse movement.
|
| /Left/Right/Home/Up/ |
|
| /PgUp |
|
| |
|
|-----------------------|----------------------------------------------------------
------|
| NumLock (toggled on) | Activates mouse speed adj. mode.
|
|-----------------------|----------------------------------------------------------
------|
| Numpad7/Numpad1 | Inc./dec. acceleration per button press.
|
| Numpad8/Numpad2 | Inc./dec. initial speed per button press.
|
| Numpad9/Numpad3 | Inc./dec. maximum speed per button press.
|
| !Numpad7/^Numpad1 | Inc./dec. wheel acceleration per button press*.
|
| !Numpad8/^Numpad2 | Inc./dec. wheel initial speed per button press*.
|
| !Numpad9/^Numpad3 | Inc./dec. wheel maximum speed per button press*.
|
| Numpad4/Numpad6 | Inc./dec. rotation angle to right in degrees. (i.e. 180°
= |
| | = inversed controls).
|
|----------------------------------------------------------------------------------
------|
| * = These options are affected by the mouse wheel speed |
| adjusted on Control Panel. If you don't have a mouse with |
| wheel, the default is 3 +/- lines per option button press. |
o------------------------------------------------------------o
| Change log |
|------------------------------------------------------------|
| 1.01 by mslonik | Added saving of config param into |
| | file (NumpadMouse.ini): |
| | MouseSpeed |
| | MouseAccelerationSpeed |
| | MouseMaxSpeed |
| | MouseWheelSpeed |
| | MouseWheelAccelerationSpeed |
| | MouseWheelMaxSpeed |
| | MouseRotationAngle |
| | Added tooltips for ScrollLock and |
| | NumLock |
|------------------------------------------------------------|
| 1.02 by mslonik | Added menu info about app. |
|------------------------------------------------------------|
| 1.03 by mslonik | Added X2 (NumPadMul) to center |
| | cursor within active window area. |
| | Optimized saving of parameters |
o------------------------------------------------------------o
*/
;START OF CONFIG SECTION
#SingleInstance force
#MaxHotkeysPerInterval 500
; Using the keyboard hook to implement the Numpad hotkeys prevents them from
interfering with the generation of ANSI characters such
; as ŕ. This is because AutoHotkey generates such characters by holding down ALT
and sending a series of Numpad keystrokes.
; Hook hotkeys are smart enough to ignore such keystrokes.
#UseHook
Menu, Tray, Icon, ddores.dll, 106 ; this line will turn the H icon into a small
keyboard-mouse looking thing
ApplicationName := "NumpadMouse"
Gosub, INIREAD ; Jumps to the specified label and continues execution until
Return is encountered
Gosub, TRAYMENU ; Jumps to the specified label and continues execution until
Return is encountered
;This is needed or key presses would faulty send their natural actions. Like
NumpadDiv would send sometimes "/" to the screen.
#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
~ScrollLock::
; Wait for it to be released because otherwise the hook state gets reset
; while the key is down, which causes the up-event to get suppressed,
; which in turn prevents toggling of the ScrollLock state/light:
KeyWait, ScrollLock
GetKeyState, ScrollLockState, ScrollLock, T
If ScrollLockState = D
{
ToolTip, NumPadMouse activated
SetTimer, RemoveToolTip, 1000
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
Hotkey, Numpad8, On
Hotkey, Numpad2, On
Hotkey, Numpad7, On
Hotkey, Numpad1, On
Hotkey, Numpad9, On
Hotkey, Numpad3, On
Hotkey, Numpad6, On
Hotkey, Numpad4, On
Hotkey, !Numpad8, On
Hotkey, !Numpad2, On
Hotkey, !Numpad7, On
Hotkey, !Numpad1, On
Hotkey, !Numpad9, On
Hotkey, !Numpad3, On
}
else
{
ToolTip, NumPadMouse deactivated
SetTimer, RemoveToolTip, 1000
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:
WinGetActiveStats, Title, Width, Height, X, Y
;~ MouseClick, %ButtonClick%,,, 1, 0, D
CoordMode, Mouse, Window
MouseMove, Width/2, Height/2, 0
;~ MsgBox, % "X: " . X " Y: " . Y " Width: " . Width " Height: " . Height " Pos x:
" . X + Width/2 " Pos y: " Y + Height/2
SetTimer, ButtonClickEnd, 10
return
ButtonClickEnd:
GetKeyState, kclickstate, %Button2%, P
if kclickstate = D
return
ButtonSpeedUp:
MouseSpeed++
ToolTip, Mouse speed: %MouseSpeed% pixels
SetTimer, RemoveToolTip, 1000
;~ IniWrite, %MouseSpeed%, %ApplicationName%.ini, MouseSpeed, MouseSpeed
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% ; Checks if a variable contains the
specified string. Var: A_ThisHotkey. SearchString: %Button%
{
MouseCurrentAccelerationSpeed = 0
MouseCurrentSpeed = %MouseSpeed%
}
}
StringReplace, Button, A_ThisHotkey, * ; Replaces the specified substring with a
new string. OutputVar = Button, The name of the variable in which to store the
result of the replacement process. InputVar = A_ThisHotkey, The name of the
variable whose contents will be read from. SearchText = * The string to search for.
ButtonAccelerationStart:
If MouseAccelerationSpeed >= 1
{
If MouseMaxSpeed > %MouseCurrentSpeed%
{
Temp = 0.001
Temp *= %MouseAccelerationSpeed%
MouseCurrentAccelerationSpeed += %Temp%
MouseCurrentSpeed += %MouseCurrentAccelerationSpeed%
}
}
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:
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
SetTimer, ButtonAccelerationEnd, 10
return
ButtonAccelerationEnd:
GetKeyState, kstate, %Button%, P
if kstate = D
Goto ButtonAccelerationStart
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
ButtonWheelAccelerationEnd:
GetKeyState, kstate, %Button%, P
if kstate = D
Goto ButtonWheelAccelerationStart
MouseWheelCurrentAccelerationSpeed = 0
MouseWheelCurrentSpeed = %MouseWheelSpeed%
Button = 0
return
RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
return
INIREAD:
IfNotExist, %ApplicationName%.ini ; Checks for the existence of a file or
folder
{
ini=
(
[MouseSpeed]
MouseSpeed = 1
MouseAccelerationSpeed = 1
MouseMaxSpeed = 5
[MouseWheel]
MouseWheelSpeed = 1
MouseWheelAccelerationSpeed = 1
MouseWheelMaxSpeed = 5
[MouseRotationAngle]
MouseRotationAngle = 0
)
FileAppend, %ini%, %ApplicationName%.ini
ini=
}
TRAYMENU:
Menu, Tray, Add, %ApplicationName% ABOUT, ABOUT
Menu, Tray, Default, %ApplicationName% ABOUT ; Default: Changes the menu's default
item to be the specified menu item and makes its font bold.
Menu, Tray, Add ; To add a menu separator line, omit all three parameters. To put
your menu items on top of the standard menu items (after adding your own menu
items) run Menu, Tray, NoStandard followed by Menu, Tray, Standard.
Menu, Tray, NoStandard
Menu, Tray, Standard
Menu, Tray, Tip, %ApplicationName% ; Changes the tray icon's tooltip.
return
ABOUT:
Gui, MyAbout: Margin,, 0
Gui, MyAbout: Font, Bold
Gui, MyAbout: Add, Text, , %ApplicationName% v.1.02 by deguix and mslonik
Gui, MyAbout: Font
Gui, MyAbout: Add, Button, Default Hidden w100 gMyOK Center vOkButtonVariabl
hwndOkButtonHandle, &OK
GuiControlGet, MyGuiControlGetVariable, MyAbout: Pos, %OkButtonHandle%
Gui, MyAbout: Show, Center, %ApplicationName% About
WinGetPos, , , MyAboutWindowWidth, , %ApplicationName% About
NewButtonXPosition := (MyAboutWindowWidth / 2) - (MyGuiControlGetVariableW / 2)
GuiControl, Move, %OkButtonHandle%, % "x" NewButtonXPosition
GuiControl, Show, %OkButtonHandle%
return
MyOK:
MyAboutGuiClose: ; Launched when the window is closed by pressing its X button in
the title bar
Gui, MyAbout: Destroy
return