Half-QWERTY: One-handed Typing
Assistive Tech
Assistive Tech
Menu, TRAY, Tip, MiddleShift Menu, Tray, NoStandard Menu, Tray, Add, &About Menu, Tray, Add Menu, Tray, Add, &Instructions Menu, Tray, Add, &Suspend Menu, Tray, Add Menu, Tray, Add, &Exit MsgBox, 4,MiddleShift, Do you want to use the Middle Mouse Button as a Shift key? IfMsgBox, No ExitApp *MButton:: ; The asterisk makes the remapping more complete on XP/2k/NT. Send, {Shift down} KeyWait, MButton ; Wait for the key to be released. Send, {Shift up} Return &About: MsgBox, ,About, MiddleShift Version 0.9 `nCreated by Joel Turmo`n`nDistrubute as Beerware Return &Instructions: MsgBox, This program was written to provide one-handed keyboarders the ability to press the shift key with their foot. `n`nIt require a mouse like the Kensington Expert mouse to have one of the buttons reprogrammed to act as a middle mouse button. Return &Suspend: Suspend Menu, Tray, ToggleCheck, &Suspend Return &Exit: ExitApp
Anyway, I don't think space bar is the way to go. I use a mouse thumb key as ctrl + alt, so I can still use shift and if I let go of it, I don't have to worry about the key entering anything. On the right hand is easier as well because you are not anchored with the left.
The problem I am having with making a script similar to this is that once I have, say the "f" key bound to mirror itself and also shift mirror it self, if I bind anything more to it (such as for making the left hand keys equal a numpad key and arrow and home keys) then the keys won't work when the modifier is held down. It will work the first time but needs a subsequent depress in order to work again, instead of working when held down the whole time.
So, I just made another ahk file and this works great but I would like to consolidate them. What I need is to be able to have at least 4 modifer buttons for the whole left side of the keyboard that will work when depressed, so that I no longer need the right side of the keyboard at all.
Any ideas?
Adding the line #InstallKeybdHook to the top of the combined script might fix this, but it's a long shot.if I bind anything more to it (such as for making the left hand keys equal a numpad key and arrow and home keys) then the keys won't work when the modifier is held down. It will work the first time but needs a subsequent depress in order to work again, instead of working when held down the whole time.
If you can't get it working, I'd probably have to see the complete combined script so that I could experiment with it a little. If you want, you can mail it to <!-- e --><a href="mailto:[email protected]">[email protected]</a><!-- e -->
The first is the qwerty version. I use my main mouse thumb button bound to Ctrl+Alt so that it works with holding shift as well and I don't have to worry about modifiers and the like.
The second script is the Numpad/Arrow Keys/Everything else. I use the second thumb button (Logitech MX510 Mouse bound to F9) to use homerow as a numpad and the top finger button (bound to F11) for arrow keys etc. I also have it so when you don't press another key with F9 and F11 (again, bound to mouse keys: F10 caused me problems for some reason but the main goal was to use a key my mouse could handle and that wouldn't lay down any typing) it sends Enter and Backspace (most important right hand keys). And you can hold down the thumb and scroll up for a series of Backspaces and scroll down for a series of Returns (nice for editing).
I just started using this program and am not very good at programming but this is working for me and may help some other people to think differently about using the keyboard. I just ordered this keyboard in black:
... and also ordered it so that the usb part comes out of the middle (or rightside of keyboard section) so I don't need the extreme right side (numpad etc.) at all. It was only around $170, much less than the "Half-Keyboard" and I can use the right side when I need it and have the right side right next to the mouse so I don't have to make a 1 foot jump from the right side of my keyboard to the mouse. Using the space-bar as the modifier is really not the way to go in my opinion and the "Half-Keyboard" is commited to this.
I used a program called keytweak to change the capslock key to a numpadenter so that my capslock won't activate ever. This is important for me because I use Dragon NaturallySpeaking and it has a bug that will constantly turn on and off the capslock key when you are editing with it. The capslock key is pretty unuseful anyways and this has saved me a lot of woe. I haven't tried using AutoHotKey to disable the caps in this way as it has allready been done in the registry for now.
Anyways, I tried so many program demos and almost wasted money on products that would not touch what this does. I have been researching this solution for a couple months (off and on) and finally, this result is working greatly. Great program and community! Glad I stumbled upon it finally.
So, here are the scripts. I am still editing them constantly as I go along to find the best placement for every key. If someone can find a solution to using one combined script to do the following that would be cool. It does technically all work together but only for the first key combination pressed. You have to repress all the keys for each key you want to modify, instead of being able to hold down the thumb button and press several keys without having to repress the thumb button each time.
If you can offer any other tips or tricks we could incorporate into this, I would appreciate it. Let's throw some more ideas around. You could also use you right mouse button as a modifier or a foot pedal.
!WheelUp::Send,{Left}
!WheelDown::Send,{Right}
^WheelUp::Send,^{Left}
^WheelDown::Send,^{Right}
+WheelUp::Send,+{Left}
+WheelDown::Send,+{Right}
^!WheelUp::Send,{BS}
^!WheelDown::Send,{Enter}
^+WheelUp::Send,^+{Left}
^+WheelDown::Send,^+{Right}
^!+WheelUp::Send,^{Home}
^!+WheelDown::Send,^{End}
^!Tab::Send,{BS}
^!Space::Send,{Enter}
^!`::Send,-
^!1::Send,0
^!2::Send,9
^!3::Send,8
^!4::Send,7
^!5::Send,6
^!q::Send,p
^!w::Send,o
^!e::Send,i
^!r::Send,u
^!t::Send,y
^!a::Send,;
^!s::Send,l
^!d::Send,k
^!f::Send,j
^!g::Send,h
^!z::Send,/l
^!x::Send,.
^!c::Send,,
^!v::Send,m
^!b::Send,n
^!+`::Send,_
^!+1::Send,)
^!+2::Send,(
^!+3::Send,*
^!+4::Send,&
^!+5::Send,^
^!+q::Send,P
^!+w::Send,O
^!+e::Send,I
^!+r::Send,U
^!+t::Send,Y
^!+a::Send,:
^!+s::Send,L
^!+d::Send,K
^!+f::Send,J
^!+g::Send,H
^!+z::Send,?
^!+x::Send,>
^!+c::Send,<
^!+v::Send,M
^!+b::Send,N
^!NumpadEnter::Send,'
^!+NumpadEnter::Send,"
F9 & WheelUp::Send,{Up}
F9 & WheelDown::Send,{Down}
F9::Send,{Enter}
F9 & Tab::Send,{Enter}
F9 & Capslock::Send,{Enter}
F9 & Ctrl::Send,{Enter}
F9 & Numpadenter::Send,{Enter}
F9 & Shift::Send,{Enter}
F9 & Alt::Send,.
F9 & Space::Send,0
F9 & w::Send,7
F9 & e::Send,8
F9 & r::Send,9
F9 & s::Send,4
F9 & d::Send,5
F9 & f::Send,6
F9 & x::Send,1
F9 & c::Send,2
F9 & v::Send,3
F9 & q::Send,_
F9 & z::Send,/
F9 & a::Send,{+}
F9 & t::Send,-
F9 & g::Send,=
F9 & b::Send,\
F11::Send,{BS}
F11 & Space::Send,{Enter}
F11 & e::Send,{Up}
F11 & d::Send,{Down}
F11 & s::Send,{Left}
F11 & f::Send,{Right}
F11 & w::Send,^{Left}
F11 & r::Send,^{Right}
F11 & a::Send,^+{Left}
F11 & g::Send,^+{Right}
F11 & z::Send,^z
F11 & x::Send,^x
F11 & c::Send,^c
F11 & v::Send,^v
F11 & t::Send,{End}
F11 & q::Send,{Home}
F11 & b::Send,+{End}
The following should also work in case you evern need an alternative that can re-enable your Capslock key without rebooting:I used a program called keytweak to change the capslock key to a numpadenter so that my capslock won't activate ever.
SetCapslockState, AlwaysOff
Capslock::Send {NumpadEnter}
I merged the two scripts and they seem to work without this symptom you described. For example, I can hold down Control+Alt and then type "qwe" and get "poi". However, I'm using the real Ctrl-Alt, not a mouse to simulate it, so maybe there is a difference somehow.You have to repress all the keys for each key you want to modify, instead of being able to hold down the thumb button and press several keys without having to repress the thumb button each time.
Thanks for posting your scripts, which will hopefully help others with similar goals.
Enter key --> Capslock Key
Backspace --> ` key (backquote)
Home --> CTRL+1
End --> CTRL+2
Delete --> CTRL+3
capslock:: send,{Return} return `:: send,{Backspace} return ^1:: send,{Home} return ^2:: send,{End} return ^3:: send,{Del} return
Things to do:
#1: I can't decide how to map keys like [ ] - = and \
If you're a programmer or if you use the command line much, these keys are a MUST. But where to put them on the lefthand side?
I suppose ALT+1, ALT+2, etc. might work...
But that means more memorization.
#2: It would be nice to figure out some other key whic was easier to hit than spacebar to flip the keyboard. I like Assistive Tech's idea of a foot switch. But it sounds too hardware-dependent. I also like the idea presented here of holding down mouse button(s) to flip the keyboard.
Overall I love this script. I've been wanting to do something like this for a long time but never got around to it. Thanks for writing a useful piece of code!
My only problem is that if my spacebar is pressed too far on the left side, it sticks and doesn't depress smoothly. I've got a Microsoft (gasp!) Natural Keyboard Pro, so go figure.
Here's the entire script for convenience, with my modifications...
; Autohotkey.com forum: http://autohotkey.com/forum/viewtopic.php?t=1326 ; Many thanks to Chris for helping me out with this script. ; Modified by RG mirror_1 = 0 mirror_2 = 9 mirror_3 = 8 mirror_4 = 7 mirror_5 = 6 mirror_q = p mirror_w = o mirror_e = i mirror_r = u mirror_t = y mirror_a = `; mirror_s = l mirror_d = k mirror_f = j mirror_g = h mirror_z = / mirror_x = . mirror_c = , mirror_v = m mirror_b = n mirror_6 = 5 mirror_7 = 4 mirror_8 = 3 mirror_9 = 2 mirror_0 = 1 mirror_y = t mirror_u = r mirror_i = e mirror_o = w mirror_p = q mirror_h = g mirror_j = f mirror_k = d mirror_l = s mirror_n = b mirror_m = v return ; This key may help, as the space-on-up may get annoying, especially if you type fast. Control & Space::Suspend `:: Send,{Backspace} return Shift & Space::send,{space} space:: Send {space} return CapsLock:: Send,{Return} return space & Capslock:: Send,{'} return space & +Capslock:: Send,{"} return ^1:: Send,{home} return ^2:: Send,{end} return ^3:: Send,{Del} return space & 1:: space & 2:: space & 3:: space & 4:: space & 5:: space & q:: space & w:: space & e:: space & r:: space & t:: space & a:: space & s:: space & d:: space & f:: space & g:: space & z:: space & x:: space & c:: space & v:: space & b:: space & `;:: space & ,:: space & .:: space & /:: space & 6:: space & 7:: space & 8:: space & 9:: space & 0:: space & y:: space & u:: space & i:: space & o:: space & p:: space & h:: space & j:: space & k:: space & l:: space & n:: space & m:: ; Determine the mirror key, if there is one: if A_ThisHotkey = space & `; MirrorKey = a else if A_ThisHotkey = space & , MirrorKey = c else if A_ThisHotkey = space & . MirrorKey = x else if A_ThisHotkey = space & / MirrorKey = z else ; To avoid runtime errors due to invalid var names, do this part last. { StringRight, ThisKey, A_ThisHotkey, 1 StringTrimRight, MirrorKey, mirror_%ThisKey%, 0 ; Retrieve "array" element. if MirrorKey = ; No mirror, script probably needs adjustment. return } Modifiers = GetKeyState, state1, LWin GetKeyState, state2, RWin state = %state1%%state2% if state <> UU ; At least one Windows key is down. Modifiers = %Modifiers%# GetKeyState, state1, Control if state1 = D Modifiers = %Modifiers%^ GetKeyState, state1, Alt if state1 = D Modifiers = %Modifiers%! GetKeyState, state1, Shift if state1 = D Modifiers = %Modifiers%+ Send %Modifiers%{%MirrorKey%} return
Space & Capslock::send,' Space & Shift & Capslock::send,"
And if I use the + modifier instead, the ' is never recognized, always " instead:
Space & Capslock::send,' Space & +Capslock::send,"the " is always sent, regardless of whether the SHIFT is depressed or not.
:?: :?: :?:
I also like the idea presented here of holding down mouse button(s) to flip the keyboard.
Solution:
; Autohotkey.com forum: http://autohotkey.com/forum/viewtopic.php?t=1326 ; Many thanks to Chris for helping me out with this script. ; Modified by RG and Dec mirror_1 = 0 mirror_2 = 9 mirror_3 = 8 mirror_4 = 7 mirror_5 = 6 mirror_q = p mirror_w = o mirror_e = i mirror_r = u mirror_t = y mirror_a = `; mirror_s = l mirror_d = k mirror_f = j mirror_g = h mirror_z = / mirror_x = . mirror_c = , mirror_v = m mirror_b = n mirror_6 = 5 mirror_7 = 4 mirror_8 = 3 mirror_9 = 2 mirror_0 = 1 mirror_y = t mirror_u = r mirror_i = e mirror_o = w mirror_p = q mirror_h = g mirror_j = f mirror_k = d mirror_l = s mirror_n = b mirror_m = v return ; This key may help, as the space-on-up may get annoying, especially if you type fast. Control & Space::Suspend `:: Send,{Backspace} return Shift & Space::send,{space} space:: Send {space} return CapsLock:: Send,{Return} return space & Capslock:: Send ' ; dont use brackets return +Capslock:: Send " ; dont use brackets return ^1:: Send,{home} return ^2:: Send,{end} return ^3:: Send,{Del} return ~LButton:: ; substitute with preferred key throughout sleep 200 ; necessary to avoid keywait overlap KeyWait, LButton, D t0.4 If ErrorLevel=0 State0=D2 else State0=D1 KeyWait, LButton State0= return 1:: 2:: 3:: 4:: 5:: q:: w:: e:: r:: t:: a:: s:: d:: f:: g:: z:: x:: c:: v:: b:: `;:: ,:: .:: /:: 6:: 7:: 8:: 9:: 0:: y:: u:: i:: o:: p:: h:: j:: k:: l:: n:: m:: if State0=D1 ; this block is for the primary configuration { ; Determine the mirror key, if there is one: if A_ThisHotkey = `; MirrorKey = a else if A_ThisHotkey = , MirrorKey = c else if A_ThisHotkey = . MirrorKey = x else if A_ThisHotkey = / MirrorKey = z else ; To avoid runtime errors due to invalid var names, do this part last. { StringTrimRight, MirrorKey, mirror_%A_ThisHotkey%, 0 ; Retrieve "array" element. if MirrorKey = ; No mirror, script probably needs adjustment. return } } ;else if State0=D2 ; this block is for the secondary configuration ; uncomment this block if assigning a configuration to a double-click-hold ; { ; [code goes here, parallel to the block above] ; } ; define the MirrorKey2 list for a second keyboard configuration else return Modifiers = GetKeyState, state1, LWin GetKeyState, state2, RWin state = %state1%%state2% if state <> UU ; At least one Windows key is down. Modifiers = %Modifiers%# GetKeyState, state1, Control if state1 = D Modifiers = %Modifiers%^ GetKeyState, state1, Alt if state1 = D Modifiers = %Modifiers%! GetKeyState, state1, Shift if state1 = D Modifiers = %Modifiers%+ Send %Modifiers%{%MirrorKey%} return
I can't decide how to map keys like [ ] - = and \
Using this modified script frees up the spacebar to modify and re-use any keys of your choice. You could also use the double-click secondary keyboard-config feature as well.
2) Intuitive. Logical. Versatile. Adaptable. <
While one of our clients requires mixed-case text, the industry standard (and our standard) is to use all capital letters. Consequently, we draft with the caps lock on.
I commented out the caps lock line, but when I'm using the space-bar to mirror the keys, I'm only getting lower-case letters. I notice that the Caps Lock light is flickering when I type the mirrored keys.
I tried doing it manually, but discovered that the hotkeys aren't case sensitive (when trying to map shift & A to something different than shift & a, I got an error saying it was already defined).
Any help on this would be appreciated.
KAI Hawaii, Inc. (Structural & Forensic Engineers)
Programmer, IT Guy, & Detailer
SetStoreCapslockMode off