应用程序注册

本主题讨论应用程序如何公开启用某些方案所需的有关自身的信息。 这包括查找应用程序所需的信息、应用程序支持的谓词以及应用程序可以处理的文件类型。

本主题按如下所示进行组织:

注意

还可以在“设置程序访问”和“计算机默认值”(SPAD)和“设置默认程序”(SYDP)控制面板应用程序中注册应用程序。 有关 SPAD 和 SYDP 应用程序注册的信息,请参阅 文件关联和默认程序指南,以及 设置程序访问和计算机默认值(SPAD)

查找应用程序可执行文件

ShellExecuteEx 函数在其 lpFile 参数中使用可执行文件的名称调用时,函数查找该文件的位置有多种。 建议在 应用路径 注册表子项中注册应用程序。 这样做可以避免应用程序修改系统 PATH 环境变量。

该文件位于以下位置:

  • 当前工作目录。
  • Windows 目录(未搜索子目录)。
  • Windows\System32 目录。
  • PATH 环境变量中列出的目录。
  • 建议:HKEY_LOCAL_MACHINE\Software\Microsoft\windows\CurrentVersion\应用路径

注册应用程序

应用路径应用程序 注册表子项用于代表应用程序注册和控制系统的行为。 应用路径 子项是首选位置。

使用应用路径子项

在 Windows 7 及更高版本中,强烈建议你安装每个用户的应用程序,而不是每台计算机。 每个用户安装的应用程序可以在 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\应用路径下注册。 为计算机的所有用户安装的应用程序可以在 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\应用路径下注册。

应用路径 下找到的条目主要用于以下目的:

  • 将应用程序的可执行文件名称映射到该文件的完全限定路径。
  • 若要根据每个应用程序将信息预写到 PATH 环境变量,请根据每个进程。

如果 应用路径 的子项的名称与文件名匹配,则 Shell 执行两个作:

  • (默认)条目用作文件的完全限定路径。
  • 该子项的 Path 条目预写到该进程的 PATH 环境变量。 如果不需要,则可以省略 Path 值。

需要注意的潜在问题包括:

  • 命令行 Shell 的长度限制为 MAX_PATH * 2 个字符。 如果列出了许多文件作为注册表项或其路径很长,则列表中后面的文件名可能会丢失,因为命令行被截断。
  • 某些应用程序不接受命令行中的多个文件名。
  • 接受多个文件名的某些应用程序无法识别提供文件名的格式 Shell 。 该 Shell 参数列表以带引号的字符串的形式提供,但某些应用程序可能需要没有引号的字符串。
  • 并非所有可拖动的项都是文件系统的一部分;例如打印机。 这些项没有标准的 Win32 路径,因此无法提供有意义的 lpParameters 值来 ShellExecuteEx

