Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

Internet Explorerのコンテキスト・メニューに項目を追加する

これは2006年に以前のブログへ投稿したエントリーを加筆、編集したものです。

コンテキスト・メニューとは右クリックで表示されるメニューのこと。コピー・ペーストや印刷、表示の更新など、このメニューを通じて、たいていのことを実行できる。例えばGoogle Toolbarをインストールすると、ブラウザ上に表示されているテキストの一部を選択しているときに表示されるメニューには、次の項目が含まれている。

  • Google 検索(&G)
  • 翻訳(&T)

必要な都度、検索ボックスへ検索キーを入力することなく、次のアクションで検索結果に到達できるため、効率が良い。

  1. 選択
  2. 右クリック
  3. メニュー選択

このエントリーでは、どのようにしてコンテキスト・メニューへ項目を追加するのか、をInternet Explorerの場合について解説する。

まず、該当箇所のデータは次のレジストリに格納されている。

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt

MenuExt以下に表示されているレジストリ・キーがコンテキスト・メニューに表示される項目であり、キー名が表示名を兼ねている。
ここに表示したいキーを登録し、適切なレジストリ値を設定することで、項目を追加することができる。

レジストリ値には次の2項目がある。

  • (既定)
  • Contexts

(既定)には、そのメニューを選択したときに実行したいアクションを設定したファイルへのパスを指定する。例えば、あるプログラムを起動したい場合、その実行ファイルへのパスを指定する。スクリプトやそれを含むhtmlファイルも指定できる。

Contextsは、その項目がどのようなときに表示されるのかを設定する。この設定値には次のものが存在する。

デフォルト (0x1 << CONTEXT_MENU_DEFAULT) (evaluates to 0x1) 10進数:1 16進数:1
画像を右クリック (0x1 << CONTEXT_MENU_IMAGE) (evaluates to 0x2) 10進数:2 16進数:2
コントロールを右クリック (0x1 << CONTEXT_MENU_CONTROL) (evaluates to 0x4) 10進数:4 16進数:4
テーブルを右クリック (0x1 << CONTEXT_MENU_TABLE) (evaluates to 0x8) 10進数:8 16進数:8
テキスト選択状態で右クリック (0x1 << CONTEXT_MENU_TEXTSELECT) (evaluates to 0x10) 10進数:16 16進数:10
アンカー(ハイパー・リンク)を右クリック (0x1 << CONTEXT_MENU_ANCHOR) (evaluates to 0x20) 10進数:32 16進数:20
不明 (0x1 << CONTEXT_MENU_UNKNOWN) (evaluates to 0x40) 10進数:64 16進数:40

上記Contextsのうち複数条件での項目表示を実現するには、各値の論理和をContextsへ設定する。例えば、デフォルトと画像右クリックなら10進数で3、デフォルトからテキスト選択状態までならば10進数で31。

具体例を示す。次の手順を実行しようとするならば、

  1. あるテキストを選択しているときに右クリック
  2. メニューに表示された「***で検索」を選択
  3. c:\temp\search.htmlを実行

登録するレジストリ・キーは、次のようになる。

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\***で検索
(既定): c:\temp\search.html
Contexts: 16(10進数)

このレジストリ・キーをスクリプトを用いて登録するならば、その記述は次のようになる。

option explicit

const HKEY_CURRENT_USER = &H80000001
const SEARCH_KEY = "Software\Microsoft\Internet Explorer\MenuExt\***で検索"
const SEARCH_CONTEXTS = "contexts"
const SEARCH_CONTEXTS_VALUE = 16
const SEARCH_PATH = "C:\temp\search.html"

dim my_computer
dim my_registry

my_computer = "."
 
Set my_registry = GetObject("winmgmts:\\" & my_computer & "\root\default:StdRegProv")
my_registry.CreateKey HKEY_CURRENT_USER, SEARCH_KEY
my_registry.SetStringValue HKEY_CURRENT_USER, SEARCH_KEY, "", SEARCH_PATH
my_registry.SetDWORDValue HKEY_CURRENT_USER, SEARCH_KEY, SEARCH_CONTEXTS, SEARCH_CONTEXTS_VALUE

msgbox "SEARCH_KEY registration - Complete"

加えて、このレジストリ・キーを削除するためのスクリプトは、

option explicit

const HKEY_CURRENT_USER = &H80000001
const SEARCH_KEY = "Software\Microsoft\Internet Explorer\MenuExt\***で検索"

dim my_computer
dim my_registry

my_computer = "."
 
Set my_registry = GetObject("winmgmts:\\" & my_computer & "\root\default:StdRegProv")
my_registry.DeleteKey HKEY_CURRENT_USER, SEARCH_KEY

msgbox "delete SEARCH_KEY - Complete"