aodama.gif(0.97KB) IE の右クリックメニューに項目を追加

 ここでは、インターネット エクスプローラ(以下 IE)の右クリックメニュー(コンテキストメニュー)に、 自分の好きな項目を追加する方法を解説します。 まあ私が書くまでもなく MSDN ライブラリにも載っていますが、 MSDN ライブラリは C 言語しちゃってて VB オンリーのユーザーにはわかりにくい点もあったので、 VB 初心者の方にもわかりやすく書き換えてみた・・・つもりです(^^;


● こんな感じになるよ

Drag Star をインストールした場合
 右のキャプチャー画像を見て下さい。これは IE で文字列をドラッグして選択し、右クリックしたときの画像です。 普通の IE にはない、「選択URLを開く(D)」という項目が追加されているのがわかりますでしょうか? これは拙作「Drag Star」をインストールすることにより追加された項目です。

 IE の右クリックメニューに項目を追加する方法は実に簡単です。 その方法をステップ順に説明していきます。 なおこの方法は、IE4.0 以上で使用できます。


● 実行スクリプトファイルの作成

 とりあえずどんな処理を行いたいか決めましょう。 う〜ん、じゃあとりあえずサンプルとして「選択した文字列を Google で検索する」という処理でも作ってみることにします(^^;

 実行する処理は、HTML ファイルに VBScript や JavaScript などで記述します。 ここはいちおう「VB コーナー」なので VBScript で書いてみます。

Google 検索サンプルスクリプト(簡易版)
<SCRIPT LANGUAGE="VBScript"> Dim strSelText '選択されている文字列を格納する変数 Dim strOpenUrl '開く URL 文字列を格納する変数 '選択されている文字列を取得 'external.menuArguments が親ウィンドウ(選択されている文字列のあるウィンドウ) strSelText = external.menuArguments.document.selection.createRange().text '選択されている文字列が 0 文字より多い場合(当然だけど) If Len(strSelText) Then '検索するための URL を作成。50 件表示はただ俺の好み(^^; strOpenUrl = "http://www.google.com/search?q=" & strSelText & "&num=50&hl=ja&filter=0&lr=lang_ja&ie=Shift_JIS" '検索結果を新しいウィンドウで開く open strOpenUrl, "_blank" End If </SCRIPT>

 これを Google.htm というファイル名で保存します。名前は何でもかまいませんが、 拡張子は HTML ファイルの .htm または .html にします。

 オブジェクトや Google の検索キーなどについてはここでは詳しく説明しません。 オブジェクトについては MSDN ライブラリまたは、とほほさんのとほほのWWW入門の JavaScript リファレンスなどを参考にして下さい。

 しかしこれだけでは URL エンコードなどがされていないため、 正しい検索結果が得られないこともあります。 実際に Google 検索機能を IE につけたいという方は、

Google 検索サンプルスクリプト(実用版) : ダウンロードgoogle.txt (7.10KB) ※ 右クリックで「対象をファイルに保存(A)」して下さい

をダウンロードし、Google.htm にリネームして使って下さい。


● レジストリキーの作成

 次にレジストリにキーを追加します。IE のコンテキストメニューの項目は

    HKEY_CURRENT_USER
        Software
            Microsoft
                Internet Explorer
                    MenuExt
となります。MSDN ライブラリをお持ちの方は、 「[InetSDK] ブラウザの標準コンテキストメニューに項目を追加する」に詳しい情報が記述されていますので、 そちらも併せてご覧下さい。てゆうか、MSDN ライブラリがあれば私のページなんて参考にしなくてもよいです(^^;

 "MenuExt" キーはただ IE がインストールされているだけの状態では存在しませんので、 存在しない場合は作成しなければなりません。 API を使用してレジストリキーをオープンする場合は RegOpenKeyEx を使用するのではなく、 RegCreateKeyEx を使用した方がよいと思われます。 RegCreateKeyEx を使用して "MenuExt" キーをオープンした場合、 "MenuExt" キーが存在しなかった場合は "MenuExt" キーを作成してくれます。

 この "MenuExt" キー以下に、ブラウザで右クリックしたときに表示させる文字列のキー名を作成します。 キー名には "&"(アンパサンド) 記号が使用可能で、"&" の次のアルファベットをショートカットキーにできます。 ここでは「Google で検索」のように、"G" をショートカットキーにするように作成してみます。
    HKEY_CURRENT_USER
        Software
            Microsoft
                Internet Explorer
                    MenuExt
                        &Google で検索
レジストリエディタ MenuExt キー

レジストリエディタ (標準)
 作成した "&Google で検索" キーの "(標準)" の値には、先ほど作成した "Google.htm" の場所をフルパスで記述します。 右のキャプチャー画像は DOS8.3 ショートパスになっていますが、ロングパスでも別にかまいません。

 次に "contexts" という値の名前を作成します。この "contexts" はアイテムの表示方法を DWORD 値で指定します。 設定できる値は、0x1(&H1) を以下の値だけ左ビットシフトしたものとなります。(mshtmhst.h より)
#define CONTEXT_MENU_DEFAULT        0
#define CONTEXT_MENU_IMAGE          1
#define CONTEXT_MENU_CONTROL        2
#define CONTEXT_MENU_TABLE          3
#define CONTEXT_MENU_TEXTSELECT     4
#define CONTEXT_MENU_ANCHOR         5
#define CONTEXT_MENU_UNKNOWN        6
C/C++ なら以下のようにビットシフト演算子を用いて値を求めることができます。
    dwContextValue = 0x1 << CONTEXT_MENU_TEXTSELECT;
VB にはビットシフト演算子はないので、このように計算するしかありません。
    lngContextValue = &H1 * (2 ^ CONTEXT_MENU_TEXTSELECT)
しかしいちいち毎回計算する意味はなさそうなので、CONTEXT_MENU 定数を計算された値に置き換えてしまいます。 本当はあまりよくないと思いますが・・・(^^;
Public Const CONTEXT_MENU_DEFAULT = &H1     '通常右クリックした時
Public Const CONTEXT_MENU_IMAGE = &H2       'イメージを右クリックした時
Public Const CONTEXT_MENU_CONTROL = &H4     'コントロールを右クリックした時
Public Const CONTEXT_MENU_TABLE = &H8       'テーブルを右クリックした時
Public Const CONTEXT_MENU_TEXTSELECT = &H10 'テキストを選択して右クリックした時
Public Const CONTEXT_MENU_ANCHOR = &H20     'アンカー(リンク)を右クリックした時
Public Const CONTEXT_MENU_UNKNOWN = &H40    'よくわかんね(^^;
レジストリエディタ contexts
 このコーナーのサンプルでは「選択した文字列を Google で検索する」という処理を作るので、 ここでは "contexts" の値には CONTEXT_MENU_TEXTSELECT の &H10(10 進数で 16) を指定します。

 もしデフォルト動作とテキスト選択の時にメニュー項目を表示したければ、 CONTEXT_MENU_DEFAULT と CONTEXT_MENU_TEXTSELECT の論理和(Or)を求めます。 この値は、VB の表記で書くと以下の通りです。
    CONTEXT_MENU_DEFAULT Or CONTEXT_MENU_TEXTSELECT
結果は &H11(10 進数で 17) となります。


● 完成!

Google で検索

 これで完成です。IE が起動している場合はいったん終了させて再起動し、 適当な文字を選択して右クリックしてみて下さい。 「Google で検索」という項目が追加されていれば成功です。

● 完成版サンプル(VB)

 とりあえずレジストリに登録する手順を関数化してみました。 サンプルアーカイブ内には、メニュー項目の削除や存在確認ができる関数も含まれています。

'----- RegIEContextMenu -----
'IE の標準コンテキストメニューに項目を追加します。
'
'引数 strItemName
'   新たに作成する項目の名前を指定します。lngContextValue で指定した
'   条件で IE を右クリックした場合、ここで指定した文字列がメニューに
'   表示されます。アルファベットの前に "&"(アンパサンド) を
'   記述すると、そのアルファベットはショートカットキーになります。
'
'   例 : "&Google で検索"
'        "選択URLを開く(&D)"
'
'引数 strScriptFile
'   strItemName のメニューアイテムが選択されたときに実行する、
'   スクリプトファイルをフルパスで指定します。
'
'引数 lngContextValue
'   strItemName のメニューアイテムが表示される条件を指定します。
'   設定する値の詳細は CONTEXT_MENU 定数をご覧下さい。
'   複数の条件で表示したい場合は、各々の値の論理和(Or)を指定します。
'
'   例 : デフォルト動作とテキスト選択の時にメニュー項目を表示
'        CONTEXT_MENU_DEFAULT Or CONTEXT_MENU_TEXTSELECT
'
'戻り値
'   成功した場合は True が返ります。失敗した場合は False が返ります。
'
Public Function RegIEContextMenu _
    (ByRef strItemName As String, _
     ByRef strScriptFile As String, _
     ByVal lngContextValue As Long, _
     Optional ByVal lngFlags As Long) As Boolean

 Dim lngOpenExtKey As Long  'MenuExt キーのハンドルを格納
 Dim lngOpenItemKey As Long '作成されたキーのハンドルを格納
 Dim lngRet As Long
 Dim saBuffer As SECURITY_ATTRIBUTES

    'キー名が指定されていない、スクリプトファイルが存在しない場合、関数を抜ける
    If Len(strItemName) = 0 Then Exit Function
    If Len(Dir$(strScriptFile)) = 0 Then Exit Function

    'MenuExt キーをオープン。存在しない場合は作成される
    If RegCreateKeyEx(HKEY_CURRENT_USER, _
                      IE_KEY_MENUEXT, _
                      0, _
                      0, _
                      REG_OPTION_NON_VOLATILE, _
                      KEY_ALL_ACCESS, _
                      saBuffer, _
                      lngOpenExtKey, _
                      lngRet) <> ERROR_SUCCESS Then Exit Function

    'strItemName で指定された名前のキーを作成
    If RegCreateKeyEx(lngOpenExtKey, _
                      strItemName, _
                      0, _
                      0, _
                      REG_OPTION_NON_VOLATILE, _
                      KEY_ALL_ACCESS, _
                      saBuffer, _
                      lngOpenItemKey, _
                      lngRet) <> ERROR_SUCCESS Then
        GoTo CloseExtKey
    End If

    '作成したキーの "(標準)" の値に strScriptFile を設定
    If RegSetValueEx(lngOpenItemKey, _
                     vbNullString, _
                     0, _
                     REG_SZ, _
                     ByVal strScriptFile, _
                     LenB(StrConv(strScriptFile, vbFromUnicode)) + 1) <> ERROR_SUCCESS Then
        GoTo CloseItemKey
    End If
    
    '作成したキーの "contexts" の値に lngContextValue を設定
    If RegSetValueEx(lngOpenItemKey, _
                     "contexts", _
                     0, _
                     REG_DWORD, _
                     lngContextValue, _
                     LenB(lngContextValue)) <> ERROR_SUCCESS Then
        GoTo CloseItemKey
    End If
    
    'lngFlags オプションが設定されている場合
    If lngFlags Then
        '作成したキーの "Flags" の値に lngFlags を設定
        If RegSetValueEx(lngOpenItemKey, _
                         "Flags", _
                         0, _
                         REG_DWORD, _
                         lngFlags, _
                         LenB(lngFlags)) <> ERROR_SUCCESS Then
            GoTo CloseItemKey
        End If
    End If
    
    RegIEContextMenu = True
    
CloseItemKey:
    Call RegCloseKey(lngOpenItemKey)    '作成したキーを閉じる

CloseExtKey:
    Call RegCloseKey(lngOpenExtKey)     'MenuExt キーを閉じる

End Function

IE コンテキストメニュー登録モジュール Ver 1.01 : ダウンロード dgs101.lzh (14.1KB)


VBコーナーにもどる   トップページにもどる