この文書の原文は、 http://www.microsoft.com/ie/ie40/powertoys/Contextm.htm にあります。


Internet Explorer 4.0 標準コンテクストメニューへの追加

レジストリにエントリを置いて \script を実行する URL にリンクさせると、 Internet Explorer 4.0 の既存のコンテクストメニューに項目を追加することができます。 追加の項目をメニューに加えるには、次のキーを作成ないし開きます。

HKEY_CURRENT_USER
    Software
        Microsoft
            Internet Explorer
                MenuExt

このキーの下に、メニューで表示したいテキストを名前にして、(値ではなく) キーを作ります。 このキーのデフォルト値には実行する URL が入ります。 キー名には '&' 文字を入れることができ、'&' のすぐ後の文字には下線がつきます。 指定した URL は非表示の HTML ダイアログボックスに読み込まれ、行内スクリプトがすべて 実行されると、ダイアログボックスが閉じられます。 非表示 HTML ダイアログボックスの external.menuArguments プロパティには コンテクストメニューの項目が実行されたウィンドウの window オブジェクトが入ります。

次のレジストリエントリは、"My Menu Item" というタイトルの項目を、 4.0 のコンテクストメニューに追加し、ファイル "c:\myscript.htm" に含まれている 行内スクリプトを実行します。

HKEY_CURRENT_USER
    Software
        Microsoft
            Internet Explorer
                MenuExt
                    My Menu Item = "file://c:\myscript.htm"

次に挙げるのは "c:\myscript.htm" の内容です。

<SCRIPT LANGUAGE="JavaScript" defer>
var parentwin = external.menuArguments;
var doc = parentwin.document;
var sel = doc.selection;
var rng = sel.createRange();
var str = new String(rng.text);
if(str.length == 0)
   rng.text = "MY INSERTED TEXT";
else
   rng.text =  str.toUpperCase();

</SCRIPT>

このスクリプトは external.menuArguments から親ウィンドウのオブジェクトを 取得します。親の window オブジェクトは、コンテクストメニューの項目が実行された ウェブブラウザ (WebBrowser) です。スクリプトは次に現在の選択状態を取得し、 選択がされていなければ、 コンテクストメニューが実行された位置に "MY INSERTED TEXT" というテキストを 挿入します。選択がされていれば、選択されているテキストが大文字に変更されます。

オプションのキー

さきほど作った項目のレジストリキーの下には、オプションの値が 2 つあります。 その 1 つは、この項目が表示されるコンテクストメニューを指定します。 もう 1 つは、スクリプトがダイアログとして実行されるべきであることを指定します。

"Contexts" の DWORD 値は項目が表示されるコンテクストメニューを指定します。 これは、論理値ないし以下の値 (mshtmhst.h で定義されています) から構成される ビットマスクです。 これらの値は、IDocHostUIHandler::ShowContextMenu の呼び出しで渡される定数に 対応しています。

(0x1 << CONTEXT_MENU_DEFAULT) (値は 0x1)
(0x1 << CONTEXT_MENU_IMAGE) (値は 0x2)
(0x1 << CONTEXT_MENU_CONTROL) (値は 0x4)
(0x1 << CONTEXT_MENU_TABLE) (値は 0x8)
(0x1 << CONTEXT_MENU_TEXTSELECT) (値は 0x10)
(0x1 << CONTEXT_MENU_ANCHOR) (値は 0x11)
(0x1 << CONTEXT_MENU_UNKNOWN) (値は 0x12)

ですから、例えば、デフォルトのメニューとテキスト選択時のメニューでのみ表示される シンプルな拡張機能にしたければ、 "My Menu Item" キーの下に "Contexts" という DWORD 値を作り、 それを 0x11 に設定します。C/C++ のコードでは、 (0x1 << CONTEXT_MENU_DEFAULT) | (0x1 << CONTEXT_MENU_TEXTSELECT) となります。

もう 1 つのオプションのレジストリ DWORD 値は "Flags" です。 このレジストリ値には 1 つのビット (0x1) のみが有効で、これは mshtmhst.h では MENUEXT_SHOWDIALOG として定義されています。 このビットがセットされていると、スクリプトはちょうど ShowModalDialog メソッドを通じて 呼び出されたかのように実行されます。 ただし、この場合も external.menuArugments の値は、ユーザーがメニュー項目を 選択した window オブジェクトになります。

コンテクストメニューイベント

コンテクストメニューの拡張が起動される場合は必ず、 メインウィンドウの event オブジェクト (external.menuArguments.event) に、 ユーザーがクリックした位置と表示されたのがどのコンテクストメニューがどれかについての 情報が入っています。マウスの座標は event.srcElement で取得できます。 event.type の値には以下の文字列のいずれかが入っており、この値は どのコンテクストメニューがユーザーに提示されたのかを表します。

作成例

この例は、デフォルトのメニュー上のみに新しいコンテクストメニューを作成します。 この項目は "新規ウィンドウで開く(N)" といい、クリックされたものを 新しいウィンドウで表示します。ですから、なにかがフレームセットで深い入れ子になっている 場合に、指定したフレームを独立したウィンドウに簡単に表示させることができます。

ここで、実行すると正しいレジストリ設定を挿入することのできる .reg ファイルの 内容を示します。これを example2.reg とします。エクスプローラでダブルクリックすると あなたのレジストリに設定が挿入されます。

REGEDIT4

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\新規ウィンドウで開く(&N)]
@="file://c:\\example2.htm"
"Contexts"=dword:00000001

次に挙げるのが "C:\example2.htm" の内容です。

<script language="JavaScript" defer>
open(external.menuArguments.location.href);
</script>

原文最終更新日: 1997 年 9 月 23 日火曜日

翻訳: 1999 年 1 月 26 日火曜日