2010/09/27

ウィンドウを画面の横半分などにリサイズ・移動

NILScriptのWindowユニットで提供されるクラス群では、スクリプトで生成した自前ウィンドウも他のプロセスが所有するウィンドウも、共通のメソッド・プロパティで操作可能です。
移動やリサイズなどの一般的な操作から、表示スタイルの変更などの手動ではできない操作まで、様々な操作を行なえます。
ウィンドウを移動したりリサイズするには、「moveTo()」メソッドを使用します。移動せずリサイズするだけの「resize()」メソッドもあります。

ウィンドウをデスクトップの横半分を占めるように広げたい場合などは、ディスプレイの情報を取得する「Display」クラスを使い、下記のようにするとよいでしょう。
var {Window,Display}=require('Window');
var a=Display.active.work;
Window.active.moveTo(a.left,a.top,a.width/2,a.height);
Displayクラスには、プライマリディスプレイを取得する「Display.primary」の他、アクティブウィンドウがあるディスプレイを取得する「Display.active」や、マウスカーソルがあるディスプレイを取得する「Display.pointed」などもあります。
Displayオブジェクトの「work」プロパティでは、タスクバーなどの領域を除いた作業領域の範囲を取得できます。
これらの値を元にした座標やサイズを「Window.active.moveTo()」に渡せば、画面に合せてアクティブウィンドウを移動・リサイズできます。
「Window.find()」などを使えば、アクティブウィンドウ以外の特定のウィンドウを表すWindowオブジェクトを取得して操作することも可能です。

Hotstrokesの操作に対して割り当てて好きなときに呼び出したり、「Window.observe()」でウィンドウの出現などを監視して自動操作したり、ブラウザなどの常用ソフトのウィンドウをリサイズしてすぐに終了するスクリプトを作成して必要なときに実行したりして利用するといいでしょう。


なお、ブラウザなど常に起動しているソフトのウィンドウの位置・サイズを固定して長時間常時表示させていると、枠などの変化のない部分の映像がディスプレイに焼き付いてしまうことがあるので注意してください。
液晶ディスプレイでは焼き付きは起こらないという話がありますが、1万時間くらい同じ映像を表示させているとさすがに多少焼き付いてしまうようです。
画面全体が#202020くらいの暗い色になっているときでないと分からないので、全画面で動画再生やゲームをする人でなければ気にならないでしょうが。

2010/09/26

ウィンドウ生成機能でデスクトップ上に字幕を表示

NILScriptでは、ウィンドウを生成して情報を表示したり入力を受け付けたりすることも出来ます。
通常はメモ帳などのアプリケーションと同じタイトルバー付きのウィンドウになりますが、Window.create()のオプションでスタイルを指定する事で、枠のないウィンドウやタスクバーに表示されないウィンドウなども作れます。
今回は、これらのオプションを駆使してデスクトップ上に字幕を表示させる例を紹介します。

下記のようなスクリプトで、上の画像の「Warning!!」の部分のようなテキストを表示させられます。
var win=require('Window').Window.create({
    isPopupWindow:true,hasTickFrame:false,hasBorder:false,hasDlgFrame:false,
    toolWindow:true, 
    topmost:true,
    transparent:true,
    transparentColor:0xFF01FF,
    alpha:196,
    width:0,height:0,
    children:{ie:{type:require('ATL').Trident,top:0,left:0,right:0,bottom:0}},
});
win.resize(800,120,true).moveToCenter();
win.ie.update('<body style="margin:0;background-color:#FF01FF;overflow:hidden;text-align:center; font-size:96px;color:#FF0000;">Warning!!</body>');
win.show();
sleep(3000);
win.close();
オプションの1行目の4つの項目は、タイトルバーやウィンドウ周辺の枠を無くすオプションです。余計な物をなるべく表示させたくないときに利用するといいでしょう。
「toolWindow」は、タスクバー上にボタンを表示しないようにするするオプションです。
これらのオプションを指定すると、通常の方法ではウィンドウを閉じられなくなるので、必要に応じてウィンドウを隠したり閉じたりする処理を用意してください。

「topmost」は、ウィンドウを常に最前面に表示させるオプションです。アクティブウィンドウの上に表示させたい場合などに指定します。

「transparent」はクリックなどを下のウィンドウに透過させるオプションです。主にtopmostと組み合わせて使います。クリックして操作する必要のない情報表示用ウィンドウで、誤ってクリックして操作の妨げとなることを防ぎたい場合などに指定するといいでしょう。

