AutoHotkey Homepage AutoHotkey Community
Let's help each other out
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

No Mouse Today! - A Numpad Mouse Replacement
Goto page 1, 2  Next
 
Reply to topic    AutoHotkey Community Forum Index -> Scripts & Functions
View previous topic :: View next topic  
Author Message
Icarus



Joined: 24 Nov 2005
Posts: 851

PostPosted: Mon Jun 02, 2008 4:56 pm    Post subject: No Mouse Today! - A Numpad Mouse Replacement Reply with quote

No Mouse Today! v0.20

Wanted to do my own variation for a mouse replacement, using the magnificent numpad.

I checked the help page (search for "numpad") and there is a huge script there to do that (>700 lines) and it seemed to be a little too complicated to my taste, and did not work on my computer (dont know if its because it is too old, didnt try to fix it)

This version supports inertia for the mouse movement, for a more convenient use.

So, here is my version.
Code:

;-------------------------------------------------------------------------------
; No Mouse Today! 0.20
; A Numpad Mouse Replacement (for days without a mouse...)
;-------------------------------------------------------------------------------
;
;   • Disable Numlock to Activate
;   +------------+------------+------------+------------+
;   | Numlock    | / (Toggle) | *          | -          |
;   | Off        | Drag       |            | Center Win |
;   +------------+------------+------------+------------+
;   | 7          | 8          | 9          | +          |
;   | Wheel Up   | Up         | Navgat Fwd | Right Clik |
;   +------------+------------+------------+            |
;   | 4          | 5          | 6          |            |
;   | Left       | Click      | Right      |            |
;   +------------+------------+------------+------------+
;   | 1          | 2          | 3          | Enter      |
;   | Wheel Down | Down       | Navgat Bck | Dbl Click  |
;   +------------+------------+------------+            |
;   | 0 (Hold)                | .          |            |
;   | Constant Move Speed     | Clockwise  |            |
;   +-------------------------+------------+------------+
;   • Hold down Shift while moving for one pixel movement
;   • Hold down Alt for 2468 to act like mouse wheel scroll (4 directions)
;   • Pressing two movement keys together will move diagonally
;   • Pressing Ctrl, Alt or Shift while clicking or mousewheeling works the same
;     as with a normal mouse
;   • Pressing NumpadDot will move the mouse through the four quarters of the
;     screen (clockwise)   
;   
;-------------------------------------------------------------------------------
#SingleInstance Force
#HotkeyInterval 1000
#MaxHotkeysPerInterval 1000
CoordMode Mouse, Screen
SendMode InputThenPlay         ; If not working, try: SendMode Input

; --- GENERAL CONFIGURATION ----------------------------------------------------
  ConstantSpeed := 2      ; Pixels to move when Numpad0 is held down
  MinSpeed      := 1      ; Pixels to move at the beginning of the movement
  MaxSpeed      := 4      ; Pixels to move at the fastest inertia
  Inertia       := 0.1    ; How fast should we increase speed (higher=faster, 0=none)
  InertiaDelay  := 0      ; Number of movements to wait before starting inertia
  WheelSleep    := 80     ; MSeconds to sleep between wheel sends
 
; --- KEYBOARD CONFIGURATION ---------------------------------------------------
  RightKey      := "NumpadRight"
  DownKey       := "NumpadDown"
  UpKey         := "NumpadUp"
  LeftKey       := "NumpadLeft"
 
  ClickKey      := "NumpadClear"   ; Clear is 5 in the numpad
  DoubleClickKey:= "NumpadEnter"   ; Double click cn also be done by double tapping the click key
  RightClickKey := "NumpadAdd"
  ForwardKey    := "NumpadPgUp"   
  BackKey       := "NumpadPgDn"
 
  WheelUpKey    := "NumpadHome"
  WheelDownKey  := "NumpadEnd"
 
   CornerKey     := "NumpadDel"      ; Moves the mouse between the 4 quarters of the screen
  CenterKey     := "NumpadSub"      ; Centers the mouse on the screen
  DragKey       := "NumpadDiv"      ; Toggle to start/stop dragging 
  ConstantKey   := "NumpadIns"      ; Hold while moving to ignore inertia
 
; --- END OF CONFIGURATION -----------------------------------------------------

