情報科学屋さんを目指す人のメモ(FC2ブログ版)

何かのやり方や、問題の解決方法をどんどんメモするブログ。そんな大学院生の活動「キャッシュ」に誰かがヒットしてくれることを祈って。

ブログ内検索

スポンサーサイト このエントリーを含むはてなブックマーク

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサー広告 | 編集
このエントリーをはてなブックマークに追加 Clip to Evernote

片手用キーボードHalfKeyboardをAutoHotkeyでエミュレーションする このエントリーを含むはてなブックマーク

片手用キーボードHalfKeyboardのキーバインドを、キーバインドを変更するソフトウェア(AutoHotkey)を使ってエミュレーションして、通常キーバインドと入れ替えたりしながら使ってみようというエントリ。

片手用キーバインド

片手用キーボードとは、左手もしくは右手だけで扱うために設計されたキーボードのことです。キーボード自体の省スペース性や、片手が自由になるということ、また片手が不自由な人にとっての利便性などから利用されています。

代表的な片手用キーボードには「FrogPad」や「CutKey」、「HalfKeyboard」などがあります。また、「G13」や「n52teの後継 」などのゲーミングキーパッドのキーバインドを「AutoHotkey」や「MagicKeyPad」変更して実現することもあります。

今回は専用・特殊デバイスを一切使わずに、普段使っているフルキーボード(JIS)のキーバインドをAutoHotkeyで変更してHalfKeyboard化してみます。しかしもちろんこの方法は、「G13」や「n52teの後継 」などのゲーミングキーパッドを利用する場合にも役に立つので、これらの購入を検討している人もチェックしてみてください。

AutoHotkeyによるHalfKeyboard化スクリプト

実は、HalfKeyboard化AutoHotkeyスクリプトは存在します(「Half-QWERTY: One-handed Typing」)。たしかにこのスクリプトはしっかり作られているのですが、HalfKeyboardを実現するためにAutoHotkeyを占有してしまい、普段からAutoHotkeyを使っていると不便です。また、JIS配列を考慮されていなかったので改造して使用することにしました。

AutoHotkey製HalfKeyboardモジュール

まだ使い込んでいないので、いろいろ困る点もあるのですが、作成した.ahkのコードは次の通りです。 コードは、グローバル変数を準備する部分(Auto-executeセクション用)と本体に分離してあります。

HalfKeyboardモジュール(1):Auto-executeセクション用

まず、Auto-executeセクション用がこちら

KeyIsDown = 0
UpperDelay = 1000
UpperDelay *= -1

RegRead KLang, HKEY_CURRENT_USER, Keyboard Layout\Preload, 1
StringRight KLang, KLang, 4
If (!KLang)
  KLang := A_Language

