了解 Shell 命名空间扩展

Windows 资源管理器提供 Shell 命名空间的图形表示形式,并结合允许用户与 Shell 对象交互的工具。 使用命名空间扩展,你可以获取任何数据主体,并让 Windows 资源管理器将其作为虚拟文件夹呈现给用户。 当用户浏览到此文件夹时,你的数据会显示为文件夹和文件的树状层次结构,就像 Shell 命名空间的其余部分一样。 用户和应用程序能够以与任何其他命名空间对象相同的方式与此虚拟文件夹的内容进行交互。 本文档讨论如何创建命名空间扩展。

命名空间扩展的工作原理

在后台,Windows 资源管理器显示的每个文件夹都由组件对象模型 (COM) 名为 文件夹对象的对象表示。 每次用户与文件夹或其内容交互时,Shell 都会通过多个标准接口之一与关联的文件夹对象进行通信。 然后,文件夹对象执行响应用户操作所需的一切操作,Shell 会更新 Windows 资源管理器显示。

用户与之交互的大多数文件和文件夹都是文件系统或系统虚拟文件夹(如回收站)的一部分。 其他文档讨论了如何通过修改注册表或实现 Shell 扩展处理程序来自定义这些标准文件夹的行为以满足应用程序的要求。 但是,如果信息可以以普通文件系统文件或文件夹的形式轻松打包,则以这些方式扩展 Shell 最有用。

在很多情况下,将数据存储为文件系统文件夹和文件的集合可能不可取,甚至不可能。 此类数据的一些示例包括:

  • 最有效地打包在单个文件中的项的集合,例如数据库。
  • 存储在没有标准 Windows 文件系统的远程计算机上的项的集合。 此类数据的一个示例是存储在个人数字助手 (PDA) 或数码相机上的信息。
  • 不表示存储数据的项的集合。 此类数据的一个示例是标准“打印机”文件夹包含的打印机链接。

向用户呈现此类数据的一种方法是编写应用程序,以允许用户查看各种项并与之交互。 但是,如果数据可以显示为文件夹/文件层次结构,则需要实现的大部分功能可能是 Windows 资源管理器已提供的用户界面服务。 更高效的方法是编写命名空间扩展,让 Windows 资源管理器成为你的 GUI。

若要实现命名空间扩展,必须将信息组织为树状结构的命名空间。 命名空间根在 Shell 命名空间中显示为虚拟文件夹。 根文件夹及其所有子文件夹和数据项将成为 Shell 命名空间的一部分,Windows 资源管理器将成为用户界面。 因此,你可以以熟悉且易于访问的方式向用户显示你的信息,UI 编程比自定义应用程序所需的要少得多。

命名空间扩展由两个基本组件组成:

  • 数据管理器
  • 数据管理器与 Windows 资源管理器之间的接口

列表中的第一个组件完全由你决定。 你可以以最有效的任何方式存储和管理数据。 第二个组件是将数据打包为文件夹对象并处理与 Windows 资源管理器交互所需的代码。 然后,Windows 资源管理器可以调用这些对象,以允许用户查看你的数据并与之交互,就像数据是文件夹和文件的集合一样。 命名空间扩展的文件夹对象必须与 Windows 资源管理器交互,就像它们是普通文件夹一样。 在尝试实现命名空间扩展之前,必须先了解 Windows 资源管理器如何处理文件夹对象。

默认系统文件夹视图对象 (DefView)

Shell 提供文件夹视图的默认实现(俗称 DefView),因此你可以避免实现自己的命名空间扩展的大部分工作。 由于某些视图功能无法通过自定义视图实现,因此通常建议使用默认的系统文件夹视图对象来代替自定义视图。 有关详细信息,请参阅 SHCreateShellFolderView

Windows 资源管理器如何与命名空间扩展交互

Windows 资源管理器为用户提供了一个 GUI,允许用户执行各种任务,包括:

  • 导航 命名空间层次结构并查看文件夹的内容。
  • 通过移动、删除和复制对象来管理命名空间的内容。
  • 检索 有关对象的各种信息。
  • 启动 应用程序。

Windows 资源管理器 GUI 有五个基本组件。 下图为组件命名,并显示它们通常在 Windows 资源管理器中显示的位置。

显示 Windows 资源管理器用户界面组件的插图

当用户在 Windows 资源管理器中显示属于命名空间扩展的文件夹时,文件夹对象至少可以部分控制所有五个区域的内容。

树视图

树视图提供命名空间的高级视图。 此区域承载一个 树视图控件 ,该控件可以显示每个命名空间文件夹和文件夹在命名空间层次结构中的位置。 用户可以使用树视图区域执行多个操作,包括:

  • 在命名空间中显示或隐藏下一个级别。
  • 复制、移动或删除文件夹。
  • 右键单击文件夹以显示快捷菜单。
  • 选择文件夹并在文件夹视图中查看其内容。

