2010/09/01

最小化されたウィンドウをタスクトレイに格納する

NILScriptでは「Main.createNotifyIcon()」でスクリプトの終了などの操作を行うためのタスクトレイアイコンを生成できますが、他にも任意の数のタスクトレイアイコンを生成できます。
これを利用し、特定の種類のウィンドウが最小化された時にそのウィンドウをタスクバーに表示されないようにして代わりにタスクトレイアイコンとして表示するというスクリプトの例を紹介します。

Main.createNotifyIcon();
var targetClasses=['Notepad','MSPaintApp'];
var {Window}=require('Window');
var prev=Window.active;
var myWindow=Window.create();
Window.observe('activate',function(o){
    if(prev.minimized && (o.window.handle!=prev.handle) && targetClasses.contains(prev.className)){
        var w=prev;
        w.hide();
        var restore=function(){
            w.show();
            w.restore();
        };
        Main.observe('exit',restore);
        myWindow.addNotifyIcon({
            icon:w.icon,
            text:w.title,
            events:{
                lbuttonUp:function(){
                    restore();
                    Main.unobserve('exit',restore);
                    this.free();
                },
            },
        });
    }
    prev=o.window;
});

「Window.observe()」でウィンドウの状態変化を監視するイベントハンドラを登録しています。
Window.observe()が利用しているシェル用のフック機能では、最小化を直接検出することは出来ないようなので、アクティブウィンドウが変った時に前にアクティブだったウィンドウの状態を調べるという方法で代用しています。
最小化ボタンによる通常の最小化ならば、この方法で問題なく検出できるようです。

Window.observe()では、イベントハンドラの第1引数に与えられるオブジェクトの「window」メンバでイベントが発生したウィンドウを参照できますが、ここでは「prev」変数に代入されている直前にアクティブだったウィンドウの方が対象となります。prevのウィンドウが最小化されていなかったり、対象クラス名に一致しない場合は、単にprev変数に今回アクティブ化されたウィンドウを代入して終ります。
なお、prev変数は最初の定義時にアクティブウィンドウを表す「Window.active」で初期化してあります。

対象ウィンドウが最小化された場合、ウィンドウの不可視化、スクリプト終了時にウィンドウを復元する処理の登録、トレイアイコンの登録の3つの処理を行います。
その前に、最初の「var w=prev」で、その時最小化されたウィンドウを表すオブジェクトを変数に代入しておく必要があります。こうしておかないと、prev変数が書き換わってしまい、どのウィンドウを対象にしていたのか分からなくなってしまうからです。
このローカル変数「w」はJavaScriptの「クロージャ」という仕組みでrestoreやlbuttonUpにセットした関数から参照されており、次に最小化時処理が行われる時には、新たなw変数が生成され、新たに生成されたrestoreやlbuttonUpの関数から参照されます。

ウィンドウの可視化と最小化からの復元を行う処理は、関数として「restore」変数に代入して、「Main.observe('exit',restore)」でスクリプト終了時にも実行されるようにイベント割り当てを行っておきます。

トレイアイコンの登録は、自前ウィンドウのオブジェクトの「addNotifyIcon()」メソッドで行います。ここでは、あらかじめWindow.create()で生成して「myWindow」変数に代入しておいた空の自前ウィンドウを使用しています。
引数となるオプションオブジェクトのiconメンバには、今回最小化されたウィンドウのアイコンである「w.icon」を指定しています。ここでは、他にもアイコンファイルや実行ファイルのパスを指定することも可能です。
トレイアイコンの操作イベントに対する動作割り当てを定義するeventsでは、左クリック時に発生するlbuttonUpイベントに対して、復元関数の呼び出しとスクリプト終了時のイベント登録の解除、トレイアイコン自身の削除の3つの処理を行う関数を割り当てています。

このトレイアイコン生成機能を利用すれば、様々なツールを手軽に実現できるでしょう。

0 件のコメント:

コメントを投稿