If (KLang = "0407") {
  ; 0407 DE_de QWERTZ mirror set
  original := "^12345qwertasdfgyxcvb"
  mirrored := "s09876poiuzolkjh-.,mn"
} Else If (KLang = "040c" || KLang = "040C") {
  ; 040c FR_fr AZERTY mirror set         
  original := "2&e" . """" . "'(azertqsdfgwxcvb"   ; split up string for better
  mirrored := ")ac" . "_"  . "e-poiuymlkjh!:;,n"   ; human readability
} Else If (KLang = "0411") {
  ; 0411 JIS QUETRY mirror set
  original := "12345qwertasdfgzxcvb"
  mirrored := "09876poiuy;lkjh/.,mn"
} Else {
  ; 0409 US_us QWERTY mirror set
  original := "``" . "12345qwertasdfgzxcvb"   ; split up string for better
  mirrored := "'"  . "09876poiuy;lkjh/.,mn"   ; human readability
}

Loop % StrLen(original)
{
  c1 := SubStr(original, A_Index, 1)
  c2 := SubStr(mirrored, A_Index, 1)
  Hotkey Space & %c1%, DoHotkey, Off
  Hotkey Space & %c2%, DoHotkey, Off
  Hotkey %c1%, KeyDown, Off
  Hotkey %c1% UP, KeyUP, Off
  Hotkey %c2%, KeyDown, Off
  Hotkey %c2% UP, KeyUP, Off
}
  
Hotkey, Space & Control, Send_Enter, Off
Hotkey, Space & Tab, Send_Backspace, Off
Hotkey, Space, Send_Space, Off
Hotkey, +Space, Send_ShiftSpace, Off

このコードでは、グローバル変数の初期化と、キーバインドの設定を行っています。しかし、このコードだけではそのキーバインドはOFFであり、次の本体の「ToggleHalfKeyboard」関数を実行することで有効化されます。

HalfKeyboardモジュール(2):本体

本体のコードがこちらです。

Send_Enter:
	Send, {Enter}
	Return
Send_Backspace:
	Send, {Backspace}
	Return
Send_Space:
	Send, {Space}
	Return
Send_ShiftSpace:
	Send, +{Space}
	Return

DoHotkey:
	StartTime := A_TickCount
	StringRight ThisKey, A_ThisHotkey, 1
	i1 := InStr(original, ThisKey)
	i2 := InStr(mirrored, ThisKey)
	If (i1+i2 = 0) {
		MirrorKey := ThisKey
	} Else If (i1 > 0) {
		MirrorKey := SubStr(mirrored, i1, 1)
	} Else {
		MirrorKey := SubStr(original, i2, 1)
	}

	Modifiers := ""
	If (GetKeyState("LWin") || GetKeyState("RWin")) {
		Modifiers .= "#"
	}
	If (GetKeyState("Control")) {
		Modifiers .= "^"
	}
	If (GetKeyState("Alt")) {
		Modifiers .= "!"
	}
	If (GetKeyState("Shift") + GetKeyState("CapsLock", "T") = 1) {
		Modifiers .= "+"
	}

	If (KeyIsDown < 1 or ThisKey <> LastKey)
	{
		KeyIsDown := True
		LastKey := ThisKey
		Send %Modifiers%{%MirrorKey%}
		SetKeyDelay, 65535
		SetTimer, ReplaceWithUpperMirror, %UpperDelay%
	}
	Return

KeyDown:
   Key:=A_ThisHotkey
        If (KeyIsDown < 1 or Key <> LastKey)
           {
                KeyIsDown := True
                LastKey := Key
                Send %Key%
                SetKeyDelay, 65535
                SetTimer, ReplaceWithUpper, %UpperDelay%
           }
        Return

KeyUp:
   Key:=A_ThisHotkey
        SetTimer, ReplaceWithUpper, Off
        SetTimer, ReplaceWithUpperMirror, Off
        KeyIsDown := False
        Return

ReplaceWithUpper:
	SetKeyDelay, -1
	Send {Backspace}+%LastKey%
	Return

ReplaceWithUpperMirror:
	SetKeyDelay, -1
	Send {Backspace}+%MirrorKey%
	Return

ToggleHalfKeyboard()
{
	global original, mirrored
	Loop % StrLen(original)
	{
		c1 := SubStr(original, A_Index, 1)
		c2 := SubStr(mirrored, A_Index, 1)
		Hotkey Space & %c1%, Toggle
		Hotkey Space & %c2%, Toggle
		Hotkey %c1%, Toggle
		Hotkey %c1% UP, Toggle
		Hotkey %c2%, Toggle
		Hotkey %c2% UP, Toggle
	}
	Hotkey Space & Control, Toggle
	Hotkey Space, Toggle
	Hotkey Space & Tab, Toggle
	Hotkey +Space, Toggle
	Return
}

vk1Dsc07B & Esc::ToggleHalfKeyboard()

最後のキーバインド「vk1Dsc07B & Esc(無変換+Esc)」によって「ToggleHalfKeyboard()」が実行されて有効・無効が切り替わります。

このスクリプトの使い方

「Auto-executeセクション用」は、文字通りAuto-executeセクションに設置してください。つまり、最初のReturnやホットキーラベルより前に設置してください。はじめのほうに「#include」を利用して複数の.ahkをまとめている場合を考えて分離してあります

「本体」は、「Auto-execteセクション用」以降のどこでも問題ありませんが、他のスクリプトを邪魔したり、他のスクリプトから邪魔されない位置に設置します。以上でコードの設置は完了です。.ahkを実行して起動してください。

このHalfKeyboardキーバインドの説明

HalfKeyboardを有効化するには、「無変換+Esc」を押します。もう一度押すと無効になります。この有効化・無効化キーは、「本体」の一番下の行を修正することで変更できます。

有効化している状態で、スペースキーを押しながら左側のキーを押すと、右側のキーが押されます。たとえば「fキー」を押下すると、「jキー」が押下されます。この対応付けは、「Auto-executeセクション用」の「original」変数と「mirror」変数で設定されています。

このように、スペースキーが修飾キーとして利用されるので、スペースキーだけを押すときは、「キーUp」が必要です。つまり、「Down」だけでは効果が出ません。たいしたことないと思うかもしれませんが、意外と使ってみると困ってしまいます。気を付けてください。この事情に対応するため、「無効」の状態ではスペースキーを修飾キーとするキーバインドをすべて無効にしてあります。

不十分な点

まず、右端の記号類を入力する方法をまだ用意していません。特に伸ばし棒が入力できないのでどうにかしないと。また、切り替え可能にしたのは良いものの、既存キーバインドとの組み合わせについて検証していないので、気が向いたときにチェックせねば。

おすすめキーボード Realforce
プログラマ御用達キーボード PFU Happly Hacking Keyboard

AutoHotkey | コメント:0 | トラックバック:0 | 編集
このエントリーをはてなブックマークに追加 Clip to Evernote

この記事のコメント

コメントの投稿 エントリの新旧に関わらず、極力18時間中に返信します。














この記事のトラックバック

トラックバックURL:
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。