使用 Shell 扩展添加图标和上下文菜单
注意
Windows 桌面搜索 2.x 是一项过时的技术,最初作为 Windows XP 和 Windows Server 2003 的加载项提供。 在更高版本中,请改用 Windows 搜索 。
通过实现 Shell 扩展,可以使用 Microsoft Windows 桌面搜索 (WDS) 和协议处理程序来改善用户体验。 如果不进一步扩展,创建的协议处理程序将不包括以下用户体验:
- WDS 不会显示结果的特定图标。
- 当用户双击某个项时,用户界面不会响应事件。
- 当用户右键单击某个项时,上下文菜单将不支持该项的任何操作。
IShellFolder 需要最少的 IPersist 和 IPersistFolder 实现,IContextMenu 和 IExtractIcon 需要最少的 IShellFolder 实现,这两个接口可提供更无缝的用户体验。
IPersist
IPersist 接口定义单个方法 GetClassID,该方法旨在提供可以持久存储在系统中的 对象的 CLSID。
方法 | 说明 |
---|---|
GetClassID () | 返回协议处理程序的 ClassID |
注意
应为 IPersist、IPersistFolder 和 IShellFolder 实现相同的 CLSID。
IPersistFolder
IPersistFolder 接口用于初始化 Shell 文件夹对象。 此接口的实现派生自 IPersist,是告知文件夹在 Shell 命名空间中的位置的方式。
方法 | 说明 |
---|---|
Initialize() | 指示 Shell 文件夹对象根据传递的信息初始化自身,并返回S_OK |
注意
应为 IPersist、IPersistFolder 和 IShellFolder 实现相同的 CLSID。
不直接使用此接口。 初始化 Shell 文件夹对象时,它由 IShellFolder::BindToObject 接口的文件系统实现使用。
IShellFolder
IShellFolder 接口用于管理文件夹,需要部分实现,以便为协议处理程序实现的图标和上下文接口在 Windows 桌面搜索结果用户界面中正确运行。 所需的大部分功能都通过 GetUIObjectOf 方法公开。 此方法允许外接程序查询 IExtractIcon 和 IContextMenu 接口。
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、IPersistFolder 和 IShellFolder 实现相同的 CLSID。
IShellFolder 不用于枚举文件夹。 这意味着文件夹的显示名称将是物理 URL。 在将来,这可能会有变化。
IContextMenu
当 WDS 向用户显示结果时,用户可以右键单击项并查看 由 IContextMenu 界面定义的上下文菜单。
上下文菜单上的默认操作与双击项时执行的操作相同。 如果没有项的相应 IShellFolder 或 IContextMenu 接口,双击事件的默认行为是将 URL 作为参数传递给 ShellExecute 函数。
IExtractIcon
IExtractIcon 根据协议处理程序提供的 PIDL 中的 URL 检索 WDS 用户界面的图标。
代码示例
自定义协议处理程序用户界面示例代码演示了 IShellFolder 和支持接口的实现,包括对操作 PIDL 的支持。
相关主题