「transparentColor」はウィンドウ上の特定の色の部分を完全に透明にするオプションです。字幕などを表示するときは、このオプションで背景を透過させます。透過色は「0xRRGGBB」の形式の数値で指定します。本来透過させるつもりでない部分に使われている色と被ってしまわないように、なるべく使われなさそうな色を指定します。
また、「alpha」では、透過色以外のウィンドウ全体の不透明度を0~255の数値で指定できます。ゼロに近いほど透明になります。

ウィンドウの大きさを指定する「width」と「height」は、作成オプションでは両方ゼロにしておき、後から「resize()」で適当な大きさにしています。これは、たまに透過指定した背景色が描画されていない状態で一瞬だけ表示されてしまうことがあるのを防ぐためです。なお、「moveToCenter()」は、ウィンドウを画面中央に位置するように移動するメソッドです。

ウィンドウ内に配置するコントロールを定義する「children」では、背景色や文字スタイルなどを柔軟に指定できるように、ウィンドウ全体にIEコンポーネントを配置することにします。
IEコンポーネント上に表示する内容は、後の「win.ie.update()」で指定します。ここでは、body要素のstyle属性で文字のスタイルや背景色を指定したり、マージンやスクロールバーなどを削除しています。背景色には、transparentColorで指定したのと同じ色を指定します。
body要素内のHTMLには、今回は単なるテキストを指定しましたが、HTMLで装飾を加えたりしてもよいでしょう。ただし、スタイルシートの透過機能などで背景色と混じった部分は透過されなくなってしまうので注意してください。

HTTPでファイルのアップロードを行う

NILScriptには、HTTPでリクエストを送信してレスポンスを得る機能も用意されています。
一発でレスポンスボディを得られる手軽なメソッドや、レスポンスボディをストリームとして逐次読み込みするオブジェクトを返すメソッドなどが用意されている他、リクエストヘッダの指定やプロキシの使用など、柔軟な動作設定も可能です。
WSHなどでは実現が面倒なファイルのアップロードも、下記の例のように簡単に実現できます。
require('HTTP').HTTP.post(url,{
 upfile:new File(filePath),
 pass:"test",
 com:"this is test of file upload",
});
ファイルのアップロードを行うには、POSTによるリクエストを行うpost()メソッドを使用します。
第1引数はリクエストするURL(HTMLのform要素のaction属性で指定される物)を、第2引数にはフォームの項目名と項目内容のペアを列挙したオブジェクトを指定します。
ここで項目内容としてFileオブジェクトが指定されていると、そのファイルの内容がアップロードされます。
上記の例では、変数に格納されたフルパスを元にFileコンストラクタを呼び出していますが、実行時にファイルの指定を受け付ける様々な方法の記事で紹介したような方法で得たFileオブジェクトを指定してもよいでしょう。
post()メソッドは、アップロード完了後に表示されるページの内容などのレスポンスボディ文字列を返します。アップロードされたファイルのURLを得たい場合などは、返り値の内容を正規表現マッチングで調べたりするとよいでしょう。

なお、NILScriptのHTTPには、非同期的な処理を行う機能は用意されていないません。
リクエストを開始したら即座に次の処理に進みたい場合には、「Thread.create()」で生成したスレッド内でリクエストを実行することで非同期化してください。

2010/09/24

実行時にファイルの指定を受け付ける様々な方法

ファイルに対して何らかの処理を行うスクリプトでは、実行時に処理対象ファイルを指定できるようにしておくと便利です。
今回は、ファイルの指定を受け付ける方法をいくつかまとめて紹介します。

ダイアログ

「Dialog」ユニットに用意されているFileDialogを使用すれば、標準的なファイル選択ダイアログを表示してファイルを選択させられます。
素早い操作には向きませんが、ソフトの操作に慣れていないユーザーに使わせる場合などには、この方法が一番分かりやすいでしょう。

下記は、ダイアログを表示して選択させたファイルの合計サイズを「alert()」関数でダイアログ表示するという例です。
FileDialogでは、複数選択の可否や初期表示ディレクトリなど様々な挙動をオプションで指定できます。詳細な説明は、同梱の「doc\Dialog.txt」を参照してください。
show()の返り値は、multiSelectがfalseの場合は一つのFileオブジェクト、trueの場合はFileオブジェクトの配列になります。Fileオブジェクトの機能については、doc\base_io.txtを参照してください。
「sum()」は、配列オブジェクトに追加された拡張メソッドで、指定プロパティの合計値を返します。
var fileArray=require('Dialog').FileDialog.show({
 directory:"D:\\bin",
 multiSelect:true,
});
alert(fileArray.sum("size"));

コマンドライン引数

