検索ハンドラーの作成

[この機能は、Windows XP 以前でのみサポートされています。 代わりに Windows Search を使用してください。]

シェルでは、ユーザーがファイルやプリンターなどの名前空間オブジェクトを検索できる検索ユーティリティがいくつかサポートされています。 カスタム検索エンジンを作成し、検索ハンドラーを実装して登録することで、ユーザーが使用できるようになります。

シェル拡張ハンドラーを実装および登録するための一般的な手順については、「シェル拡張ハンドラーの作成」を参照してください。 このドキュメントでは、検索ハンドラーに固有の実装の側面に焦点を当てています。

検索ハンドラーのしくみ

ユーザーによる検索エンジンの選択には 2 つの方法があります。 最初の方法は、スタート メニューから開始します。 Windows 2000 以前のシステムでは、[スタート] メニューで [検索] コマンドを選択すると、使用可能な検索エンジンのサブメニューが表示されます。 Windows 2000 以降では、[スタート] メニューの [検索] コマンドの名前が [検索] に変更されました。 次の図は、Windows XP システムの [検索] ボタンを示しています。

the start menu's search submenu

ユーザーは Windows Explorer から検索を開始することもできます。 Windows 2000 以前のシステムでは、[ツール] メニューの [検索] コマンドをクリックすると、[スタート] メニューに関連付けられているメニューと基本的に同じメニューが表示されます。 ただし、Windows 2000 版 Windows Explorer では、検索エンジンはまったく異なる方法で処理されます。 [ツール] メニューのサブメニューとして検索エンジンを処理する代わりに、ツール バーに [検索] ボタンが表示されるようになりました。 このボタンをクリックすると、エクスプローラー バーの [検索] ウィンドウが開きます。 次の図は、[ファイルとフォルダーの検索] 検索ウィンドウを示しています。

the windows explorer bar's search pane

Windows 2000 以前のシステムでは、実装と登録の両方に影響を与える検索ハンドラーを管理する方法に多くの違いがあります。

Windows 2000 以前 Windows 2000 以降
検索ハンドラーは、ショートカット メニュー ハンドラーの一種として実装されます。 検索ハンドラーは、ショートカット メニュー ハンドラーとして、または動的 HTML (DHTML) ドキュメントとして実装できます。
検索ハンドラーは、静的または動的のいずれかにすることができます。 静的ハンドラーは、ユーザーが選択した場合にのみ読み込まれます。 動的ハンドラーは起動時にシェルによって読み込まれ、シェルが終了するまで終了しません。 ショートカット メニュー ハンドラーとして実装されるハンドラーは、静的または動的にすることができます。 DHTML ドキュメントとして実装されるハンドラーは静的である必要があります。
検索ハンドラーは、[スタート] メニューの [検索] サブメニューと Windows Explorer の [ツール] メニューの [検索] サブメニューに表示されます。 検索ハンドラーは、[スタート] メニューの [検索] サブメニューにのみ表示されます。 Windows Explorer のメニュー バー経由でカスタム検索ウィンドウを使用できるようにするには、それをバンド オブジェクトとして実装する必要があります。 その後、Windows Explorer の [表示] メニューの [エクスプローラー バー] サブメニューに表示されます。

 

検索ハンドラーの登録

検索ハンドラーは、ファイルの種類の FindExtensions サブキーに登録されます。

HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows
            CurrentVersion
               Explorer
                  FindExtensions

この時点から、登録手順はハンドラーが静的であるか動的であるかによって異なります。 シェル拡張ハンドラーを登録する方法の一般的な説明については、「シェル拡張ハンドラーの作成」を参照してください。

静的検索ハンドラーの登録

静的検索ハンドラーは、ユーザーが起動したときにのみ読み込まれます。 この方法は、小さく、すばやく読み込むことができる DLL に最適です。 DHTML を使用してハンドラーを実装する場合は、静的である必要があります。 静的拡張ハンドラーを登録するには、FindExtensions サブキーの Static サブキーの下のハンドラーに名前付きのサブキーを作成します。 この名前はシステムでは使用されませんが、FindExtensions サブキーの他の検索ハンドラー名と同じにすることはできません。

