Let's note CF-AX3のShiftキーだけが壊れたのでCapslockを割り当てる変則技で乗り切るついでにレジストリエディタの仕様を理解

Posted by 雅楽斎 on Wednesday, September 11, 2019

TOC

Shiftキーが使えないつらさ

キーボードの故障は何回か経験があるんですが、メーカー製ノートPCを普通に使っていて徐々に壊れていくのは初めての経験でした。

メカニカルキーボードを買ってみたもののhキーが入力できずhttpが打てないみたいなこともありましたが、今回はShiftキーです(左右とも)

なにせ記号類の入力と大文字のアルファベット、日本語入力時に半角スペースを入力できない苦しみがありますが、レジストリを弄って他のキーをShiftに割り当てることで何とかすることにしました。

ついでにレジストリの登録ファイルの仕様を調べてみたら色々できそうなことに気が付いたのでそれについても触れます。

今回の故障には段階があった

Shiftキーが壊れるという情報は検索した限りでは出てこなかったので、恐らくレアケースなんだろうなぁと思いましたが、壊れ方が特徴的だったので症状をおさらいします。

中途半端に故障:Shiftキーを押すと制御コードを文字化した4文字くらいが入力されるようになる(気まぐれで普通に使えることもある)

ある日突然、エディタに文字をいつも通りに入力していくと、Shiftキーを押したタイミングで「^3ao」みたいな文字列が入力されるようになりました。

最初は何が起こっていたのが把握できていませんでしたが、徐々にShiftキーが壊れていることと、Shiftキーを押した時にこの謎文字が入力されていることに気付きました。1

これが発生する条件がわからず、たまに元通り入力できることもあるなどなんとも言えない状態でしたがこれはまだ最終章ではなかったのです。

故障:Shiftキーを押しても押していない状態でのキー入力しかされない

前の症状がさらに進行して、押しても完全に何も起こらなくなりました。単なる故障です。

未来:恐らく全キーが段々と使えなくなっていく

何故か今回はShiftキーが使えなくなりましたが、ジュースやコーヒーをこぼしたわけでもなく左右のShiftキーで症状が同じだったことから、キーボードから本体へ接続されていた配線の中で一番脆弱な結線がShiftキーだったのではないかと思います。

経年劣化で使えなくなっていくことを考えると、次はどのキーなんだろうかという不安がよぎります。最終的には使いたくなったら外付けキーボード使うことになるのかな。

スクリーンキーボードで凌ぐ

Windowsにはスクリーンキーボードというものがあって、ポインティングデバイスで画面上のキーボードをクリックすることでキー入力できるアプリがあります。

スタートメニュー→W→Windows簡単操作→スクリーンキーボード

起動した状態はこんな感じで、最前面に表示されます。

なので、これを画面の右端とかに追いやってShiftの上にマウスカーソルを置いて、Shiftキーが必要な場合はマウスクリックしてからキーを押すという大変難儀な作業にて凌いでいく訳です。

Windows10のレジストリを変更して他のキーをShiftに割り当てる

キーボードにあるCapsLockキーはたまにCtrlと入れ替える人がいる程度にはメジャーなキースワップ対象にされるキーです。

このキースワップの目的はCtrlキーを押す場合に左下/右下のCtrlだとホームポジションから離れてるから小指がつらいという人が入れ替えます2が、今回は同じ要領でこのキーをShiftに割り当てる回です。手段としてはレジストリ書き換えで対応します。

レジストリを登録する

Keyboard and mouse class drivers - Windows drivers | Microsoft Docs

Scan code mapper for keyboards の章にレジストリをどうやって書けば良いかというのが記載されています。

レジストリキーは「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout」実際にレジストリエディタで見てみると

すぐ下に「Keyboard Layouts」がありますが、これではありません。

ここに「Scancode Map」という値を追加します。その値の内容は以下の通り。

オフセットサイズ今回の設定値内容
0~3オクテット4オクテット0x00000000バージョン番号。0固定
4~7オクテット4オクテット0x00000000フラグ。0固定
8~11オクテット4オクテット0x00000002Scancode Mapに定義するmapの数。但し終端のnullを含めるので設定map数+1になる。今回はmapを1つだけ定義するので2。
(map数-1)×4+12~(map数-1)×4+15(4×map数)オクテット0x003A002A実キー、置換後キーの順に書く。CapsLock(0x003A)→左Shift(0x002A)
(map数)×4+12~(map数)×4+154オクテット0x00000000終端。0固定

これを並べたものを作りますが、リトルエンディアンで記述する必要があるので3、返還前のバイナリと返還後のバイナリは以下のようになります。

変換前:

0000 0000 0000 0000 0000 0000 0000 0002 003A 002A 0000 0000

変換後:

0000 0000 0000 0000 0000 0000 0200 0000 2A00 3A00 0000 0000

regファイルの仕様

で、レジストリエディタでやるのもいいんですけどそうすると環境作り直す度にレジストリエディタ開くのでそれもどうかと思い、regファイルを作成します。これを実行するだけで所望のレジストリを登録することができるようになります。

また、regファイルではレジストリの削除もできるので、この設定したものを削除するREGファイルも同時に作ります。4

Registry File (Compact 2013) | Microsoft Docs

コメント文

Use the semicolon (;) to start a line of comments.

レジストリの登録

[Key1] “ValueName”=“Value Type”

レジストリの登録:デフォルト値(規定)

[KEY1] @ = “default value name”

レジストリの削除(キー)

[-KEY1]

レジストリの削除(value)

“ValueName1”=-

出来上がったregファイル

regファイルは2ファイル、登録と削除です。削除は設定済みのvalue自体を削除するファイルになりました。

CapsLockを左Shiftに置換するレジストリを登録するregファイル

capslocktolshift.reg

Windows Registry Editor Version 5.00

;CapsLock -> Left Shift
;0000 0000 0000 0000
;0000 0000 0000 0002
;003A 002A 0000 0000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,00,00,00,00,02,00,00,00,2A,00,3A,00,00,00,00,00

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard LayoutのScancode Mapを削除するregファイル

removescancodemap.reg

Windows Registry Editor Version 5.00

;Remove HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout Scancode Map
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=-

ダブルクリックで警告ダイアログが出た後に反映して再起動で完了です。


  1. ちなみにキーリピート間隔が早いのかすごいスピードでどんどん入力されていく [return]
  2. emacsを使う人が大半のような気がします [return]
  3. 32bitのリトルエンディアンで書き直すけど64bit版のWindowsなのに32bitずつのエンディアン変換で問題ない理由が結構謎 [return]
  4. 削除する場合はキーまたはvalueごとの削除になるので、他でも使うキー/valueの場合はやらない方が良いと思います。 [return]

comments powered by Disqus