コマンドライン引数で対象ファイルを指定できるようにしておけば、スクリプトファイルやショートカットのアイコンへのドラッグ&ドロップの他、「送る」メニューへの登録やコマンドプロンプトからの実行、他のソフトの外部アプリ呼び出し機能での利用など、様々な使い方が可能になります。

スクリプトへのコマンドライン引数は、「Main.params」というプロパティで配列として取得できますが、配列の各要素は単なる文字列ですので、ファイルに関する操作を行うには、Fileオブジェクトに変換してやる必要があります。 
コマンドプロンプトなどから相対パスを指定して実行した時にも対応できるように「cwd().file()」を利用するといいでしょう。「cwd()」はカレントディレクトリのDirectoryオブジェクトを得る関数、「file()」は相対/絶対パスで指定したファイルのFileオブジェクトを得るメソッドです。

コマンドライン引数で与えられたファイルの合計サイズを表示するスクリプトは、以下のようになります。
var fileArray=[];
for(var i=0,a=Main.params,l=a.length;i<l;i++){
 fileArray.push(cwd().file(a[i]));
}
alert(fileArray.sum("size"));
さらに使い勝手を高めるには、コマンドライン引数が指定されなかった場合にファイル選択ダイアログを表示するなどの処理を追加するといいでしょう。


クリップボード経由

NILScriptには、エクスプローラなどでのCtrl+Cでコピーされたファイルリストを読み取る機能が用意されています。
この機能を利用すれば、クリップボード経由で処理対象ファイルを指定する方式のスクリプトを作成可能です。
ファイル選択ダイアログやウィンドウへのドラッグ&ドロップよりも素早い操作で利用できるので、「送る」などに登録するほど利用頻度が高くないスクリプトを作る場合におすすめです。

クリップボードに格納されているファイルの配列は、下記のようにすることで取得できます。ファイルが格納されていない時はfilesがundefinedになるので、ファイル以外をコピーしている場合はゼロ個のファイルとして扱いたい場合は、「||[]」を付けて空の配列に置き換わるようにしておきます。
なお、クリップボードの内容は確認しづらいので、重大な処理を行うスクリプトでは、間違ったファイルをコピーした状態で実行してしまわないように、確認ダイアログを表示する「confirm()」などによる確認処理を組み込んでおくとよいでしょう。
var fileArray=require('Clipboard').Clipboard.files||[];
if(confirm(fileArray.join("\n"))){
 alert(fileArray.sum("size"));
}


ウィンドウへのD&D受け付け

ウィンドウを表示するタイプのツールでは、ウィンドウにファイルをドラッグ&ドロップすることでファイルを指定できるようにしておくと便利です。
本来はウィンドウを必要としない処理でも、処理対象ファイルを好きな時に指定できるようにしたい場合などは、ドラッグ&ドロップによるファイル指定を受け付けるためのウィンドウを用意するとよいでしょう。
ウィンドウへのファイルドロップを受け付けるには、Window.create()のオプションで「acceptFiles」をtrueにし、「events」の「dropFiles」にイベントハンドラ関数を指定します。
イベントハンドラの第1引数オブジェクトの「files」メンバで、ドロップされたファイルを表すFileオブジェクトの配列を取得できます。
with(require('Window')){
 Window.create({
  width:320,height:240,topmost:true,
  children:{
   edit:{
    type:Edit,multiline:true,readOnly:true,
    left:0,top:0,right:0,bottom:0,
   },
  },
  acceptFiles:true,
  events:{
   dropFiles:function(o){
    this.edit.text=o.files.join("\r\n")+"\r\n合計バイト数: "+o.files.sum("size");
   },
  },
 }).moveToCenter().show();
}

省電力状態からの自動復帰も可能なタイマー機能

NILScriptに用意されている「Timer」クラスには、コンピュータがサスペンドやハイバネート状態になっても指定時間経過後に自動復帰させる機能が用意されています。
この機能を利用すれば、サーバが空いている時間帯を利用してのダウンロードなどの待ち時間の長い自動処理を行う際に、予定時刻を待っている間コンピュータを起動したままにしておく必要が無くなり、電力を節約できます。
この機能を利用するには、Timerオブジェクトのコンストラクタで第4引数にtrueを指定します。Timerの使用方法については、同梱のdoc\base_task.txtを参照してください。

復帰とは逆に、スクリプト上からサスペンドやハイバネートを実行するためのメソッドも用意されています。これらは「System.suspend()」や「System.hibernate()」というSystemクラスのメソッドとなっています。
また、サスペンドやハイバネート状態に移行し、指定時間後に自動復帰するという処理を行う「System.suspendFor()」や「System.hibernateFor()」というメソッドも用意されています。これらの機能の説明は、doc\base_main.txtにあります。

