创建搜索处理程序

[只有 Windows XP 或更低版本才支持此功能。 请改用 Windows Search。]

Shell 支持多个搜索实用工具,供用户查找命名空间对象,例如文件或打印机。 你可以创建自定义搜索引擎,并通过实现和注册搜索处理程序使它可供用户使用。

创建 Shell 扩展处理程序中讨论了实现和注册 Shell 扩展处理程序的一般过程。 本文档重点介绍特定于搜索处理程序的实现方面的内容。

搜索处理程序的工作原理

用户可以通过两种方式选择搜索引擎。 第一种方法是从“开始”菜单。 在低于 Windows 2000 的系统上,选择“开始”菜单上的“查找”命令将显示可用搜索引擎的子菜单。 在 Windows 2000 及更高版本的系统上,“开始”菜单的“查找”命令改名为“搜索”。 下图显示了 Windows XP 系统上的“搜索”按钮。

the start menu's search submenu

用户还可以从 Windows 资源管理器启动搜索。 在低于 Windows 2000 的系统上,单击“工具”菜单上的“查找”命令,将显示与“开始”菜单关联的菜单实质上相同的菜单。 然而,Windows 2000 的 Windows 资源管理器以一种截然不同的方式管理搜索引擎。 该版本的工具栏上有一个“搜索”按钮,而不是将搜索引擎作为“工具”菜单的子菜单来管理。 单击此按钮将打开资源管理器栏的“搜索”窗格。 下图显示了“搜索文件和文件夹”搜索窗格。

the windows explorer bar's search pane

Windows 2000 和更低版本的系统管理影响实现和注册的搜索处理程序的方式存在许多差异。

Windows 2000 之前 Windows 2000 及更高版本
搜索处理程序实现为一种快捷菜单处理程序 搜索处理程序可以实现为快捷菜单处理程序,也可以作为动态 HTML (DHTML) 文档实现。
搜索处理程序可以是静态的,也可以是动态的。 仅当用户选择静态处理程序时,才会加载静态处理程序。 动态处理程序由 Shell 在启动时加载,直到 Shell 退出才会终止。 作为快捷菜单处理程序实现的处理程序可以是静态,也可以是动态的。 作为 DHTML 文档实现的处理程序必须是静态的。
搜索处理程序位于“开始”菜单的“查找”子菜单和 Windows 资源管理器“工具”菜单的“查找”子菜单中。 搜索处理程序仅位于“开始”菜单的“搜索”子菜单中。 若要通过 Windows 资源管理器菜单栏提供自定义搜索窗格,必须将其作为区对象实现。 然后,它将列在 Windows 资源管理器“视图”菜单的“资源管理器栏”子菜单中。

 

注册搜索处理程序

在文件类型的 FindExtensions 子项下注册搜索处理程序。

HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows
            CurrentVersion
               Explorer
                  FindExtensions

此后的注册过程将取决于处理程序是静态的还是动态的。 有关如何注册 Shell 扩展处理程序的一般讨论,请参阅创建 Shell 扩展处理程序

注册静态搜索处理程序

仅当用户启动静态搜索处理程序时,才会加载静态搜索处理程序。 此方法最适合小型且可以快速加载的 DLL。 如果使用 DHTML 实现处理程序,则必须是静态处理程序。 若要注册静态扩展处理程序,请在 FindExtensions 子项的 Static 子项下为处理程序创建一个命名的子项。 系统不使用该名称,但它不能与 FindExtensions 子项下的其他搜索处理程序名称相同。

基于快捷菜单的搜索处理程序

如果处理程序作为快捷菜单处理程序实现,则将处理程序名称子项的默认值设置为对象的类标识符 (CLSID) GUID。 在处理程序的名称子项下,创建一个名为“0”(零)的子项,并将其默认值设置为将在“搜索”或“查找”子菜单中显示的字符串。 可以通过在快捷字符前加上与号 (&) 来按常规方式启用键盘快捷方式。 可以通过在“0”子项下创建一个 DefaultIcon 子项,在菜单文本右侧显示可选小图标。 将该子项的默认值设置为一个字符串,其中包含以下内容:包含图标的文件的路径,后跟逗号,后跟图标的从零开始的索引。