ショートカット メニューベースの検索ハンドラー

ハンドラーがショートカット メニュー ハンドラーとして実装されている場合は、ハンドラーの名前サブキーの既定値をオブジェクトのクラス識別子 (CLSID) GUID に設定します。 ハンドラーの名前サブキーの下に、0 (ゼロ) という名前のサブキーを作成し、既定値を [検索] または [検索] サブメニューに表示される文字列に設定します。 ショートカット文字の前にアンパサンド (&) を付けることで、通常の方法でキーボード ショートカットを有効にすることができます。 0 サブキーの下にDefaultIcon サブキーを作成することで、オプションの小さいアイコンをメニュー テキストの右側に表示できます。 既定値を、アイコンを含むファイルのパスを含む文字列に設定し、コンマの後にアイコンの 0 から始まるインデックスを付けます。

次の例では、MySearchEngine 検索ハンドラーを登録します。 メニュー テキストは "マイ検索エンジン" で、ショートカット キーとして M が指定されています。 アイコンは、2 のインデックスを含む C:\MyDir\MySearch.dll にあります。

HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows
            CurrentVersion
               Explorer
                  FindExtensions
                     Static
                        MySearchEngine
                           (Default) = {MySearchEngine CLSID GUID}
                           0
                              (Default) = &My Search Engine
                              DefaultIcon
                                 (Default) = c:\MyDir\MySearch.dll,2

DHTML ベースの検索ハンドラー

Windows 2000 では、検索ハンドラーを DHTML ドキュメントとして実装することもできます。 その名前は、[スタート] メニューの [検索] サブメニューに表示されます。 ユーザーが選択すると、Windows Explorer が起動し、エクスプローラー バーが検索ドキュメントに表示されます。 エクスプローラー バーの右側に表示される DHTML ドキュメントを指定することもできます。 既定の検索ウィンドウから別のハンドラーを起動する方法はありません。 検索エンジンは、Windows Explorer から直接起動できますが、バンド オブジェクトとして実装されている場合にのみ実行できます。

DHTML ベースの検索ハンドラーを登録するには、ハンドラーの名前サブキーを CLSID_ShellSearchExt (現在は {169A0691-8DF9-11d1-A1C4-00C04FD75D13}) に設定し、次のサブキーを作成します。

  1. ハンドラー名サブキーの下に 0 (ゼロ) サブキーを作成し、その既定値をメニュー テキストに設定します。
  2. メニュー テキストの横にアイコンを表示するには、0 の下に DefaultIcon サブキーを作成し、その既定値をアイコンのパスとインデックスに設定します。
  3. 0 の下に SearchGUID サブキーを作成します。 DHTML ドキュメントに GUID を割り当て、SearchGUID の既定値をその文字列形式に設定します。 この GUID は、HKEY_CLASSES_ROOT\CLSID の下に登録する必要はありません。
  4. SearchGUID の下に Url サブキーを作成します。 その既定値を、エクスプローラー バーに表示される HTML ドキュメントのパスに設定します。
  5. SearchGUID の下に UrlNavNewUrl サブキーを作成します。 その既定値を、エクスプローラー バーの右側に表示される HTML ドキュメントのパスに設定します。

次の例では、DHTML ドキュメントとして実装された MySearchEngine 検索ハンドラーを登録しています。 メニュー テキストは "マイ検索エンジン" で、ショートカット キーとして M が指定されています。 アイコンは、2 のインデックスを含む C:\MyDir\MySearch.dll にあります。 エクスプローラー バーの DHTML ドキュメントは C:\MyDir\MySearch.htm で、エクスプローラー バーの右側に表示されるドキュメントは C:\MyDir\MySearchPage.htm です。

HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows
            CurrentVersion
               Explorer
                  FindExtensions
                     Static
                        MySearchEngine
                           (Default) = {169A0691-8DF9-11d1-A1C4-00C04FD75D13}
                           0
                              (Default) = &My Search Engine
                              DefaultIcon
                                 (Default) = c:\MyDir\MySearch.dll,2
                                 SearchGUID
                                    (Default) = {My Search GUID}
                                    Url
                                       (Default) = C:\MyDir\MySearch.htm
                                    UrlNavNew
                                       (Default) = C:\MyDir\MySearchPage.htm

動的検索ハンドラーの登録

ハンドラーがショートカット メニュー ハンドラーとして実装されている場合は、動的ハンドラーとして登録することもできます。 その場合、シェルと共に読み込まれ、シェルが終了した場合にのみ終了します。 動的検索ハンドラーは、ユーザーが起動したときに静的ハンドラーよりもはるかに迅速に応答します。 この方法は、ハンドラーの DLL の読み込みに時間がかかる場合や、頻繁に呼び出される可能性がある場合に最適です。

動的検索ハンドラーは、FindExtensions サブキーの下に登録されます。

HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows
            CurrentVersion
               Explorer
                  FindExtensions

ハンドラーに FindExtensions と名前付けされたサブキーを作成し、その既定値をハンドラーの CLSID GUID に設定します。 動的検索ハンドラーに対して、メニュー アイコンはサポートされていません。 次の例では、MySearchEngine を動的検索ハンドラーとして登録しています。

HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows
            CurrentVersion
               Explorer
                  FindExtensions
                     MySearchEngine
                        (Default) = {MySearchEngine CLSID GUID}
                        0
                           (Default) = &My Search Engine

静的検索ハンドラーとは異なり、レジストリ内のメニュー テキストは指定しません。 ハンドラーが読み込まれると、シェルはハンドラーの IContextMenu::QueryContextMenu メソッドを呼び出して、[検索] または [検索] サブメニューに項目を追加します。

検索ハンドラーの実装

検索ハンドラーは、すべてのバージョンの Windows のショートカット メニュー ハンドラーとして実装できます。 Windows 2000 の場合は、DHTML ドキュメントとして実装することもできます。

ショートカット メニュー ハンドラーを実装する方法の一般的な説明については、「コンテキスト メニュー ハンドラーの作成」を参照してください。 検索ハンドラーは、いくつかの点で標準ショートカット メニュー ハンドラーとは異なります。

静的メニュー ハンドラーの場合、レジストリの情報から [検索] または [検索] サブメニューが作成されます。 通常のショートカット メニュー ハンドラーのように、ハンドラーでメニュー項目を追加する必要はありません。 シェルは、次の方法で静的メニュー ハンドラーを管理します。

  • ユーザーがハンドラーのメニュー項目を起動すると、シェルはハンドラーの DLL を読み込み、IContextMenu::InvokeCommand を呼び出して、検索エンジンを起動するようにハンドラーに通知します。 IShellExtInit::Initialize メソッドと IContextMenu::QueryContextMenu メソッドは呼び出されません。
  • IContextMenu::InvokeCommand が呼び出されると、渡される CMINVOKECOMMANDINFO 構造体の lpVerb メンバーがコマンドを特定します。 lpVerb の下位の単語は、コマンドのサブキー名に相当する数値に設定されます。 このサブキーは通常 0 という名前が付けられるため、lpVerb は通常 0 に設定されます。 その後、ハンドラーで検索エンジンを起動する必要があります。

動的検索ハンドラーは、通常のショートカット メニュー ハンドラーとほぼ同じ方法で実装されます。 主な例外は、IShellExtInit::Initialize が呼び出されると、pidlFolder 引数と lpdobj 引数が NULL に設定されていることです。

DHTML ベースの検索ハンドラーは、通常の DHTML ドキュメントとして実装されます。 これには、Windows Internet Explorer でサポートされている HTML、DHTML、またはスクリプト テクノロジを含めることができます。