なお、タイマーによる復帰機能では、タイマーで指定した時間に復帰処理が始まるため、復帰が完了して予約された処理が実行されるまでには数秒~数十秒のタイムラグがあることに注意しなければなりません。
テレビの自動録画のように遅れることが許されない処理では、予約実行のタイマーとは別に、予定時刻の1~2分前に自動復帰させるためのタイマーをセットしておくとよいでしょう。
この場合、「System.awake()」というメソッドを使用すれば、単にサスペンド・ハイバネートから復帰するだけのタイマーを生成できます。

2010/09/21

プロセスのCPU使用率を監視して自動処理

先日の更新で、CPUの使用状況などを取得するためのクラスを提供する「SystemMonitor」ユニットが追加されました。
このユニットには、「CPU」、「ProcessCPU」、「Network」、「PerformanceCounter」の4つのクラスが用意されています。
「CPU」クラスでは、システム全体のCPU使用率が取得できます。マルチプロセッサの個別の稼働状況も取得可能です。
「ProcessCPU」クラスでは、指定のプロセスのCPU使用率を取得できます。
「Network」は、ネットワークインターフェイスの転送量を取得するクラスです。複数のネットワークインターフェイスの個別の転送量も取得できます。
他にも、「PerformanceCounter」を使うことで、HDDの読み書き量など様々な情報を取得できます。
また、標準クラスである「System」には「memory」メンバとしてシステムのメモリ使用状況を取得するメンバが追加された他、以前からProcessインスタンスの「pagefileUsage」プロパティや「workingSetSize」プロパティでプロセスごとのメモリ使用状況を取得可能になっています。

これらの機能は、タスクマネージャのような情報表示だけでなく、自動処理を進める条件などとしても役立つでしょう。
例えば、動画のエンコードなどの時間のかかる処理が終ってから別の処理を自動実行させたいけれどエンコードソフトがプロセスの存続やウィンドウのテキストなどによる終了判定がしにくい仕様になっている場合に、プロセスのCPU使用率が低くなった時点で処理完了とみなすといった具合です。

このような場合、以下の例のようなスクリプトで、処理の完了まで待機させることが出来ます。
var p=Process.find("VirtualDub.exe");
try{
    var mon=new (require('SystemMonitor').ProcessCPU)(p);
    sleep(1000);
    while(mon.get()>0.05){
        sleep(1000);
    }
}finally{
    free(mon);
}
sleep(10000);
//以降にエンコード終了後の処理を記述

最初の行で、監視対象となるProcessオブジェクトを取得しています。
この例では、既に実行中のプロセスを取得する「Process.find()」を使っていますが、「Process.create()」でプロセスの起動から自動化してもよいでしょう。
「var mon=new (require('SystemMonitor').ProcessCPU)(p);」で、そのプロセスのCPU使用率を取得するためのProcessCPUオブジェクトを生成しています。
プロセスのCPU使用率を取得するには、このオブジェクトの「get()」メソッドを呼び出します。
このメソッドは、前回呼び出し時かインスタンス生成時から今回呼び出し時までの期間のCPU使用率を返すので、インスタンス後に即座に呼び出してしまうと正常な値が取得できないため、最初のget()呼び出しの前にもsleep()が呼び出されるようにしておく必要があります。
get()の返り値は0~1の間の小数となるので、上記の例ではCPU使用率が5%以下になるまでループし続けることになります。
CPU使用率が低くなった直後は、まだファイルへの書き込みなどの処理が行われている可能性があるので、数秒程度sleep()してから次の処理に進むようにするとよいでしょう。
なお、「free(mon)」は、監視オブジェクトで使用したリソースを解放するための処理ですが、一連の処理を実行してすぐに終了するタイプのスクリプトでは、省略しても問題は無いでしょう。

なお、CPUやNetwork、PerformanceCounterクラスも、インスタンスを生成してget()で値を取得するという流れはProcessCPUと同じです。
コンストラクタに渡す引数やget()が返す内容などの詳しい仕様は、同梱のdoc\SystemMonitor.txtを参照してください。

2010/09/01

クリックしたウィンドウのクラス名をコピーするスクリプト

