miau's blog?

Fn キーの入れ替えは可能か?

前項で Thinkpad のキー配列が気に食わないことは書いたけど、一番気に食わないのは

・左下に Fn キーがある
・Esc キーが遠い

こと。Esc についてはキーの入れ替えをやればいいんだけど、問題は Fn の入れ替えについて。これは PC 側にその機能がついていないと行うことができない。その理由として「Fn キーは単独で押したときには何も信号を送らず、特定のキーとの組み合わせでのみ信号を送る。これはハード的に制御されているのでソフトウェア側で変更はできない。」というのがよく信じられてると思うけど、調べてみるとちょっとだけ違ってた。
結論としては結局「Ctrl との入れ替えはソフト側では行えない」になっちゃいそうだけど、他の使い方なら胡散臭く実現できるかも?




■おことわり

この検証は Thinkpad X61 Tablet でやってるので、別の PC だとまたいろいろ違うのかも。あとツールについては Windows 前提です。

■本当に信号が送られていないか調べてみる

Windows 上でキーイベントを伝えるときに使われるのが「仮想キーコード」と言われるコードなんだけど。実際にハードウェアから送られる「スキャンコード」というものが別にあって。これを調べようと思う。

スキャンコードの詳細についてはこの辺りが詳しい。(詳しすぎかも)

(AT)keyboard - OS-Wiki

Key Support, Keyboard Scan Codes, and Windows(MS 公式文書)

スキャンコードを調べられるツールとして キーボード日記 というのがあって、これは仮想キーコードとスキャンコードの両方が調べられるから便利・・・だと思ったけど、キーによってはキーの押下をうまく検出できてないみたい(Thinkpad でカーソルキーの左右についてる戻る/進むキーなんかがそう)ので、Change Key とかのほうがいいかも。

で、調べてみると確かに Fn キーを単独で押した場合はキーイベントが発生していないっぽいことがわかる。でもいくつかキーを押してみるとこの情報が怪しい気がしてくる。
たとえば Fn+なにかのキーを押した場合に、スキャンコードが E0 00 と表示されるキーが複数あるし、十字キー(X61T だと画面傍に配置されてる)がキーボードのカーソルキーを押したときと同じスキャンコードになってる。もしハードウェアから同じスキャンコードが送られるんだとしたら、キーの区別がつかないことになるから、これはおかしい。何かが情報を書き換えてる気がする。

■どうやって生の情報を取得する?

ハードウェアから送られるスキャンコードを知りたいけど、Windows や Linux での方法はよくわからないので、hiariboteOS にがんばってもらうことにした。
hariboteOS っていうのは、30日でできる! OS自作入門 で作成する OS で、仕組みを全部理解しているので余計な処理が入っていないことが保証できる。

本当に30日でOSが出来上がるのかを試してみるページ を見るとわかるように最終的にはいろんな機能が使えるようになるんだけど、ここで使うのは 7 日目でキーボードの情報が取得できるようになった頃の harib04e をちょっと改造したもの。

haribote_scancode

こんな感じでスキャンコードを画面上に順次表示するだけ。スキャンコードの後ろに KeyDown 時は + を、KeyUp 時は - を付加してる。(面倒だから Pause キーには対応してない。つまり E1 が 61- とか表示されるけど、たぶん気にする人はあまりいないでしょ。)

一応この OS イメージ+いじった .c ファイルも置いときます。サイズ小さいから CD-R じゃなくて CD-RW とかに焼いたほうが。

haribote_scancode.zip

■Windows で取得できないスキャンコード

Windows 上で区別できなかったキーについても hariboteOS 上では取得できたりした。
せっかくなので MS の表に載ってないコードについては一覧にしておく。

○独立キー

ボリューム・ボタン 音量DownE0 2E
ボリューム・ボタン 音量UpE0 30
ブラウザ・キー 戻るE0 6A
ブラウザ・キー 進むE0 69


○Fn との組み合わせ

Fn+RightE0 19
Fn+LeftE0 10
Fn+UpE0 24
Fn+DownE0 22


○タブレット・ボタン

Left71
Right6F
Up6D
Down6E
Enter69
Esc6B
タブレット・ショートカット・メニュー68
画面ローテーション6C
Ctrl+Alt+Del67


上下左右はタブレットを縦方向に使って、右手側にタブレット・ボタンが来るような持ち方をした場合の方向なので注意。

○割り当てなし(ハード的に動作してそう)

・ThinkVantage ボタン
・ボリュームボタン ミュート
・Fn+F1 -
・Fn+F2 Thinkpad のロック
・Fn+F3 電源設定の選択
・Fn+F4 スリープ(スタンバイ)状態にする
・Fn+F5 ワイヤレス接続の管理
・Fn+F6 -
・Fn+F7 画面の設定
・Fn+F8 入力デバイスの管理
・Fn+F9 外部デバイスの管理
・Fn+F11 -
・Fn+F12 休止状態にする
・Fn+Home/Fn+End 明るさ調整
・Fn+PageUp キーボードライト(X61T にはないけど)
・Fn+Space 全画面拡大機能

Fn+F7、Fn+Home、Fn+End については HariboteOS 上でも実際に動作しているのを確認できた。