使用 DropTarget 条目可通过提供对所有剪贴板格式的访问(包括 CFSTR_SHELLIDLIST(对于长文件列表)和 CFSTR_FILECONTENTS(对于非文件系统对象)来避免这些潜在问题。

若要使用应用路径子项注册和控制应用程序的行为,

  1. 将与可执行文件同名的子项添加到 应用路径 子项,如以下注册表项所示。

    HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER
       SOFTWARE
          Microsoft
             Windows
                CurrentVersion
                   App Paths
                      file.exe
                         (Default)
                         DontUseDesktopChangeRouter
                         DropTarget
                         Path
                         UseUrl
    
  2. 有关 应用路径 子项的详细信息,请参阅下表。

注册表项
(默认值) 应用程序的完全限定路径。 可以在 条目中或不使用其 .exe 扩展名声明应用程序名称。 如有必要,ShellExecuteEx 函数在搜索 应用路径 子项时添加扩展。 该条目是 REG_SZ 类型。
不要使用台式机更换路由器 调试程序应用程序必须避免在调试 Windows 资源管理器进程时出现文件对话框死锁。 但是,设置 DontUseDesktopChangeRouter 条目会稍微降低对更改通知的处理效率。 该条目是 REG_DWORD 类型,该值0x1。
DropTarget 是类标识符(CLSID)。 DropTarget 条目包含实现 IDropTarget的对象(通常是本地服务器而不是进程内服务器)的 CLSID。 默认情况下,当放置目标为可执行文件且未提供 DropTarget 值时,会将Shell已删除文件的列表转换为命令行参数,并通过 lpParameters 将其传递给 ShellExecuteEx
路径 提供一个字符串(以分号分隔的目录列表的形式)以在调用 ShellExecuteEx启动应用程序时追加到 PATH 环境变量。 它是 .exe的完全限定路径。 它 REG_SZ。 在 windows 7 及更高版本的 中,该类型可以 REG_EXPAND_SZ,并且通常 REG_EXPAND_SZ %ProgramFiles%。 注意: 除了 Shell 识别的(Default)、Path 和 DropTarget 条目之外,应用程序还可以向其可执行文件的 App Paths 子项添加自定义值。 我们鼓励应用程序开发人员使用 应用路径 子项来提供特定于应用程序的路径,而不是添加全局系统路径。
支持的协议 创建一个字符串,其中包含给定密钥的 URL 协议方案。 这可以包含多个注册表值,以指示支持哪些方案。 此字符串遵循 scheme1:scheme2的格式。 如果此列表不为空,文件: 将添加到字符串中。 定义 SupportedProtocols 时,隐式支持此协议。
UseUrl 指示应用程序可以接受命令行上的 URL(而不是文件名)。 可以直接从 Internet 打开文档的应用程序(如 Web 浏览器和媒体播放器)应设置此条目。
ShellExecuteEx 函数启动应用程序且未设置 UseUrl=1 值时,ShellExecuteEx 将文档下载到本地文件,并在本地副本上调用处理程序。
例如,如果应用程序设置了此条目,并且用户右键单击存储在 Web 服务器上的文件,则“打开 verb”选项将可用。 否则,用户必须下载该文件并打开本地副本。
UseUrl 条目的类型为 REG_DWORD,值为 0x1。
在 Windows Vista 及更早版本中,此项指示 URL 应连同本地文件名一起传递给应用程序,通过 ShellExecuteEx 调用。 在 Windows 7 中,它指示应用程序可以理解传递给它的任何 http 或 https URL,而无需提供缓存文件名。 此注册表项与 SupportedProtocols 键相关联。

使用应用程序子项

通过包含 HKEY_CLASSES_ROOT\应用程序\ApplicationName.exe 子项下的注册表项,应用程序可以提供下表中显示的特定于应用程序的信息。

注册表项 描述
shell\verb verb提供从 OpenWith 调用应用程序的方法。 verb如果没有此处指定的定义,系统假定应用程序支持 CreateProcess,并在命令行上传递文件名。 此功能适用于所有 verb 方法,包括 DropTarget、ExecuteCommand 和动态数据交换(DDE)。
默认图标 使应用程序能够提供特定图标来表示应用程序,而不是存储在 .exe 文件中的第一个图标。
友好应用名称 提供一种方法来获取应用程序显示的可本地化名称,而不只是显示的版本信息,这可能不可本地化。 ASSOCSTR 的关联查询 读取此注册表项值,然后回退以在版本信息中使用 FileDescription 名称。 如果缺少该名称,则关联查询默认为文件的显示名称。 应用程序应使用 ASSOCSTR_FRIENDLYAPPNAME 来检索此信息以获取正确的行为。
支持的类型 列出应用程序支持的文件类型。 这样,应用程序就可以在 “打开”对话框的级联菜单中列出。
NoOpenWith 指示未指定用于打开此文件类型的应用程序。 请注意,如果按文件类型为应用程序设置了 OpenWithProgIDs 子项,并且 ProgID 子项本身没有 NoOpenWith 条目,即使应用程序已指定 NoOpenWith 条目,该应用程序也会出现在推荐或可用应用程序列表中。 有关详细信息,请参阅 How to Include an Application in the Open With Dialog Box and How to exclude an Application from the Open with Dialog Box.
IsHostApp 指示进程是主机进程(如 Rundll32.exe 或 Dllhost.exe),不应考虑 “开始”菜单固定或包含在“最常用的”(MFU)列表中。 使用包含非 null 参数列表或显式 应用程序用户模型 ID(AppUserModelIDs)的快捷方式启动时,可以固定进程(作为该快捷方式)。 此类快捷方式是包含在 MFU 列表中的候选项。
NoStartPage 指示应用程序可执行文件和快捷方式应从 开始 菜单和 MFU 列表中固定或包含。 此条目通常用于排除系统工具、安装程序和卸载程序以及自述文件。
使用可执行文件作为任务栏组图标 如果此应用程序没有固定的快捷方式,则任务栏将使用此可执行文件的默认图标,而不是第一次遇到的窗口的图标。
任务栏组图标 指定用于替代任务栏图标的图标。 窗口图标通常用于任务栏。 设置 TaskbarGroupIcon 条目会导致系统改用应用程序 .exe 中的图标。

例子

通过 HKEY_CLASSES_ROOT\应用程序\ApplicationName.exe 子项注册应用程序的一些示例如下所示。 所有注册表项值都属于 REG_SZ 类型,DefaultIconREG_EXPAND_SZ 类型除外)。