Menu Tray, NoStandard
Menu Tray, Add, Exit No Mouse Today!, Exit

SysGet ScreenW, 78
SysGet ScreenH, 79

; • Mouse Moves •
Hotkey *%RightKey%, MouseRight
Hotkey *%DownKey%, MouseDown
Hotkey *%UpKey%, MouseUp
Hotkey *%LeftKey%, MouseLeft
Hotkey %ConstantKey%, MouseConstant

; • Mouse Clicks •
Hotkey *%ClickKey%, MouseClickHandler
Hotkey *%ForwardKey%, MouseForward
Hotkey *%BackKey%, MouseBack
Hotkey $*%DoubleClickKey%, MouseDoubleClick
Hotkey $*%RightClickKey%, MouseRightClick

; • Special Functions •
Hotkey $*%DragKey%, MouseDrag
Hotkey $%CenterKey%, CenterMouse
Hotkey $%CornerKey%, CornerMouse

; • Mouse Wheel •
Hotkey *%WheelUpKey%, MouseWheelUp
Hotkey *%WheelDownKey%, MouseWheelDown

Return

;
; This routine handles the 2468 keys: Mouse moves, or mouse wheel emulation
;
MouseMoveHandler:
  ControlGetFocus, fcontrol, A
 
  Counter := 0
  Loop {
    If( GetKeyState( "Alt", "P" ) ) {    ; Wheel Emulation through Ctrl+2468
   
      WX := ( GetKeyState( RightKey, "P" ) ? 1 : GetKeyState( LeftKey, "P" ) ? 0 : -1 )
      WY := ( GetKeyState( DownKey , "P" ) ? "WheelDown" : GetKeyState( UpKey, "P" )  ? "WheelUp" : -1 )
     
      If( WX<>-1 )
        SendMessage, 0x114, %WX%, 0, %fcontrol%, A  ; 0x114 is WM_HSCROLL and the 0 after it is SB_LINERIGHT.

      If( WY<>-1 )
        SendInput {%WY%}

      Sleep %WheelSleep%
    }
    Else {    ; Mouse moves
         InsPressed := GetKeyState( ConstantKey, "P" )
      Speed := InsPressed ? ConstantSpeed : Counter>InertiaDelay ? MinSpeed+(Counter-InertiaDelay)*Inertia : MinSpeed
      Speed := Speed > MaxSpeed ? MaxSpeed : Speed
      Counter := InsPressed ? 0 : Counter+1      ; Reset Inertia
     
      X := Speed * ( GetKeyState( RightKey, "P" ) ? 1 : GetKeyState( LeftKey, "P" ) ? -1 : 0 )
      Y := Speed * ( GetKeyState( DownKey , "P" ) ? 1 : GetKeyState( UpKey, "P" )   ? -1 : 0 )
     
      If( X or Y ) {
        MouseMove %X%,%Y%,,R
        If( GetKeyState( "Shift" , "P" ) )
          Break
      }
      Else
       Break
    }
  }
Return

;
; This routine handles the 17 keys: mouse wheel
;
MouseWheelHandler:
   Loop {
      WUp  := GetKeyState( WheelUpKey, "P" )
      WDn  := GetKeyState( WheelDownKey, "P" ) 
      
      If( WUp ) or ( WDn ) {
         SendEvent % GetModifier() . ( WUp ? "{WheelUp}" : "{WheelDown}" )
         Sleep %WheelSleep%
      }   
      Else
         Break
   }
Return

;
; Hotkeys
; These functions are called when the hotkeys are pressed.
; For each one, if the numlock is off, we will emulate mouse functions,
; otherwise, we will echo the pressed key back to the OS.
;
MouseLeft:
   If( Not GetKeyState( "Numlock", "T" ) )
      Gosub MouseMoveHandler
   Else
      SendInput % GetModifier() . "{" . LeftKey . "}"
Return

MouseRight:
   If( Not GetKeyState( "Numlock", "T" ) )
      Gosub MouseMoveHandler
   Else
      SendInput % GetModifier() . "{" . RightKey . "}"
Return

MouseUp:
   If( Not GetKeyState( "Numlock", "T" ) )
      Gosub MouseMoveHandler
   Else
      SendInput % GetModifier() . "{" . UpKey . "}"
