扩展快捷菜单

右键单击对象通常会导致显示 快捷菜单。 此菜单包含一个命令列表,用户可以选择这些命令来对对象执行各种操作。 本部分介绍文件系统对象的快捷菜单。

此处提供了其他信息:

文件系统对象的快捷菜单

当用户右键单击在 Windows 资源管理器或桌面上显示的对象(如文件)时,将显示一个快捷菜单,其中包含命令列表。 然后,用户可以通过选择相应的命令对文件执行操作,例如打开或删除文件。

由于快捷菜单通常用于文件管理,因此 Shell 提供了一组默认命令,例如“剪切”和“复制”,这些命令显示在任何文件的快捷菜单上。 请注意,尽管“打开方式”是默认命令,但某些标准文件类型(如 .wav)不会显示该命令。 以下示例“我的文档”目录的插图(也用作 自定义图标中的示例)显示了通过右键单击 MyDocs4.xyz 显示的默认快捷菜单。

文件系统对象的默认快捷菜单的屏幕截图

MyDocs4.xyz 显示默认快捷菜单的原因是它不是已注册 文件类型的成员。 另一方面,.txt是已注册的文件类型。 如果右键单击其中一个.txt文件,将改为在其上半部分看到一个快捷菜单,其中包含两个附加命令: 打开打印

文件系统对象的自定义快捷菜单的屏幕截图

注册文件类型后,可以使用其他命令扩展其快捷菜单。 当右键单击该类型的任何文件时,它们将显示在默认命令的上方。 尽管以这种方式添加的大多数命令都是常见的命令(如 PrintOpen),但你可以随意添加用户可能认为有用的任何命令。

扩展文件类型的快捷菜单所需的只是为每个命令创建一个注册表项。 更复杂的方法是实现 快捷菜单处理程序,该处理程序允许逐个文件扩展文件类型的快捷菜单。 有关详细信息,请参阅 创建上下文菜单处理程序

快捷菜单谓词

快捷菜单上的每个命令都通过其 谓词在注册表中标识。 这些谓词与 ShellExecuteEx 在 以编程方式启动应用程序时使用的谓词相同。 有关 使用 ShellExecuteEx 的详细信息,请参阅 启动应用程序中的讨论。

谓词是 Shell 用来标识关联命令的简单文本字符串。 每个谓词对应于用于在控制台窗口或批处理 (.bat) 文件中启动命令的命令 字符串 。 例如, open 谓词通常启动一个程序以打开文件。 其命令字符串通常如下所示:

"My Program.exe" "%1"

“%1”是随文件名提供的命令行参数的标准占位符。 例如,它可以指定要在选项卡式视图中显示的特定页面。

注意

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

 

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

规范谓词

通常,应用程序负责为其定义的谓词提供本地化的显示字符串。 但是,为了提供一定程度的语言独立性,系统定义了一组常用的谓词,称为 规范谓词。 规范谓词可用于任何语言,系统自动生成正确本地化的显示字符串。 例如, 打开 谓词的显示字符串将在英语系统上设置为 Open,在德语系统上设置为 Öffnen。

规范谓词包括:

说明
打开 打开文件或文件夹。
opennew 在新窗口中打开文件或文件夹。
print 打印文件。
浏览 打开 Windows 资源管理器,其中选择了文件夹。
find 打开 Windows 搜索 对话框,其中文件夹设置为默认搜索位置。
openas 打开“ 打开工具 ”对话框。
properties 打开对象的属性表。

 

printto 谓词也是规范的,但永远不会显示。 它允许用户通过将文件拖动到打印机对象来打印文件。

扩展谓词

当用户右键单击对象时,快捷菜单包含所有普通谓词。 但是,你可能希望支持但尚未显示在每个快捷菜单上的命令。 例如,你可能拥有不常用的命令或面向有经验的用户的命令。 因此,还可以定义一个或多个 扩展谓词。 这些谓词也是字符串,类似于普通谓词。 它们与普通动词的注册方式不同。 若要有权访问与扩展谓词关联的命令,用户必须在按 SHIFT 键的同时右键单击对象。 然后,扩展的谓词将与普通谓词一起显示。

扩展文件类型的快捷菜单

扩展文件类型快捷菜单的最简单方法是使用注册表。 为此,请在与文件类型关联的应用程序的 ProgID 的项下方添加 Shell 子项。 (可选)可以通过使其成为 Shell 子项的默认值来定义文件类型的默认谓词

默认谓词首先显示在快捷菜单上。 其用途是向 Shell 提供在调用 ShellExecuteEx 但 未指定谓词时可以使用的谓词。 以这种方式使用 ShellExecuteEx 时,Shell 不一定选择默认谓词。 对于在 Windows 2000 及更高系统上找到的 Shell 版本 5.0 及更高版本,Shell 使用以下列表中的第一个可用谓词。 如果没有可用,则操作将失败。

  • 打开的谓词
  • 默认谓词
  • 注册表中的第一个谓词
  • openwith 谓词

对于 版本 5.0 之前的 Shell 版本,请省略第三项。

Shell 子项下,为要添加的每个谓词创建一个子项。 其中每个子项都将有一个 REG_SZ 值设置为谓词的显示字符串。 可以省略规范谓词的显示字符串,因为系统将自动显示正确本地化的字符串。 如果省略非规范谓词的显示字符串,则会显示谓词字符串。 对于每个谓词子项,创建一个 命令 子项,默认值设置为命令字符串。

下图显示了文件类型和自定义图标中使用的 .myp 文件类型的快捷菜单。 它现在在其快捷菜单上具有 open、doit、print 和 printto 谓词,其中 doit 作为默认谓词。 快捷菜单如下所示。

