検索ハンドラーの作成
[この機能は、Windows XP 以前でのみサポートされています。 代わりに Windows Search を使用してください。]
シェルでは、ユーザーがファイルやプリンターなどの名前空間オブジェクトを検索できる検索ユーティリティがいくつかサポートされています。 カスタム検索エンジンを作成し、検索ハンドラーを実装して登録することで、ユーザーが使用できるようになります。
シェル拡張ハンドラーを実装および登録するための一般的な手順については、「シェル拡張ハンドラーの作成」を参照してください。 このドキュメントでは、検索ハンドラーに固有の実装の側面に焦点を当てています。
検索ハンドラーのしくみ
ユーザーによる検索エンジンの選択には 2 つの方法があります。 最初の方法は、スタート メニューから開始します。 Windows 2000 以前のシステムでは、[スタート] メニューで [検索] コマンドを選択すると、使用可能な検索エンジンのサブメニューが表示されます。 Windows 2000 以降では、[スタート] メニューの [検索] コマンドの名前が [検索] に変更されました。 次の図は、Windows XP システムの [検索] ボタンを示しています。
ユーザーは Windows Explorer から検索を開始することもできます。 Windows 2000 以前のシステムでは、[ツール] メニューの [検索] コマンドをクリックすると、[スタート] メニューに関連付けられているメニューと基本的に同じメニューが表示されます。 ただし、Windows 2000 版 Windows Explorer では、検索エンジンはまったく異なる方法で処理されます。 [ツール] メニューのサブメニューとして検索エンジンを処理する代わりに、ツール バーに [検索] ボタンが表示されるようになりました。 このボタンをクリックすると、エクスプローラー バーの [検索] ウィンドウが開きます。 次の図は、[ファイルとフォルダーの検索] 検索ウィンドウを示しています。
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}) に設定し、次のサブキーを作成します。
- ハンドラー名サブキーの下に 0 (ゼロ) サブキーを作成し、その既定値をメニュー テキストに設定します。
- メニュー テキストの横にアイコンを表示するには、0 の下に DefaultIcon サブキーを作成し、その既定値をアイコンのパスとインデックスに設定します。
- 0 の下に SearchGUID サブキーを作成します。 DHTML ドキュメントに GUID を割り当て、SearchGUID の既定値をその文字列形式に設定します。 この GUID は、HKEY_CLASSES_ROOT\CLSID の下に登録する必要はありません。
- SearchGUID の下に Url サブキーを作成します。 その既定値を、エクスプローラー バーに表示される HTML ドキュメントのパスに設定します。
- 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、またはスクリプト テクノロジを含めることができます。