Return

MouseDown:
   If( Not GetKeyState( "Numlock", "T" ) )
      Gosub MouseMoveHandler
   Else
      SendInput % GetModifier() . "{" . DownKey . "}"
Return

MouseConstant:
   If( Not GetKeyState( "Numlock", "T" ) )
      Gosub MouseMoveHandler
   Else
      SendInput % GetModifier() . "{" . ConstantKey . "}"
Return

MouseWheelDown:
   If( Not GetKeyState( "Numlock", "T" ) )
      Gosub MouseWheelHandler
   Else
      SendInput % GetModifier() . "{" . WheelDownKey . "}"
Return

MouseWheelUp:
   If( Not GetKeyState( "Numlock", "T" ) )
      Gosub MouseWheelHandler
   Else
      SendInput % GetModifier() . "{" . WheelUpKey . "}"
Return




MouseClickHandler:
   If( Not GetKeyState( "Numlock", "T" ) )
      SendInput % GetModifier() . "{Click}"
   Else
      SendInput % GetModifier() . "{" . ClickKey . "}"
Return

MouseForward:
   If( Not GetKeyState( "Numlock", "T" ) )
      SendEvent {XButton2}
   Else
      SendInput % GetModifier() . "{" . ForwardKey . "}"
Return

MouseBack:
   If( Not GetKeyState( "Numlock", "T" ) )
      SendEvent {XButton1}
   Else
      SendInput % GetModifier() . "{" . BackKey . "}"
Return

MouseDoubleClick:
  If( Not GetKeyState( "Numlock", "T" ) )
    Click 2
  Else
    SendInput % GetModifier() . "{" . DoubleClickKey . "}"
Return

MouseRightClick:
  If( Not GetKeyState( "Numlock", "T" ) )
    SendInput % GetModifier() . "{RButton}"
  Else
    SendInput % GetModifier() . "{" . RightClickKey . "}"
Return

MouseDrag:
  If( Not GetKeyState( "Numlock", "T" ) ) {
    SendInput % "{LButton " . ( _Drag ? "Up}" : "Down}" )
    _Drag := Not _Drag
  }     
  Else
    SendInput % GetModifier() . "{" . DragKey . "}"
Return

CenterMouse:
  If( Not GetKeyState( "Numlock", "T" ) ) {
    WinGetPos X,Y,W,H,A
    MouseMove % X+W/2, % Y+H/2
  }
  Else
    SendInput % GetModifier() . "{" . CenterKey . "}"
Return

CornerMouse:
  If( Not GetKeyState( "Numlock", "T" ) ) {
      MouseGetPos MX, MY
      NewX := ( MY < ScreenH/2 ) ? ScreenW/4*3 : ScreenW/4
      NewY := ( MX > ScreenW/2 ) ? ScreenH/4*3 : ScreenH/4
    MouseMove %NewX%, %NewY%
  }
  Else
    SendInput % GetModifier() . "{" . CornerKey . "}"
Return


GetModifier() {
  Return GetKeyState( "Ctrl", "P" ) ? "^" : GetKeyState( "Alt", "P" ) ? "!" : GetKeyState( "Shift", "P" ) ? "+" : ""
}

Exit:
  ExitApp
Return

^ESC::ExitApp


Last edited by Icarus on Fri Dec 11, 2009 5:03 pm; edited 7 times in total
Back to top
View user's profile Send private message Visit poster's website
RobOtter



Joined: 30 Jan 2005
Posts: 133
Location: Darmstadt, Germany

PostPosted: Tue Jun 03, 2008 6:54 am    Post subject: Reply with quote

Hi Icarus, thanks for this little gem!
I tried it and it comes quite handy for me. I really like the idea of letting a mouse button held down - this could really help people having trouble pressing several keys at a time and is very comfortable as well for others.

Since there are some keys unused until now, how about adding a horizontal scroll function (maybe on Num-9 and Num-3)?
And on key Num--, a "Very Slow Move" (exactly 1 Pixel at a time) would be good, too (would help me position the cursor in my favorite graphics program).

Greetings,
Rob
Back to top
View user's profile Send private message
Icarus



Joined: 24 Nov 2005
Posts: 851