以下示例注册 MySearchEngine 搜索处理程序。 菜单文本为“我的搜索引擎”,M 指定为快捷键。 图标位于 C:\MyDir\MySearch.dll 中,索引为 2。

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 资源管理器,并打开资源管理器栏以搜索文档。 还可以指定显示在资源管理器栏右侧的 DHTML 文档。 无法从默认的“搜索”窗格启动不同的处理程序。 搜索引擎可以直接从 Windows 资源管理器启动,但前提是它们作为区对象实现。

若要注册基于 DHTML 的搜索处理程序,请将处理程序的名称子项设置为 CLSID_ShellSearchExt 的字符串形式(当前 {169A0691-8DF9-11d1-A1C4-00C04FD75D13})并创建以下子项。

  1. 在处理程序名称子项下创建一个“0”(零)子项,并将其默认值设置为菜单文本。
  2. 若要在菜单文本旁边显示图标,在“0”下创建 DefaultIcon 子项,并将其默认值设置为图标的路径和索引。
  3. 在“0”下创建 SearchGUID 子项。 将 GUID 分配给 DHTML 文档,并将 SearchGUID 的默认值设置为其字符串形式。 此 GUID 不需要在 HKEY_CLASSES_ROOT\CLSID 下注册。
  4. 在 SearchGUID 下创建 Url 子项。 将该子项的默认值设置为将在资源管理器栏中显示的 HTML 文档的路径。
  5. 在 SearchGUID 下创建 UrlNavNew 子项。 将该子项的默认值设置为将在资源管理器栏右侧显示的 HTML 文档的路径。

以下示例注册作为 DHTML 文档实现的 MySearchEngine 搜索处理程序。 菜单文本为“我的搜索引擎”,快捷键指定为 M。 图标位于 C:\MyDir\MySearch.dll 中,索引为 2。 资源管理器栏的 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

注册动态搜索处理程序

如果处理程序作为快捷菜单处理程序实现,则还可以将其注册为动态处理程序。 在这种情况下,它将通过 Shell 加载,并且仅在 Shell 退出时终止。 当用户启动动态搜索处理程序时,动态搜索处理程序的响应速度要比静态处理程序快得多。 如果处理程序的 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

与静态搜索处理程序不同,无需指定注册表中的菜单文本。 加载处理程序后,Shell 将调用处理程序的 IContextMenu::QueryContextMenu 方法,将项添加到“查找”或“搜索”子菜单。

实现搜索处理程序

搜索处理程序可以作为所有版本的 Windows 的快捷菜单处理程序实现。 对于 Windows 2000,它们也可以作为 DHTML 文档实现。

有关如何实现快捷菜单处理程序的一般讨论,请参阅创建快捷菜单处理程序。 搜索处理程序与标准快捷菜单处理程序只有几处不同。

对于静态菜单处理程序,“查找”或“搜索”子菜单是根据注册表中的信息创建的。 不需要像普通快捷菜单处理程序那样让处理程序添加菜单项。 Shell 按以下方式管理静态菜单处理程序。

  • 当用户启动处理程序的菜单项时,Shell 将加载处理程序的 DLL 并调用 IContextMenu::InvokeCommand 以通知处理程序启动搜索引擎。 不调用 IShellExtInit::InitializeIContextMenu::QueryContextMenu 方法。
  • 调用 IContextMenu::InvokeCommand 时,传入的 CMINVOKECOMMANDINFO 结构的 lpVerb 成员标识命令。 lpVerb 的低序位字设置为命令的子项名称的等效数字。 由于此子项通常命名为 0,因此 lpVerb 通常设置为零。 然后,处理程序应启动搜索引擎。

动态搜索处理程序的实现方式与普通快捷菜单处理程序大致相同。 主要例外情况是,当调用 IShellExtInit::Initialize 时,pidlFolderlpdobj 参数设置为 NULL。

基于 DHTML 的搜索处理程序作为常规 DHTML 文档实现。 它们可以包括 Windows Internet Explorer 支持的任何 HTML、DHTML 或脚本技术。