主にミニキーボードやラップトップ PC では独立した Home, End, PageUp, PageDown が存在せず、Fn とカーソルキーのコンビネーションでこれらの代用にする。反面、この使用感に慣れると、キーが独立で存在し Fn キーのないキーボードではカーソルキーでこれらのキー操作ができないため不便を感じる。今回はこれを解決したい。
実行環境は NILScript (NG with JSAPI for Win32(仮称)) を使用する。基本的には JavaScript と同様で、処理系は SpiderMonkey を拡張したものである。Windows のカスタマイズに興味がおありの方は AutoHotkey をご存じかも知れない。NIL Script はこれに代る環境として開発中のスクリプトエンジンである。NIL Script の特徴は上記の配布ページに載ってあるので、せっかくなので興味を持っていただきたい。
NIL Script 処理系の実行ファイルは ng.exe と ngw.exe であり、これらでスクリプトを実行することでキーボードフックを実現できる。このふたつの実行ファイルはそれぞれ前者が「コンソールウィンドウ開いて実行」、後者が「ウィンドウを表示せずに実行」である。実用的には "ngw xxxx.ng" へのショートカットを作成して、プログラムメニューのスタートアップに置くのが良い。
以下の記述はなかったことになりました。詳しくは次の記事で。
// win2fnkey.ng [h220922.v3] // (c)2010 Zonu(tadsan) / GPLv3'ed (function(){ keys={ 'up' : 'pageup' , 'down' : 'pagedown' , 'left' : 'home' , 'right' : 'end' }; with(require('Keyboard')){ for(i in keys){ let(e=i){ (new Key(e)).observe('up',function(){ if((new Key('lwin')).state){ Keyboard.block().press(keys[e]).unblock(); } }); } } } }())
捻りのないソースコードで、本当に申し訣ないといったところである。
処理は単に、実際に押されるキーと登録したいキーをペアにした連想配列を作って、カーソルキーのそれぞれの押下に対して函数をイベントハンドラとして登録するだけである。函数の実行時に Win キーが押下状態であればキーコードが発行される。