谓词和文件关联

当用户右键单击 Shell 对象(如文件)时,Shell 会显示 (上下文) 菜单的快捷方式。 此菜单包含一个命令列表,用户可以选择这些命令对项执行各种操作。 这些命令也称为快捷菜单项或谓词。 可以自定义快捷菜单。

本主题的组织方式如下:

文件系统对象的快捷菜单简介

由于快捷菜单通常用于文件管理,因此 Shell 提供了一组默认命令,例如 剪切复制,这些命令显示在任何文件系统对象(如文件或文件夹)的快捷菜单上。

以下示例演示了通过右键单击 MyFile.xyz-ms 显示的默认快捷菜单。

默认快捷菜单的屏幕截图

出现 MyFile.xyz-ms 的默认快捷菜单的原因是 .xyz-ms 不是已注册文件类型的成员。 相比之下, .txt 是已注册的文件类型。 如果右键单击 .txt 文件,则在其上半部分会看到一个快捷菜单,其中包含三个附加命令: 打印编辑打开方式

具有已注册文件类型的文件的快捷菜单的屏幕截图

若要扩展文件类型的快捷菜单,必须为每个命令创建一个注册表项。 更复杂的方法是实现快捷菜单 (谓词) 处理程序,这样就可以逐个文件扩展文件类型的快捷菜单。 有关详细信息,请参阅 创建上下文菜单处理程序上下文菜单引用

将命令添加到快捷菜单

快捷菜单处理程序是将命令添加到现有快捷菜单的文件类型处理程序。 快捷菜单处理程序与文件类型相关联,每当显示类成员的快捷菜单时,将调用这些处理程序。 Shell 检查注册表以查看文件类型是否与任何快捷菜单处理程序相关联。 如果是,Shell 会查询处理程序以获取其他快捷菜单项。

快捷菜单谓词

快捷菜单上的每个命令在注册表中由其谓词标识。 这些谓词与 ShellExecuteEx 在 以编程方式启动应用程序时使用的谓词相同。

谓词是 Shell 用来标识关联命令的简单文本字符串。 每个谓词对应于用于在控制台窗口或批处理 (.bat) 文件中启动命令的命令字符串。

例如,open 谓词通常会启动一个程序来打开文件。 命令字符串通常如下所示:

"My Program.exe" "%1"

如果命令字符串的任何元素包含或可能包含空格,则必须将其括在引号中。 否则,如果元素包含空格,则它将无法正确分析。 例如, “我的Program.exe” 会正确启动应用程序。 如果使用不带引号的 My Program.exe,则系统会尝试使用 Program.exe 作为其第一个命令行参数来启动 My。 应始终将引号与 Shell 扩展为字符串的参数 (例如“%1”)一起使用,因为无法确定该字符串不会包含空格。

谓词还可以具有与其关联的显示名称,该名称显示在快捷菜单上,而不是谓词字符串本身。 例如,openas 的显示字符串为 Open With。 与普通菜单字符串一样,在显示字符串中包含和号字符允许键盘选择命令。

流式传输非文件系统项和 OpenSearch 结果。

在 Windows 7 及更高版本中,支持通过 OpenSearch 协议将外部源连接到 Windows 客户端。 这允许用户在 Windows 资源管理器中搜索远程数据存储并查看结果。 OpenSearch v1.1 标准定义了简单的文件格式,可用于描述客户端应如何查询 Web 服务以获取数据存储,以及服务应如何返回要由客户端呈现的结果。

对于 OpenSearch 结果,可能需要流式处理非文件系统项,以免需要下载项目。 联合搜索功能允许从支持 OpenSearch 的非文件系统位置(例如 SharePoint 和其他 Web 服务支持的网站)中搜索项。 在这些项目上调用谓词时,系统会下载该项的临时版本,并将其传递给谓词实现。 建议谓词实现者通过注册谓词支持的用于流式传输项的 URL 架构集来避免下载文件。 谓词通过使用 SupportedProtocols 注册表项执行此操作。

注册应用程序以处理任意文件类型

通过为特定文件类型定义快捷菜单项,可以指定关联的应用程序如何打开该文件类型的成员。 但是,应用程序还可以注册一个单独的默认过程,当用户尝试使用应用程序打开与应用程序无关的文件类型时使用。 注册默认过程的方式与注册快捷菜单项的方式大致相同。 有关定义快捷菜单项的更多详细信息,请参阅 创建上下文菜单处理程序

默认过程有两个基本目的。 一种是指定应如何调用应用程序以打开任意文件类型。 例如,可以使用命令行标志来指示正在打开未知文件类型。 另一个用途是定义文件类型的各种特征,例如快捷菜单项和图标。 如果用户将应用程序与其他文件类型相关联,该类将具有这些特征。 如果其他文件类型以前与另一个应用程序相关联,则这些特征将替换原始文件。

若要注册默认过程,请将为应用程序的 ProgID 创建的相同注册表项放在应用程序的子项 HKEY_CLASSES_ROOT\Applications下。 还可以包含 FriendlyAppName 值,为系统提供应用程序的友好名称。 也可以从其可执行文件中提取应用程序的友好名称,但前提是缺少 FriendlyAppName 值。

以下示例注册表项演示了定义友好名称和多个快捷菜单项 MyProgram.exe 的默认过程。 命令字符串包含 /a 标志,用于通知应用程序它正在打开任意文件类型。 如果包含 DefaultIcon 子项,则应使用泛型图标。

HKEY_CLASSES_ROOT
   MyProgram.exe
      shell
         open
            command
               (Default) = C:\MyDir\MyProgram.exe /a "%1"
         print
            command
               (Default) = C:\MyDir\MyProgram.exe /a /p "%1"
         printto
            command
               (Default) = C:\MyDir\MyProgram.exe /a /p "%1" "%2"

其他资源

快捷菜单处理程序和多选谓词的最佳做法

为快捷菜单选择静态或动态谓词

创建快捷菜单处理程序

使用动态谓词自定义快捷菜单

快捷键 (上下文) 菜单和快捷菜单处理程序

快捷菜单参考