CapsLockを無理やりCtrl

前回までに自作キーボードについて書いてきたけど、出張時や打ち合わせで会議室に入ったときなど自作キーボードを持ち歩けない場面は多々ある。自作キーボードで普段が快適になったからこそ、ギャップが気になりだした。

 

ネットを調べると、レジストリを変更する/ソフトを使って同等のことをするか、特殊なドライバーを入れて、CapsLockとCtrlを入れ替えろと書いてある。もちろんずっと私もそうしてきた。けど、会社が仮想デスクトップになって管理者権限がない。調べるとユーザー権限で編集できるレジストリ部分でも変更できるという情報もあるけど、私の環境ではうまくいかなかった。

 

「CapsLock」「無変換」「変換」の3つのキーをいかに使いこなすか。日本語入力ON/OFFを無変換キーに割り当て、普段は変換キーを使ってないが、、、これまでずっとCapsLockをCtrlとして使ってきたので、今さら変換キーにすることなんてできない。AutoHotKeyの設定を色々やってCapsLockを無理やりCtrlっぽく使えるようになったので情報共有しておきます。

 

 

CapsLockやNumLockやScrLockといったロック系のキーは、キーを押されたときにDown情報はあがるが、キーを話してもUp情報がでない。OSというよりもドライバーレベルでの動作っぽい。VMWareの仮想環境においてもそこは同じ。かつ仮想環境はAutoHotKeyをつかってDownやUpでのキーフック設定ができない。タイマー機能も使えない。どこにも書いてないけど、設定ファイルに書くとエラーがでる。エラーも単に指摘するだけで、仮想環境だから無理とはメッセージを出してくれないのだが。。

 

なので、基本的な考え方としては、

CapsLockが押されたら別の仮想キー(F20とか)をDownして(操作であればDownやUPも記述できる)、

そのあとにcとか押されたら、Ctrl+cなどを投げたあとに仮想キーをUpする。

 

しかしこれだとCtrl+Dで削除の連打とかが使えない。だからCapsLockキーを押されてからミリ秒の範囲なら連続動作も可能とする。最初これを500m秒で設定したが、長すぎる。結局、350m秒に落ち着いた。このように時間計測を組み込むと最初に想定していた仮想キーは必要なくなる。

 

これでも、まだDelとBSの動作はしっくりこない。なのでこの二つだけは特別に長くした。

 

これ以上は直接設定ファイルを見てください。こちら。 主要部分は以下に載せておきます。


#UseHook	;そのキー自身をSendしても無限ループにならないように
#MenuMaskKey vk07  ; vk07 は未アサインだから。blindをCtrlキーでやらないように ←これがないとエクセルなどで誤操作

#Persistent				;大域変数の初期値設定
	IdleTime := 350  ;Ctrlの保持時間 ★★★動作に不具合あるときはこの値を変更のこと
	MyTime := 0      ;
return

;-----------------------------------------------------CapsLockの捕捉
vkF0::
	MyTime := A_TickCount	;今の時刻(OS起動後の経過時間・ミリ秒)
	return
;-----------------------------------------------------ctrlとの組み合わせ
c::
	if (A_TickCount - MyTime) > IdleTime
	{
		sendraw, c
	}else{
		Send, ^c
		MyTime := A_TickCount
	}
	return

v::
	if (A_TickCount - MyTime) > IdleTime
	{
		sendraw, v
	}else{
		Send, ^v
		MyTime := A_TickCount
	}
	return

x::
	if (A_TickCount - MyTime) > IdleTime
	{
		sendraw, x
	}else{
		Send, ^x
		MyTime := A_TickCount
	}
	return

;-----------------------------------------------------Emacsバインド
;◆◆特別対応
d::
	if ((A_TickCount - MyTime) > (IdleTime + 200 ))
	{
		sendraw, d
	}else{
		Send, {Del}
		MyTime := A_TickCount
	}
	return

;◆◆特別対応
h::
	if ((A_TickCount - MyTime) > (IdleTime + 200 ))
	{
		sendraw, h
	}else{
		Send, {BS}
		MyTime := A_TickCount
	}
	return


a::
	if (A_TickCount - MyTime) > IdleTime
	{
		sendraw, a
	}else{
		Send, {Home}
		MyTime := A_TickCount
	}
	return


e::
	if (A_TickCount - MyTime) > IdleTime
	{
		sendraw, e
	}else{
		Send, {End}
		MyTime := A_TickCount
	}
	return

;-----------------------------------------------------Rubyの松本氏推奨
; [;]をEnteにする
$`;::
$vkBB::
	send,{Enter}
return


;Altと組み合わせたらセミコロン
!`;::
!vkBB::
	send,{;}
return

;もしくはコロンの連打で;になるように
~`:::
~vkBA::
	If (A_PriorHotKey == A_ThisHotKey and A_TimeSincePriorHotkey < 200)
	{
	SendInput, {BackSpace 2}
	Send,{`;}
	}
	Return





コメント
私も自作キーボードにはまっていてキーボードの配列をどうにか変えれないかと思っていましたが、この方法を知ることができてよかったです!大変面白かったです。
  • Kaito_K
  • 2020/04/24 8:59 AM

コメントする








   

categories

links

recent comment

profile

search this site.

others

mobile

qrcode

powered

みんなのブログポータル JUGEM