Hotstrokesの条件割り当てなどでは、ウィンドウの「クラス名」を指定する事がよくあります。
ウィンドウのクラス名は、Windowsのウィンドウの種類を表す文字列です。NILScriptに用意されているクラスの仕組みとは、特に関係はありません。
タイトルバーの文字列と違って、クラス名は画面に表示されたりしないので、調べるには何らかのツールを使う必要があります。
そこで、クリックしたウィンドウのクラス名をクリップボードにコピーするスクリプトの例を紹介します。
use('Mouse','Window','Clipboard');
Mouse.wait('lbuttonUp');
Clipboard.text=Window.fromPoint(Mouse.x,Mouse.y).className;
実行すると「Mouse.wait('lbuttonUp');」によってマウスの左ボタンが押されるまで待機状態になるので、クラス名を調べたいウィンドウをクリックしてください。
次の行では、クリップボードにテキストとしてウィンドウのクラス名がセットされます。
「Window.fromPoint()」は、デスクトップ全体における指定座標に存在する最も前面のウィンドウを表すWindowオブジェクトを返すクラスメソッドで、Windowオブジェクトの「className」プロパティでクラス名を取得できます。

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

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つの処理を行う関数を割り当てています。

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

選択テキストをWeb検索するHotstrokes定義

選択中の文字列をパラメータにして検索サイトのURLを開くなど、エディタやブラウザでの選択文字列に対して処理を行いたいことはよくあります。

NILScriptでは、「Window」ユニットの「Edit」クラスに用意されている「selection」プロパティで選択文字列の読み書きを行なえますが、エディットコントロール側がエディタ関連のウィンドウメッセージに応答するように作られている必要があり、全ての選択テキストに対して有効なわけではありません。
エディタ関連メッセージに未対応のテキストエディタやブラウザなどからは、別の方法で選択テキストを取得しなければなりません。
一番汎用的だと思われるのは、Ctrl+Cなどを送信してコピーを実行し、クリップボードにコピーされたテキストを取得する方法でしょう。

下記に挙げるのが、エディタ関連メッセージに対応したコントロールではselection、それ以外のコントロールではクリップボードを使用して選択テキストを取得しGoogle検索するという機能をHotstrokesに割り当てるスクリプトです。
Main.createNotifyIcon();
var {Clipboard}=require('Clipboard');
var {Hotstrokes}=require('Hotstrokes');
var {Edit}=require('Window');
Hotstrokes.defineConditions({
 'Editor':function()(['Edit','TEditorX'].contains(this.focusedWindow.className)),
}).map({
 'Win+G':{
  'Editor':function(){
   this.cancel();
   exec('http://www.google.com/search?q='+encodeURIComponent(Edit.focused.selection));
  },
  '':function(){
   this.cancel();
   Thread.create(function(){
    var bk=Clipboard.text;
    Hotstrokes.send("Ctrl+C");
    sleep(100);
    exec('http://www.google.com/search?q='+encodeURIComponent(Clipboard.text));
    if(bk){
     Clipboard.text=bk;
    }
   });
  },
 },
}).register();
最初のdefineConditions()では、「Editor」という条件名にエディタ関連メッセージに対応したコントロールのクラス名を条件とする関数を定義しています。
「contains()」は、引数で指定した値を要素として持つかどうかを返す配列の拡張メソッド、「this.focusedWindow.className」は、ストロークが受理された時にフォーカスを持っているコントロールのクラス名を得る式です。
上記の例では、メモ帳などで使われる基本的なテキスト編集欄であるEditや、VxEditorで使われているTEditorXを対象として定義しています。

map()では、Windowsキー+Gに対して、条件に応じた動作を割り当てています。
「this.cancel()」というのは、Gキーの押し下げストロークの本来の動作を無効化するという動作です。これがないと、「g」という文字が入力されて選択テキストが上書きされてしまうでしょう。

Editorの場合の動作では「Edit.focused.selection」でフォーカスのあるエディタの選択テキストを取得しています。「Edit.forused」は、フォーカスのあるコントロールをEditクラスのインスタンスとして取得するというEditクラスのプロパティです。
exec()は、システムの関連付けに従ってファイルやURLを開く関数、encodeURIComponent()はURLのパラメータとして使えるように文字列をエンコードするJavaScript標準の関数です。


他の条件に一致しなかった時に参照されるデフォルト動作である「''」に対する割り当てでは、this.cancel()以外を「Thread.create()」によって新規スレッドで実行しています。
sleep()などを含み時間がかかる処理は、そのまま実行すると動作が不安定になってしまう場合があるので、このようにして新規スレッドで実行させるように習慣づけておくとよいでしょう。
スレッド内では、クリップボードのテキストを変数にバックアップし、Ctrl+Cを送信し、コピー処理が完了するのをsleep()で待って、検索結果のURLを開き、バックアップしたテキストがあれば書き戻すという処理を行っています。