読者です 読者をやめる 読者になる 読者になる

Tetsu=TaLowの雑記(はてブロ版)

しがない大学教員が琵琶湖のほとりから呟きます

Windowsノート機で左CtrlとCaps Lockを入れ替えようとしたらハマった件(犯人はSynaptics)

というわけで新年早々、マシンの引っ越しをしていたのですが、久々にハマったのでメモしておきます。

私のような古い人間はAキーの左側にCtrlキーがないと何かと不便なので、新マシンを導入したらまずやることの一つがCaps Lockキーと左Ctrlキーの入れ替えです。世の中にはBIOS設定でこのキー入れ替えが出来る機種もあるらしいのですが(VAIOの一部?)、残念ながら私のはそうではないのでソフト的に解決しています。幸い、WindowsはNT系になってから、キーの入れ替えはレジストリエントリを1つ作るだけでできるようになりました。左CtrlとCaps Lockの入れ替えは

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,1d,00,3a,00,3a,00,1d,00,00,00,00,00

でできます(要再起動。.regファイルはここに置いておきましたのでご入用の方は自己責任でどうぞ)。このエントリの意味はgoogle:Scancode Map Ctrl Capsとでもすれば見つかります。このレジストリ変更を補助してくれるツールもいろいろあって、私がよく使っていたのは窓の杜で紹介されていたChange Keyというツールです。
Change Key - 窓の杜ライブラリ
さて本題ですが、いつものように新しいマシン(LIFEBOOK WS1/M)でこのレジストリ設定をしてキーを入れ替えて使い始めたら「Ctrlを押しながら左クリックができない」ことに気づきました。なんだろなと思って調べたら左Ctrl(物理的にはCaps Lock)を押していると、マウスカーソルが動かずマウス関係のイベントが全く発生しなくなるのです。それではと、キーボードクラスドライバの上でフィルタドライバとしてCapsをCtrlに置き替えるツールであるSysinternalsのCtrl2capを試したのですが症状は全く同じ。右Ctrlだと問題ないので、どうやら「ハードウェアキーとしてのCaps Lockが押されているとマウスイベントが発生しなくなる」ということが判明。
なんだこれとfacebookで騒いでいたら後輩がすぐに『なんとなく「キー操作中はタッチパッドを無効にする」みたいな機能がどこかにあってそれが影響してそうな?』とヒントをくれたのでそれを頼りに探したら、原因がわかりました。犯人はSynaptics製タッチパッドのデバイスドライバでした。
Synapticsの最近のタッチパッドには、キータイプ中に誤ってタッチパッドに触ってしまいカーソルが動いたり、果てはタップになってしまったりしないように、SmartSenseという機能がついてます。キーのイベントが発生すると一定期間タッチパッドからのイベントを無視するようにデバイスドライバが作られているようです。しかしこれを素直に実装するとShiftやCtrlなどの一部キーを押しながらのマウス操作(タッチパッド操作)が出来なくなってしまうので、これらのキーに関するイベントを例外処理することが必要になります。どうやらその例外処理がデバドラ内にハードコードされており、それがScancode Mapによるスキャンコード入れ替えより前に行われてしまうので、こんな症状が起きるのだろうと推測しています。確かにレジストリをつらつら見てたらi8042prtドライバの直後に噛んでるフィルタドライバSynTPってのがあるようで、この辺が犯人だろうと予想してます。
で、とりあえずの回避策ですが「SmartSenseをオフにしてしまう」ことで解決することが分かりました。コントロールパネルのマウスのプロパティからSynapticsのデバイス設定を起動。
f:id:tetsutalow:20140106175027p:plain
SmartSenseの設定を開いて…
f:id:tetsutalow:20140106170957p:plain
これをオフにしてしまいます。
f:id:tetsutalow:20140106171019p:plain
これで無事、Caps LockあらためCtrlを押しながらのマウス操作(タッチパッド操作)も出来るようになりました。
ただこのままだと当然、キーボード操作中にタッチパッドに触れてしまうことによる事故は防げないわけで、できればSynapticsになんとか対応して欲しいのですけれど、Scancode Mapを見てくれとお願いするのは可能でしょうか…

(1.9 SynopticsじゃなくてSynapticsと指摘されたので直しました。Synopitcsは別の会社でしたチョットナツカシイ(-.-; シナプスのSynapticsですねそりゃそうだ)