○その他 MS のコード表に記載されていない点

・SysRq(Fn+PrtSc)
 Alt+PrtSc と同じように動作(54/D4)すればよさそうなもんだけど、54/B8 という動作だった。
・NmLk(Fn+ScLk)
 NumLock が on になるときだけ発生する(off になるときは発生せず)
・Break(Fn+Pause)
 E0 46 9D とか。

■上記以外の Fn の挙動は?

予想に反して、単独で押した場合もスキャンコード E0 63 が送られていた。ただし挙動はちょっと不思議で、

・KeyDown 時には反応せず KeyUp 時に E0 63 と E0 E3 が連続で発生する
・1 秒以上押せば KeyUp しなくても E0 63 が送られる

というもの。Fn キーとの組み合わせが定義されていないキー(A とか)との組み合わせだと、

・Fn+A
 (1) Fn の KeyDown 時は反応なし
 (2) A の KeyDown で E0 63
 (3) A の KeyUp 時は反応なし
 (4) Fn の KeyUp で E0 E3

こんな感じで、Fn と一緒に押すキーを区別することはできない。つまり Ctrl キーと同じような使い方はできない=Ctrl との入れ替えは不可能、ということになる。
結局 E0 63/E0 E3 は「Fn との組み合わせが不正」であることを通知するために使われているような雰囲気?

でも逆に A を先に押下したような場合は、

・A+Fn
 (1) A の KeyDown で 1E
 (2) Fn の KeyDown で E0 63
 (3) Fn の KeyUp で E0 E3
 (4) A の KeyUp で 9E

こんな感じの動作をする。つまり最後に押すキーとして使う場合には他のキーと同じ挙動をするということ。
であればこのスキャンコードに Esc を割り当ててしまえば、Fn 単独押下時に Esc として機能させることも可能なのでは?一番困っているのは Esc が遠いことだけど、Ctrl キーが左下に無いのは困っているというより、このスペースを有効活用できていないことが気分悪いわけで。この割り当てができれば一石二鳥なのでは。

■スキャンコードの入れ替え(失敗)

Scan Code Mapper for Windows

に書いてある通りで、レジストリの

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout

をいじれば OK。一から設定するのが面倒なら、上述の ChgKey とかを使って近い値を設定しておくといいかも。

で、設定して再起動したんだけど・・・なぜか Fn が Esc とみなされていない。ブラウザ・キーについてもただのカーソルキーとして動作するよう設定しなおしてみたけど、利いてないみたい。
この Keyboard Layout の方法は一番低レベルなところで動いていると思ってたけど、もっと下のレベルを当たってみるしかなさそう。

・・・といったところで次回に続く。調査にしばらくかかりそうだけど。

■情報源

Keyboard Layout を使った配列変更ソフトやスキャンコードについては、

無料で作るマルチメディアキーボード

に結構載ってた。「リンクとダウンロード」ページから色々辿れる。


(2008-12-05 追記)

Referer から面白いことやってる人発見。

ノートPCのFnとCtrlを入れ替える代替案:成功の巻: 最近のヒット!

・他の PC でも Fn と Ctrl の組み合わせはこのように動作するのか
・Thinkpad だと Fn+F4 がスリープだけどどうなるのか

あたりを確かめる必要はありますが、解決策に一案としてよさげです。
posted at 20:54:36 on 2007-09-24 by miau - Category: Hardwares No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

tky_snake wrote:

とても興味深いです。
自分もfnキーがじゃまで
どうにかCtrlキーと置きかえれないかと思い
検索してたところここにたどり着きました。

この後の進展楽しみにしてます。
2008-01-24 00:06:27

miau wrote:

ありがとうございます。まだ調査中なんですけど、やっぱり Ctrl <-> Fn の入れ替えってのはソフト的には難しそうなんですよね・・・。配線を変えるなり、ハード的にいじってしまえばなんとかなるかもしれません。
ひとまず Fn に Esc を割り当てるのを目標にがんばってみます。それだけでも結構かかっちゃいそうですので、気長にお待ちくださいませ。
2008-01-29 01:41:44

hirokuri wrote:

私もFnキーが一番左下のキーボードを使っています。Ctrlキーを左下に持ってこれないか検索してたらここにたどり着きましたー。

進展あるといいですねー。がんっばってください。
2008-06-15 02:17:44

miau wrote:

ありがとうございます。

最近は「Ctrl を押さず操作できるようにすればいいんじゃね?」とかなんとか変な方向に暴走してます(http://miau.s9.xrea.com/blo... )けど、あきらめたわけではないので。いずれやろうと思います。
2008-06-17 01:10:51

Sumi wrote:

もうやってないですよね・・・
自分はThinkpadの位置に慣れてしまって
左下Ctrlまで小指を伸ばすのに難儀していてここにたどり着きました。
慣れってことで
2011-02-09 19:01:52

Sumi wrote:

もうやってないですよね・・・
自分はThinkpadの位置に慣れてしまって
左下Ctrlまで小指を伸ばすのに難儀していてここにたどり着きました。
慣れってことで
2011-02-09 19:03:11

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。