使用 Shell 扩展添加图标和上下文菜单

注意

Windows 桌面搜索 2.x 是一项过时的技术,最初作为 Windows XP 和 Windows Server 2003 的加载项提供。 在更高版本中,请改用 Windows 搜索

通过实现 Shell 扩展,可以使用 Microsoft Windows 桌面搜索 (WDS) 和协议处理程序来改善用户体验。 如果不进一步扩展,创建的协议处理程序将不包括以下用户体验:

  • WDS 不会显示结果的特定图标。
  • 当用户双击某个项时,用户界面不会响应事件。
  • 当用户右键单击某个项时,上下文菜单将不支持该项的任何操作。

IShellFolder 需要最少的 IPersistIPersistFolder 实现,IContextMenuIExtractIcon 需要最少的 IShellFolder 实现,这两个接口可提供更无缝的用户体验。

 

IPersist

IPersist 接口定义单个方法 GetClassID,该方法旨在提供可以持久存储在系统中的 对象的 CLSID。

方法 说明
GetClassID () 返回协议处理程序的 ClassID

 

注意

应为 IPersist、IPersistFolderIShellFolder 实现相同的 CLSID

 

 

IPersistFolder

IPersistFolder 接口用于初始化 Shell 文件夹对象。 此接口的实现派生自 IPersist,是告知文件夹在 Shell 命名空间中的位置的方式。

方法 说明
Initialize() 指示 Shell 文件夹对象根据传递的信息初始化自身,并返回S_OK

 

注意

应为 IPersist、IPersistFolderIShellFolder 实现相同的 CLSID

 

不直接使用此接口。 初始化 Shell 文件夹对象时,它由 IShellFolder::BindToObject 接口的文件系统实现使用。

 

IShellFolder

IShellFolder 接口用于管理文件夹,需要部分实现,以便为协议处理程序实现的图标和上下文接口在 Windows 桌面搜索结果用户界面中正确运行。 所需的大部分功能都通过 GetUIObjectOf 方法公开。 此方法允许外接程序查询 IExtractIconIContextMenu 接口。

IShellFolder 接口使用 PIDL 而不是 URL。 与完整命名空间扩展的要求不同,外接程序可以使用仅包含 URL 的简单 IDL 结构。

必须实现 IShellFolder 的以下方法。 请注意,其中五种方法只需最少的实现。

方法 说明
BindToObject () 返回E_NOTIMPL
BindToStorage () 返回E_NOTIMPL
CreateViewObject () 返回E_NOTIMPL
SetNameOf () 返回E_NOTIMPL
ParseDisplayName () 将 URL 转换为 PIDL 结构
CompareIDs () 比较两个 PIDL 值
GetDisplayNameOf () 返回 PIDL 的 URL
GetUIObjectOf () 此方法类似于 OLE COM QueryInterface 方法。 如果请求图标,则调用方请求IID_IExtractIcon;如果请求上下文菜单,则调用方请求IID_IContextMenu。

 

注意

应为 IPersist、IPersistFolderIShellFolder 实现相同的 CLSID

 

IShellFolder 不用于枚举文件夹。 这意味着文件夹的显示名称将是物理 URL。 在将来,这可能会有变化。

 

IContextMenu

当 WDS 向用户显示结果时,用户可以右键单击项并查看 由 IContextMenu 界面定义的上下文菜单。

上下文菜单上的默认操作与双击项时执行的操作相同。 如果没有项的相应 IShellFolderIContextMenu 接口,双击事件的默认行为是将 URL 作为参数传递给 ShellExecute 函数。

 

IExtractIcon

IExtractIcon 根据协议处理程序提供的 PIDL 中的 URL 检索 WDS 用户界面的图标。

 

代码示例

自定义协议处理程序用户界面示例代码演示了 IShellFolder 和支持接口的实现,包括对操作 PIDL 的支持。

参考

自定义协议处理程序用户界面示例代码

安装和注册协议处理程序