树视图主要通过其 IShellFolder 接口与文件夹对象通信。 例如,当用户单击文件夹图标旁边的加号 (+) 时,Windows 资源管理器会展开显示以显示文件夹的子文件夹。 为了获取更新树视图所需的信息,Shell 对文件夹对象的 IShellFolder 接口进行多次调用,以便:

  • 请求文件夹的属性。
  • 枚举文件夹的内容。
  • 请求每个子文件夹的显示名称。
  • 请求在每个文件夹旁边显示一个图标。

然后,Windows 资源管理器更新树视图以显示所选文件夹的子文件夹。 如果子文件夹具有子文件夹,则其文件夹图标旁边会显示一个“+”字符。 用户还可以使用树视图执行许多更复杂的任务,包括:

  • 使用剪贴板剪切或复制文件夹并将其粘贴到另一个文件夹中。
  • 使用拖放功能剪切或复制文件夹并将其放在另一个文件夹上。
  • 使用搜索引擎搜索文件夹或其子文件夹中的项目。
  • 修改文件夹的属性。

有关命名空间扩展如何处理这些用户操作的更详细讨论,请参阅 实现基本文件夹对象接口

文件夹视图

当用户选择文件夹时,文件夹的内容将显示在文件夹视图中。 文件夹视图的正常功能在某种程度上与树视图重叠。 用户可以移动或复制文件夹、更改文件夹属性、查看子文件夹的内容、显示文件夹的快捷菜单等。 但是,树视图和文件夹视图之间存在一些明显的差异:

  • 文件夹视图仅显示单个文件夹的内容,而不显示命名空间层次结构的一部分或全部内容。
  • 文件夹视图显示文件对象和文件夹对象。
  • 与树视图相比,文件夹视图可以显示更多有关对象的信息。
  • 文件夹视图允许命名空间扩展几乎完全控制显示哪些信息以及如何显示。 只能修改树视图的次要方面,例如文件夹图标。

与树视图不同,Windows 资源管理器不直接控制文件夹视图的内容。 文件夹视图是 Windows 资源管理器提供给文件夹对象的区域。 文件夹对象负责在文件夹视图中显示和管理文件夹的内容。 尽管大多数文件夹视图采用相当标准的格式,但实际上对可以显示的内容或显示方式几乎没有限制。 Internet 文件夹是一个极端情况,它是一个功能齐全的浏览器。

当用户选择属于命名空间扩展的文件夹时,你将创建一个窗口,并将其句柄传递给 Windows 资源管理器。 此窗口将成为文件夹视图窗口的子窗口。 Windows 资源管理器提供文件夹视图窗口的尺寸,但对子窗口的内容没有限制。 然后,可以使用子窗口显示文件夹的文件夹视图。

命名空间扩展使用以下两种方法之一来创建文件夹视图:

  • 使用子窗口托管 列表视图 控件。 此控件允许你以与 Windows 资源管理器 经典视图大致相同的方式显示文件夹的内容。
  • 使用子窗口托管 WebBrowser 控件 ,并使用动态 HTML (DHTML) 文档显示文件夹的内容。

这两种方法都显示一个文件夹视图,该视图看起来非常类似于系统文件夹显示的文件夹视图。 但是,如果要使用不同的显示方案,可以随意执行此操作。

与大多数 Windows 应用程序一样,Windows 资源管理器为用户提供了一系列工具。 可通过菜单栏获得完整的工具选择。 更常用的工具也由工具栏上的按钮或编辑框表示。 与许多 Windows 应用程序不同,Windows 资源管理器菜单栏实际上是一个 工具栏控件 ,它已自定义为像传统菜单一样的行为。 菜单栏和工具栏都合并到 rebar 控件 中,允许用户组织各个控件以满足其需求。

默认情况下,Windows 资源管理器支持一组标准按钮和菜单项,例如“复制”和“属性”。 命名空间扩展可以通过删除标准工具和添加自定义工具来自定义菜单栏和工具栏。 初始化文件夹视图对象时,Windows 资源管理器会将指针传递到其 IShellBrowser 接口。 此接口支持多种方法,你可以调用这些方法来自定义菜单栏和工具栏。 当用户选择自定义菜单项或工具栏按钮之一时,Windows 资源管理器会将自定义菜单和工具栏项WM_COMMAND消息转发到子窗口的窗口过程。

状态栏

Windows 资源管理器状态栏显示有关当前所选对象的信息。 命名空间扩展可以使用状态栏显示状态信息,例如文本字符串。 可以通过调用 IShellBrowser 自定义状态栏。