PostPosted: Tue Jun 03, 2008 7:06 am    Post subject: Reply with quote

Is there a autohotkey scroll right/left? I am assuming you mean the mouse wheel scroll, and not keyboard arrows yes?

And for the NumpadMinus, you mean that when held down, the presses on the 2468 keys will not be continuous, but will require repetitive presses to move one pixel at a time. yes again?

Thats all easy, in fact I have already made some minor changes in the script, to ignore presses (for example on the mult and div keys) when numlock is off.

Will post it later, perhaps with your changes.

EDIT:
Some of the changes I think make it much more comfortable:
5 will be click
+ will be right click
Enter will be dbl click
/ will be drag (toggle)
* unmapped

EDIT2:
Posted a new version with the above changes and the one pixel move
Back to top
View user's profile Send private message Visit poster's website
RobOtter



Joined: 30 Jan 2005
Posts: 133
Location: Darmstadt, Germany

PostPosted: Tue Jun 03, 2008 8:37 am    Post subject: Reply with quote

Icarus wrote:
Is there a autohotkey scroll right/left? I am assuming you mean the mouse wheel scroll, and not keyboard arrows yes?

You´re right, that´s what I´ve meant. Although there is no native support in AHK for horizontal scrolling, I´ve found a thread (http://www.autohotkey.com/forum/viewtopic.php?t=31152) using a SendMessage command doing that (WM_HSCROLL).
Icarus wrote:
And for the NumpadMinus, you mean that when held down, the presses on the 2468 keys will not be continuous, but will require repetitive presses to move one pixel at a time. yes again?

It may be done that way, but slowing down the mouse movement in such a way that moving one pixel is possible with a short key press would be sufficient (keeping the continuous movement like with the other modifiers).

Icarus wrote:
EDIT:
Some of the changes I think make it much more comfortable:
5 will be click
+ will be right click
Enter will be dbl click
/ will be drag (toggle)
* unmapped

EDIT2:
Posted a new version with the above changes and the one pixel move

Thanks for the changes. In the previous version, there was a bug (Num-Enter (=Right Click) worked even when Numpad was switched on) which seems to be killed now Smile
Back to top
View user's profile Send private message
Icarus



Joined: 24 Nov 2005
Posts: 851

PostPosted: Tue Jun 03, 2008 10:21 am    Post subject: Reply with quote

Yes, I found how to do it, but forgot to mention.
9 and 3 are already used - navigate forward and back (XButton1 and 2)

So, I think I will keep vertical scroll out, also since it can usually be done by the normal arrow keys.

If you insist, you can of course do it yourself, or I can make a special version just for you if you need my help.

I would like to remove the minus as a one pixel mover, and instead make it Shift (holding down the minus key is not intuitive and inconvenient)

And I want to do the minus so it will center on screen, or move to the center of the focused window, or something like that.

The star is a key I would like to keep unmapped (for completely selfish reasons - I am using it for another script of mine which activates an input field where I enter a number and it executes stuff... Smile )

EDIT:
Better idea:
Holding down the Ctrl key while moving (2468) will emulate mouse wheel in its four directions. Good no?
Back to top
View user's profile Send private message Visit poster's website
RobOtter



Joined: 30 Jan 2005
Posts: 133
Location: Darmstadt, Germany

PostPosted: Tue Jun 03, 2008 10:41 am    Post subject: Reply with quote

Icarus wrote:
9 and 3 are already used - navigate forward and back (XButton1 and 2)

Personally, I dislike this behavior since it has nothing to do with mouse movement. But feel free to do whatever you like with your script Smile

Icarus wrote:
I would like to remove the minus as a one pixel mover, and instead make it Shift (holding down the minus key is not intuitive and inconvenient)

I feel sorry for loosing the 1pm (one-pixel-mover Smile) and do not see the advantage of having a third shift key - but of course, it is all at your will.
I will keep the current source code and will create a special-for-Rob version based on your code - I believe this is what posting a script here is intended for...

Icarus wrote:
And I want to do the minus so it will center on screen, or move to the center of the focused window, or something like that.

That´s a good idea - helps moving quicker!

Icarus wrote:
EDIT:
Better idea:
Holding down the Ctrl key while moving (2468) will emulate mouse wheel in its four directions. Good no?

VERY good! It is quite intuitive and keeps 71 free for other purposes.
Back to top
View user's profile Send private message
Icarus



Joined: 24 Nov 2005
Posts: 851

PostPosted: Tue Jun 03, 2008 10:53 am    Post subject: Reply with quote

No no, you misunderstood me:

I will map the Shift key to be the one that forces 1pm, instead of the minus key. So it will free the minus key, and you will still have the 1pm functionality.
Also, I will keep the 1 and 7 as the wheel, but in order to add your functionality for vertical scroll, I will add Ctrl+4 and Ctrl+6 as vertical scroll (and for completeness, also the Ctrl+8 and Ctrl+2 will do scrolling, horizontal)

I use the XBUtton 1 and 2 a lot to navigate back and forth, in the browser or in windows explorer.

So, dont worry, you will have all your functionality in tact.
You can disable 9 and 3 if you hate them that much of course.
Back to top
View user's profile Send private message Visit poster's website
RobOtter



Joined: 30 Jan 2005
Posts: 133
Location: Darmstadt, Germany

PostPosted: Tue Jun 03, 2008 1:37 pm    Post subject: Reply with quote

Thanks to allow for my wishes - I´m looking forward to the next version!
Back to top
View user's profile Send private message
Icarus



Joined: 24 Nov 2005
Posts: 851

PostPosted: Tue Jun 03, 2008 3:48 pm    Post subject: Reply with quote

Ok, posted the new versions on post 1.

I used Alt as a mousewheel modifier (Alt+2468) instead of Ctrl, since Ctrl is usually used for zooming, and I didnt want to mess with it.

Also, I was thinking about your graphic applications, so diagonal wheeling is also made possible (Alt+2+6 will do diagonal wheel right+down)

Minus centers the mouse on the active window.
Back to top
View user's profile Send private message Visit poster's website
Icarus



Joined: 24 Nov 2005
Posts: 851

PostPosted: Wed Jun 04, 2008 5:42 am    Post subject: Reply with quote

Posted 0.13 with some fixes
Back to top
View user's profile Send private message Visit poster's website
tidbit



Joined: 09 Mar 2008
Posts: 1807
Location: Minnesota, USA

PostPosted: Wed Jun 04, 2008 9:59 pm    Post subject: Reply with quote

very nice.
I like to use it with my mouse Smile tis a good team
_________________
rawr. be very afraid
*poke*
Note: My name is all lowercase for a reason.
Even monkeys fall from trees. - Japanese proverb
Back to top
View user's profile Send private message
Icarus



Joined: 24 Nov 2005
Posts: 851

PostPosted: Mon Jun 16, 2008 8:01 am    Post subject: Reply with quote

Posted a new version (0.15) with mouse movement inertia.
Now the speed will increase gradually (configurable).

Numpad Dot was removed
Numpad 0 will now be used to enforce Constant Speed (no inertia)
Back to top
View user's profile Send private message Visit poster's website
Zip
Guest





PostPosted: Thu Dec 10, 2009 5:53 pm    Post subject: Moving the mouse Reply with quote

Has anyone had issues w/ Numpad 2,4,6,8 not working? I am looking for a good mouse moving solution, and all the ones that I have tried are not working.

Does anyone know why this would be? And is this solution suppose to work for moving the mouse?

Please advise and thanks. Zip
PS: Using 1.0.47.05 probaby need to upgrade ahk?
Back to top
Alex975
Guest





PostPosted: Fri Dec 11, 2009 12:01 pm    Post subject: Reply with quote

Numpad deactivated?
Back to top
Icarus



Joined: 24 Nov 2005
Posts: 851

PostPosted: Fri Dec 11, 2009 3:43 pm    Post subject: Reply with quote

I spent some time with Zip on a screen session.
It was the SendMode Play that caused the thing to not work on Vista.
SendMode Input fixed it.
_________________
Sector-Seven - Freeware tools built with AutoHotkey
Back to top
View user's profile Send private message Visit poster's website
Display posts from previous:   
Reply to topic    AutoHotkey Community Forum Index -> Scripts & Functions All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You can post new topics in this forum
You can reply to topics in this forum


Powered by phpBB © 2001, 2005 phpBB Group