Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Half-QWERTY: One-handed Typing


  • Please log in to reply
175 replies to this topic
Chris
  • Administrators
  • 10727 posts
  • Last active:
  • Joined: 02 Mar 2004
Thanks for clarifying. I'm sure someone could help you do that. If you describe its importance and what you might use it for, that might help attract a volunteer.

Assistive Tech
  • Guests
  • Last active:
  • Joined: --
One of the difficulties of one handed typing is knowing what keys to press. If the user could see the layout reversed when they press the space-bar they would have an easier time hitting the right key.

Assistive Tech

jonny
  • Members
  • 2951 posts
  • Last active: Feb 24 2008 04:22 AM
  • Joined: 13 Nov 2004
I used to actually use this, and my experience was that it was ridiculously easy to remember and use after a few hours. Have you actually tried learning it without visual assistance yet?

shader
  • Members
  • 56 posts
  • Last active: Nov 16 2011 09:05 AM
  • Joined: 29 Oct 2004
Great!! The only pros I've encountered are than you cant do Alt hotkeys(to acces menus), they are activated/deactivated at the same time.

Assistive Tech
  • Guests
  • Last active:
  • Joined: --
A one hand typist can be very fast if they have enough use of the less able hand to operate the SHIFT key. If they cannot, then they get slowed down. My thought is to have these put the track ball on the floor, and have it be the SHIFT. This was modified from the remapping code.

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


  • Guests
  • Last active:
  • Joined: --
This is great stuff. I had modified my Microsoft Keyboard Layout so that all Ctrl + Alt mirrored the keyboard and the shift modifier worked but it screwed with any kind of macros when they had to paste something.

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?

Chris
  • Administrators
  • 10727 posts
  • Last active:
  • Joined: 02 Mar 2004

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.

Adding the line #InstallKeybdHook to the top of the combined script might fix this, but it's a long shot.

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 -->

  • Guests
  • Last active:
  • Joined: --
Here are the two scripts that I am using with two different EXE's.

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:

Posted Image

... 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}



Chris
  • Administrators
  • 10727 posts
  • Last active:
  • Joined: 02 Mar 2004

I used a program called keytweak to change the capslock key to a numpadenter so that my capslock won't activate ever.

The following should also work in case you evern need an alternative that can re-enable your Capslock key without rebooting:

SetCapslockState, AlwaysOff
Capslock::Send {NumpadEnter}

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.

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.

Thanks for posting your scripts, which will hopefully help others with similar goals.

RG
  • Members
  • 17 posts
  • Last active: Oct 26 2005 01:45 PM
  • Joined: 09 Feb 2005
I'm still tweaking this script: I remapped the following keys for convenience:

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

RG

RG
  • Members
  • 17 posts
  • Last active: Oct 26 2005 01:45 PM
  • Joined: 09 Feb 2005
Here's a problem. I wanted to map the ' character to Capslock. However, if I enter the following, AHK gives an error "Shift & Capslock is not a valid hotkey name..."
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.

:?: :?: :?:
RG

jonny
  • Members
  • 2951 posts
  • Last active: Feb 24 2008 04:22 AM
  • Joined: 13 Nov 2004
Hotkeys with two or more non-modifiers are not officially supported yet; you would have to add in the last non-modifier(s) using something like KeyWait or GetKeyState.

Decarlo110
  • Members
  • 303 posts
  • Last active: Feb 12 2006 02:15 AM
  • Joined: 15 Dec 2004

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.
1) The Open Source Definition http://www.opensourc...ition_plain.php

2) Intuitive. Logical. Versatile. Adaptable. <>

lcamara
  • Members
  • 6 posts
  • Last active: May 09 2007 01:13 AM
  • Joined: 20 Jul 2005
I want to use this with AutoCAD to type notes in our drawings, so I can keep my right hand on the mouse. It looks promising, but I've come across a significant roadblock:

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.
Lionel Camara
KAI Hawaii, Inc. (Structural & Forensic Engineers)
Programmer, IT Guy, & Detailer

Chris
  • Administrators
  • 10727 posts
  • Last active:
  • Joined: 02 Mar 2004
I don't know for sure if it will solve this case, but try putting the following line near the top of the script:

SetStoreCapslockMode off