AutoHotkey Community

It is currently May 26th, 2012, 7:42 am

All times are UTC [ DST ]




Post new topic Reply to topic  [ 21 posts ]  Go to page 1, 2  Next
Author Message
PostPosted: June 2nd, 2008, 5:56 pm 
Offline

Joined: November 24th, 2005, 8:16 am
Posts: 851
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 December 11th, 2009, 6:03 pm, edited 7 times in total.

Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: June 3rd, 2008, 7:54 am 
Offline

Joined: January 30th, 2005, 11:18 pm
Posts: 133
Location: Darmstadt, Germany
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


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: June 3rd, 2008, 8:06 am 
Offline

Joined: November 24th, 2005, 8:16 am
Posts: 851
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


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: June 3rd, 2008, 9:37 am 
Offline

Joined: January 30th, 2005, 11:18 pm
Posts: 133
Location: Darmstadt, Germany
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 :-)


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: June 3rd, 2008, 11:21 am 
Offline

Joined: November 24th, 2005, 8:16 am
Posts: 851
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... :) )

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


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: June 3rd, 2008, 11:41 am 
Offline

Joined: January 30th, 2005, 11:18 pm
Posts: 133
Location: Darmstadt, Germany
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 :)

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 :)) 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.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: June 3rd, 2008, 11:53 am 
Offline

Joined: November 24th, 2005, 8:16 am
Posts: 851
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.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: June 3rd, 2008, 2:37 pm 
Offline

Joined: January 30th, 2005, 11:18 pm
Posts: 133
Location: Darmstadt, Germany
Thanks to allow for my wishes - I´m looking forward to the next version!


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: June 3rd, 2008, 4:48 pm 
Offline

Joined: November 24th, 2005, 8:16 am
Posts: 851
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.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: June 4th, 2008, 6:42 am 
Offline

Joined: November 24th, 2005, 8:16 am
Posts: 851
Posted 0.13 with some fixes


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: June 4th, 2008, 10:59 pm 
Offline

Joined: March 10th, 2008, 12:55 am
Posts: 1907
Location: Minnesota, USA
very nice.
I like to use it with my mouse :) tis a good team

_________________
rawr. be very afraid
*poke*
Note: My name is all lowercase for a reason.
"I think Bigfoot is blurry, that's the problem. It's not the photographer's fault, Bigfoot is blurry. So there's a large, out-of-focus monster roaming the countryside."


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: June 16th, 2008, 9:01 am 
Offline

Joined: November 24th, 2005, 8:16 am
Posts: 851
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)


Report this post
Top
 Profile  
Reply with quote  
 Post subject: Moving the mouse
PostPosted: December 10th, 2009, 6:53 pm 
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?


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: December 11th, 2009, 1:01 pm 
Numpad deactivated?


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: December 11th, 2009, 4:43 pm 
Offline

Joined: November 24th, 2005, 8:16 am
Posts: 851
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


Report this post
Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 21 posts ]  Go to page 1, 2  Next

All times are UTC [ DST ]


Who is online

Users browsing this forum: No registered users and 7 guests


You can post new topics in this forum
You can reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Powered by phpBB® Forum Software © phpBB Group