HKEY_CLASSES_ROOT
   Applications
      wordpad.exe
         FriendlyAppName = @%SystemRoot%\System32\shell32.dll,-22069
HKEY_CLASSES_ROOT
   Applications
      wmplayer.exe
         SupportedTypes
            .3gp2
HKEY_CLASSES_ROOT
   Applications
      wmplayer.exe
         DefaultIcon
            (Default) = %SystemRoot%\system32\wmploc.dll,-730
HKEY_CLASSES_ROOT
   Applications
      WScript.exe
         NoOpenWith
HKEY_CLASSES_ROOT
   Applications
      photoviewer.dll
         shell
            open
               DropTarget
                  Clsid = {FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}
HKEY_CLASSES_ROOT
   Applications
      mspaint.exe
         SupportedTypes
            .bmp
            .dib
            .rle
            .jpg
            .jpeg
            .jpe
            .jfif
            .gif
            .emf
            .wmf
            .tif
            .tiff
            .png
            .ico

注册谓词和其他文件关联信息

HKEY_CLASSES_ROOT\SystemFileAssociations 下注册的子项允许 Shell 定义文件类型属性的默认行为,并支持共享文件关联。 当用户更改文件类型的默认应用程序时,新默认应用程序的 ProgID 在提供谓词和其他关联信息方面具有优先级。 此优先级是由于它是关联数组中的第一个条目。 如果默认程序已更改,则上一个 ProgID 下的信息不再可用。

若要主动处理更改默认程序的后果,可以使用 HKEY_CLASSES_ROOT\SystemFileAssociations 来注册谓词和其他关联信息。 由于在关联数组中的 ProgID 之后的位置,这些注册优先级较低。 即使用户更改默认程序,这些 SystemFileAssociationsregistration 也稳定,并提供一个位置来注册将始终可用于特定文件类型的辅助谓词。 有关注册表示例,请参阅本主题后面的 注册感知类型

以下注册表示例显示了当用户在控制面板中运行 默认程序 项以将 .mp3 文件的默认更改为 App2ProgID 时会发生什么情况。 更改默认值后,Verb1 不再可用,Verb2 将成为默认值。

HKEY_CLASSES_ROOT
   .mp3
      (Default) = App1ProgID
HKEY_CLASSES_ROOT
   App1ProgID
      shell
         Verb1
HKEY_CLASSES_ROOT
   App2ProgID
      shell
         Verb2

注册感知类型

感知类型的注册表值定义为 HKEY_CLASSES_ROOT\SystemFileAssociations 注册表子项的子项。 例如,感知的类型 文本 注册如下:

HKEY_CLASSES_ROOT
   SystemFileAssociations
      text
         shell
            edit
               command
                  (Default) = "%SystemRoot%\system32\NOTEPAD.EXE" "%1"
            open
               command
                  (Default) = "%SystemRoot%\system32\NOTEPAD.EXE" "%1"

文件类型的感知类型通过在文件类型的子项中包含一个 PerceivedType 值来指示。 PerceivedType 值设置为在 HKEY_CLASSES_ROOT\SystemFileAssociations 注册表子项下注册的感知类型的名称,如前面的注册表示例所示。 例如,若要将.cpp文件声明为感知类型“text”,请添加以下注册表项:

HKEY_CLASSES_ROOT
   .cpp
      PerceivedType = text

文件类型

文件关联的工作原理

按文件类型或类型 内容视图

文件类型验证程序

文件类型处理程序

编程标识符

感知类型

关联数组