自定义快捷菜单的屏幕截图

用于扩展上图所示快捷菜单的注册表项包括:

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
   MyProgram.1
      (Default) = MyProgram Application
      Shell
         (Default) = doit
         open
            command
               (Default) = C:\MyDir\MyProgram.exe "%1"
         doit
            (Default) = &Do It
            command
               (Default) = C:\MyDir\MyProgram.exe /d "%1"
         print
            command
               (Default) = C:\MyDir\MyProgram.exe /p "%1"
         printto
            command
               (Default) = C:\MyDir\MyProgram.exe /p "%1" "%2" %3 %4

尽管 “打开方式” 命令位于第一个分隔符上方,但它是由系统自动创建的,不需要注册表项。 系统会自动为打开和打印的规范谓词创建显示名称。 由于 doit 不是规范谓词,因此会为其分配一个显示名称“&Do It”,可通过按 D 键进行选择。 printto 谓词不会显示在快捷菜单上,但包含它允许用户通过将文件放在打印机图标上来打印文件。 在此示例中,%1 表示文件名,%2 表示打印机名称。

可以通过策略设置将 SuppressionPolicy 值添加到谓词的键来禁止显示谓词。 将 SuppressionPolicy 的值设置为策略 ID。 如果启用策略,则取消谓词及其关联的快捷菜单项。 有关可能的策略 ID 值,请参阅 RESTRICTIONS 枚举。

扩展预定义 Shell 对象的快捷菜单

许多预定义的 Shell 对象都有可扩展的快捷菜单。 注册命令的方式与注册典型文件类型的方式大致相同,但使用预定义对象的名称作为文件类型名称。

可以在创建 Shell 扩展处理程序预定义 Shell 对象部分找到预定义对象的列表。 那些可以通过在注册表中添加谓词来扩展其快捷菜单的预定义 Shell 对象在表中标有“谓词”。

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

本文档的前面部分讨论了如何为特定文件类型定义快捷菜单项。 除其他事项外,通过定义快捷菜单,可以指定关联的应用程序如何打开文件类型的成员。 但是,如 文件类型中所述,应用程序还可以注册一个单独的默认过程,当用户尝试使用应用程序打开您未与应用程序关联的文件类型时使用。 此处讨论本主题是因为注册默认过程的方式与注册快捷菜单项的方式大致相同。

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

若要注册默认过程,请将为应用程序的 ProgID 创建的相同注册表项放在应用程序的子项“\HKEY_CLASSES_ROOT应用程序”下。 还可以包含 FriendlyAppName 值,为系统提供应用程序的友好名称。 应用程序的友好名称也可以从其可执行文件中提取,但前提是缺少 FriendlyAppName 值。 以下注册表片段显示了MyProgram.exe的示例默认过程,该过程定义一个友好名称和多个快捷菜单项。 命令字符串包含 /a 标志,用于通知应用程序它正在打开任意文件类型。 如果包含 DefaultIcon 子项,则应使用通用图标。

HKEY_CLASSES_ROOT
   Applications
      MyProgram.exe
         FriendlyAppName = Friendly Name
         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" %3 %4

扩展新子菜单

当用户在 Windows 资源管理器中打开“ 文件 ”菜单时,第一个命令为 “新建”。 选择此命令将显示一个子菜单。 默认情况下,它包含两个命令“文件夹”和“快捷方式”,允许用户创建子文件夹和快捷方式。 此子菜单可以扩展为包含任何文件类型的文件创建命令。

若要将文件创建命令添加到 “新建 ”子菜单,应用程序的文件必须具有与之关联的 文件类型 。 在文件扩展名的 项下包括 ShellNew 子项。 选择“ 文件” 菜单的“ 新建 ”命令后,Shell 会将其添加到“ 新建 ”子菜单。 命令的显示字符串将是分配给程序的 ProgID 的描述性字符串。

将一个或多个数据值分配给 ShellNew 子项以指定文件创建方法。 可用值如下所示。

说明
命令 执行应用程序。 这是一个 REG_SZ 值,用于指定要执行的应用程序的路径。 例如,可以将其设置为启动向导。
数据 创建包含指定数据的文件。 数据是文件 数据的REG_BINARY 值。 如果指定了 NullFile 或 FileName,则忽略数据。
FileName 创建一个文件,该文件是指定文件的副本。 FileName 是 一个REG_SZ 值,设置为要复制的文件的完全限定路径。
NullFile 创建一个空文件。 未为 NullFile 分配值。 如果指定了 NullFile,则忽略 Data 和 FileName 值。

 

下图显示了在“文件类型”和“自定义图标”中用作示例的 .myp 文件类型的“新建”子菜单。 它现在有一个命令 MyProgram Application。 当用户从“新建”子菜单中选择“MyProgram 应用程序”时,Shell 会创建一个名为“New MyProgram Application.myp”的文件,并将其传递给MyProgram.exe。

自定义新菜单的屏幕截图

注册表项现在如下所示:

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
      MyProgram.1
         ShellNew
            NullFile
   MyProgram.1
      (Default) = MyProgram Application
      DefaultIcon
         (Default) = C:\MyDir\MyProgram.exe,2
      Shell
         (Default) = doit
         open
            command
               (Default) = C:\MyDir\MyProgram.exe "%1"
         doit
            (Default) = &Do It
            command
               (Default) = C:\MyDir\MyProgram.exe /d "%1"
         print
            command
               (Default) = C:\MyDir\MyProgram.exe /p "%1"
         printto
            command
               (Default) = C:\MyDir\MyProgram.exe /p "%1" "%2" %3 %4