默认程序

使用 默认程序 设置默认用户体验。 用户可以从控制面板或直接从“开始”菜单访问默认程序设置程序访问和计算机默认值 (SPAD) 工具(Windows XP 中用户的主要默认体验)现在是 默认程序的一部分。

重要

本主题不适用于Windows 10。 默认文件关联的工作方式在 Windows 10 中发生了变化。 有关详细信息,请参阅本文中的更改Windows 10处理默认应用的方式部分。

 

当用户 使用默认程序设置程序默认值时,默认设置仅适用于该用户,而不适用于可能使用同一计算机的其他用户。 默认程序提供了一组 (Windows 8) 中弃用的 API,使独立软件供应商 (ISV) 将他们的程序或应用程序包含在默认系统中。 API 集还有助于 ISV 更好地将其状态作为默认值进行管理。

本主题的组织方式如下:

默认程序 主要用于使用标准文件类型(如.mp3或.jpg文件)或标准协议(如 HTTP 或 mailto)的应用程序。 使用其自己的专有协议和文件关联的应用程序通常不使用 默认程序 功能。

默认程序 功能注册应用程序后,可以使用 API 集使用以下选项和功能:

  • 还原应用程序的所有已注册默认值。 已弃用Windows 8。
  • 还原应用程序的单个已注册默认值。 已弃用Windows 8。
  • 在单个调用中查询特定默认值的所有者,而不是搜索注册表。 可以查询文件关联、协议或 “开始” 菜单规范谓词的默认值。
  • 为用户可以在其中设置单个默认值的特定应用程序启动 UI。
  • 删除所有每用户关联。

默认程序 还提供了一个 UI,使你能够注册应用程序,以便向用户提供其他信息。 例如,数字签名的应用程序可以包含制造商主页的 URL。

使用关联的 API 集可帮助应用程序在 Windows Vista 中引入的用户帐户控制 (UAC) 功能下正常运行。 在 UAC 下,管理员以标准用户的身份向系统显示,因此管理员通常无法写入 HKEY_LOCAL_MACHINE 子树。 此限制是一项安全功能,可防止进程在管理员不知情的情况下充当管理员。

用户安装程序通常作为提升的过程执行。 但是,应用程序尝试在安装后修改计算机级别的默认关联行为将失败。 相反,必须在每用户级别注册默认值,这可以防止多个用户覆盖彼此的默认值。

文件和协议关联的分层注册表结构使每用户默认值优先于计算机级默认值。 某些应用程序在其代码中包含一些点,当它们声明在 HKEY_LOCAL_MACHINE 中注册的默认值时,这些点会暂时提升其权限。 如果另一个应用程序已注册为每用户默认值,则这些应用程序可能会遇到意外结果。 使用 默认程序 可防止这种歧义,并保证每用户级别的预期结果。

注册应用程序以用于默认程序

本部分介绍向 默认程序注册应用程序所需的注册表子项和值。 它包含一个完整的示例。

本节包含下列主题:

默认程序 要求每个应用程序显式注册应将其列为默认应用程序的文件关联、MIME 关联和协议。 可以使用以下注册表元素注册关联,本主题稍后在 “注册子项”和“值说明”下详细介绍了这些元素:

HKEY_LOCAL_MACHINE
   %ApplicationCapabilityPath%
      ApplicationDescription
      ApplicationName
      Hidden
      FileAssociations
         .file-extension1
         .file-extension2
         ...
         .file-extensionX
      MIMEAssociations
         MIME
      Startmenu
         StartmenuInternet
         Mail
      UrlAssociations
         url-scheme
   SOFTWARE
      RegisteredApplications
         Unique Application Name = %ApplicationCapabilityPath%

以下示例显示了名为 WebBrowser 的虚构 Contoso 浏览器的注册表项:

HKEY_LOCAL_MACHINE
   SOFTWARE
      Contoso
         WebBrowser
            Capabilities
               ApplicationDescription = This award-winning Contoso browser is better than ever. Search the Internet and find exactly what you want in just seconds. Use integrated tabs and new phishing detectors to enhance your Internet experience.
               FileAssociations
                  .htm = ContosoHTML
                  .html = ContosoHTML
                  .shtml = ContosoHTML
                  .xht = ContosoHTML
                  .xhtml = ContosoHTML
               Startmenu
                  StartmenuInternet = Contoso.exe
               UrlAssociations
                  http = Contoso.Url.Http
                  https = Contoso.Url.Https
                  ftp = Contoso.Url.ftp
   SOFTWARE
      RegisteredApplications
         Contoso.WebBrowser.1.06 = SOFTWARE\Contoso\WebBrowser\Capabilities

ProgIDs

应用程序必须提供特定的 ProgID。 请确保包含通常写入扩展的泛型默认子项的所有信息。 例如,虚构的 Litware 媒体播放器LitwarePlayer11.AssocFile.MP3子项提供特定于应用程序的HKEY_LOCAL_MACHINE\SOFTWARE\\。 该子项包括泛型默认子项 HKEY_LOCAL_MACHINE\SOFTWARE\\.mp3 的所有信息,以及希望应用程序注册的任何其他信息。 这可确保如果用户将.mp3关联还原到 Litware 播放器,则 Litware 播放器的信息保持不变,并且未被其他应用程序覆盖。 如果默认子项是该信息的唯一源,则可能发生 (覆盖。)

将 ProgID 映射到文件扩展名或协议时,应用程序可以一对一或一对多映射。 在 Contoso 示例中,ContosoHTML 指向单个 ProgID,它为.htm、.html、.shtml、.xht 和 .xhtml 扩展提供 shellexecute 信息。 由于每个协议存在不同的 ProgID,因此在使用协议时,可以启用每个协议有自己的执行字符串。

当可以在浏览器中内联查看 MIME 类型时,MIME 类型的 ProgID 必须包含 CLSID 子项,该子项使用相应应用程序的类标识符 (CLSID) 。 此 CLSID 用于对存储在 HKEY_LOCAL_MACHINE\SOFTWARE\\ MIME 数据库内容类型中的 MIME数据库中\的CLSID\ 进行查找。 如果不希望在浏览器中内联查看 MIME 类型,则可以省略此步骤。

注册子项和值说明

本部分介绍向 默认程序注册应用程序时使用的各个注册表子项和值,如前所述。

功能

“功能”子项包含特定应用程序的所有默认程序信息。 占位符 %ApplicationCapabilityPath% 引用从 HKEY_CURRENT_USERHKEY_LOCAL_MACHINE 到应用程序的 Capabilities 子项的注册表路径。 此子项包含下表中显示的有效值。

类型 含义
ApplicationDescription REG_SZ或REG_EXPAND_SZ “必需”。 若要使用户能够做出明智的默认分配选择,应用程序必须提供描述应用程序功能的字符串。 尽管前面的 Contoso 示例将说明直接分配给 ApplicationDescription 值,但应用程序通常以嵌入.dll文件中的资源的形式提供说明,以促进本地化。 如果未提供 ApplicationDescription,则应用程序不会显示在潜在默认程序的 UI 列表中。
ApplicationName REG_SZ或REG_EXPAND_SZ 可选。 程序在默认程序 UI 中显示的名称。 如果应用程序未提供此数据,则会在 UI 中使用与该应用程序的第一个注册 ProgID 关联的可执行程序的名称。 ApplicationName 必须始终与 RegisteredApplications 下注册的名称匹配。 如果希望不同的应用程序类型(如浏览器和电子邮件客户端)在显示为不同名称时指向同一可执行文件,则可以使用 ApplicationName。
Hidden REG_DWORD 可选。 将此值设置为 1,以禁止在 “设置默认 程序”对话框中的程序列表中显示应用程序。 如果此值为 0 或不存在,则应用程序正常显示在列表中。

 

FileAssociations

FileAssociations 子项包含应用程序声明的特定文件关联。 这些声明存储为值,每个扩展都有一个值。 关联指向特定于应用程序的 ProgID,而不是泛型 ProgID。 但是,不需要所有关联都指向同一 ProgID。

MIMEAssociations

MIMEAssociations 子项包含应用程序声明的特定 MIME 类型。 这些声明存储为值,每个 MIME 类型都有一个值。 每个 MIME 类型的值名称必须与存储在 MIME 数据库中的 MIME 名称完全匹配。 还必须为值分配一个特定于应用程序的 ProgID,其中包含应用程序的相应 CLSID。

Startmenu

Startmenu 子项与“开始”菜单中的用户可分配的 Internet电子邮件条目相关联。 应用程序必须单独注册为这些条目的竞争者。 有关详细信息,请参阅 向客户端类型注册程序

注意

从 Windows 7 开始,“开始”菜单中不再包含 Internet电子邮件条目。 与 电子邮件 条目关联的注册表数据仍用于默认 MAPI 客户端,但 Windows 根本不使用与 Internet 条目关联的注册表数据。

 

通过将应用程序的 “开始 ”菜单注册与其 “默认程序” 注册相关联,该应用程序在 “设置关联” UI 中显示为潜在的默认值。 如果用户已选择应用程序作为默认应用程序,然后选择稍后还原所有应用程序默认值,则应用程序将还原到该用户的 “开始 ”菜单位置。 有关详细信息和插图,请参阅本主题后面的 默认程序 UI 部分。

Startmenu 子项有两个条目:StartMenuInternet 和 Mail,对应于“开始”菜单中的规范 Internet电子邮件位置。 应用程序为 StartMenuInternet 或 Mail 分配一个值,该值等于应用程序在 HKEY_LOCAL_MACHINE\SOFTWARE\客户端\StartMenuInternetHKEY_LOCAL_MACHINE\SOFTWARE\客户端\邮件 (下注册应用程序子项的名称,如使用 客户端类型注册程序) 中所述。

对于“开始”菜单中的电子邮件规范位置,它表示默认的 MAPI 客户端,因此假定能够处理 MAPI 调用。 在 Windows 7 下,虽然“开始”菜单中不再有电子邮件规范位置,但此子项将继续用于默认 MAPI 客户端。 声明邮件默认值的应用程序应在以下子项下注册为 MAPI 处理程序:

HKEY_LOCAL_MACHINE
   SOFTWARE
      Clients
         Mail
            CanonicalName

如果邮件客户端无法支持 MAPI,但仍希望争夺 “开始 ”菜单 “电子邮件 规范”位置,则可以在以下子项下注册命令行:

HKEY_LOCAL_MACHINE
   SOFTWARE
      Clients
         Mail
            CanonicalName
               shell
                  open
                     command

此外,在\HKEY_LOCAL_MACHINESOFTWARE\客户端\邮件\CanonicalName”下,使用应用程序名称添加默认值。

这些条目允许从 “开始 ”菜单 的电子邮件 位置启动应用程序。 请注意,MAPI 调用仍会向应用程序发出,这些调用会落到以前的 MAPI 处理程序,或者如果未设置 MAPI 处理程序,则失败。 有关详细信息,请参阅 向客户端类型注册程序

UrlAssociations

UrlAssociations 子项包含应用程序声明的特定 URL 协议。 这些声明存储为值,每个协议都有一个值。 每个协议都必须指向特定于应用程序的 ProgID,而不是泛型 ProgID。 如 Contoso 示例中所述,可以为每个协议使用不同的 ProgID,以便每个协议都有自己的执行字符串。

RegisteredApplications

RegisteredApplications 的完整子项为:

\ HKEY_LOCAL_MACHINE软件\RegisteredApplications

此子项为操作系统提供应用程序的 “默认程序” 信息的注册表位置。 位置存储为一个值,其名称必须与应用程序的名称匹配。

完整注册示例

此示例显示注册虚构的 Litware 媒体播放器时使用的子项和值。 该示例包括 ProgID 条目,以便显示这些条目如何组合在一起。

以下子项显示.mp3 MIME 类型的特定于应用程序的 ProgID:

HKEY_LOCAL_MACHINE
   SOFTWARE
      Classes
         LitwarePlayer11.MIME.MP3
            CLSID
               (Default) = {CD3AFA76-B84F-48F0-9393-7EDC34128127}

接下来是应用程序特定的 ProgID,它将 Litware 程序与.mp3文件扩展名相关联。

HKEY_LOCAL_MACHINE
   SOFTWARE
      Classes
         LitwarePlayer11.AssocFile.MP3
            (Default) = MP3 Format Sound
            DefaultIcon
               (Default) = %ProgramFiles%\Litware\litware.dll, 0
            shell
               open
                  command
                     (Default) = %ProgramFiles%\Litware\litware.exe

接下来的条目显示.mpeg MIME 类型和文件扩展名的组合 ProgID。

HKEY_LOCAL_MACHINE
   SOFTWARE
      Classes
         LitwarePlayer11.AssocFile.MPG
            (Default) = Movie Clip
            CLSID
               (Default) = {D92B76F4-CFA0-4b93-866B-7730FEB4CD7B}
            DefaultIcon
               (Default) = %ProgramFiles%\Litware\litware.dll, 0
            shell
               open
                  command
                     (Default) = %ProgramFiles%\Litware\litware.exe

接下来的条目在 默认程序中 注册 Litware 程序并使用以前注册的 ProgID

HKEY_LOCAL_MACHINE
   SOFTWARE
      Litware
         LitwarePlayer
            Capabilities
               ApplicationDescription = The new Litware Media Player breaks new ground in exciting fictional programs.
               FileAssociations
                  .mp3 = LitwarePlayer11.AssocFile.MP3
                  .mpeg = LitwarePlayer11.AssocFile.MPG
               MimeAssociations
                  audio/mp3 = LitwarePlayer11.MIME.MP3
                  audio/mpeg = LitwarePlayer11.AssocFile.MPG

最后,此示例注册 Litware 默认程序 注册的位置。

HKEY_LOCAL_MACHINE
   SOFTWARE
      RegisteredApplications
         Litware Player = Software\Litware\LitwarePlayer\Capabilities

成为默认浏览器

浏览器注册必须遵循本主题中概述的最佳做法。 安装浏览器后,Windows 可以向用户显示系统通知,用户可通过该通知选择浏览器作为系统默认设置。 满足以下条件时会显示此通知:

  • 浏览器的安装程序使用SHCNE_ASSOCCHANGED标志调用 SHChangeNotify,以告知 Windows 已注册新的协议处理程序。
  • Windows 检测到一个或多个新应用程序已注册以处理 http:// 和 https:// 协议,并且用户尚未收到通知。 换句话说,尚未向用户显示以下任何内容:播发应用程序的系统通知、包含应用程序的 OpenWith 浮出控件,或应用程序的“设置用户默认值” (SUD) 控制面板页。

以下示例显示了浏览器安装程序在写入其注册表项后应运行的推荐注册代码。

SHChangeNotify 首先通知系统新的关联选项可用。 需要 SHChangeNotify 调用来确保系统默认值正常运行。

然后 ,Sleep 语句允许系统进程有时间处理通知。

void NotifySystemOfNewRegistration()
{
    SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_DWORD | SHCNF_FLUSH, nullptr, nullptr);
    Sleep(1000);
}

如果用户在未选择新的默认浏览器的情况下关闭或忽略生成的通知或浮出控件,则默认浏览器将保持不变。 请注意,用户还可以通过其他机制随时更改默认浏览器,包括控制面板中的“设置用户默认值”。

默认程序 UI

本部分中的插图显示了用户所看到的 默认程序的 UI。

下图显示了 控制面板 中的“main默认程序”窗口。

默认程序输入页的屏幕截图

当用户选择 “设置默认程序” 选项时,将显示以下窗口。 用户可以使用此页面为所有文件类型和协议分配默认程序,程序可能默认。 如下图所示,所有 已注册 的程序和程序图标都显示在左侧的“ 程序 ”框中。

“设置默认程序”页的屏幕截图

当用户从列表中选择某个程序时,将显示程序图标和提供程序。 如果 URL 嵌入到程序的数字签名证书中,程序也可以显示 URL。 未经过数字签名的程序无法显示 URL。

还会显示程序在注册期间提供的描述性文本。 此文本是必需的。 说明框下方显示当前为程序分配的默认值数(从注册要处理的全数中)。

若要分配或还原程序作为为其注册的所有文件和协议的默认程序,用户单击“ 将此程序设置为默认” 选项。

若要将单个文件类型和协议分配给程序,用户单击“ 为此程序选择默认值 ”选项,该选项将显示程序窗口的 “设置关联 ”,如下图所示。

注意

建议使用 IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUI 调用程序的 Set 关联

 

程序页的“设置”的屏幕截图

使用默认程序的最佳做法

本部分提供注册应用程序时使用 默认程序的 最佳做法准则。 它还提供了有关创建可为用户提供最佳 默认程序 功能的应用程序的设计建议。

安装期间

除了通常在 Windows XP 下练习的安装过程外,基于 Windows Vista 或更高版本的应用程序还必须向 默认程序 功能注册才能利用其功能。

在安装过程中执行以下步骤序列。 步骤 1-3 与 Windows XP 中使用的步骤匹配;步骤 4 是 Windows Vista 中的新增功能。

  1. 安装必要的二进制文件。
  2. 将 ProgID 写入HKEY_LOCAL_MACHINE。 请注意,应用程序必须为其关联创建特定于应用程序的 ProgID。
  3. 如前面注册用于 默认程序 的应用程序中所述,将 应用程序注册到默认程序

安装后

本部分讨论应用程序提示应如何首先向每个用户显示其默认选项。 它还讨论了应用程序如何监视其状态作为其可能的关联和协议的默认状态。

首次运行体验

当用户首次运行应用程序时,建议应用程序向用户显示通常包含以下两个选项的 UI:

  • 接受默认应用程序设置。 默认情况下选择此选项。
  • 自定义默认应用程序设置。

在Windows 8之前,如果用户接受默认设置,应用程序将调用 IApplicationAssociationRegistration::SetAppAsDefaultAll,这将在安装过程中声明的所有计算机级关联转换为该用户的按用户设置。

如果用户决定自定义设置,应用程序会调用 IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUI 以显示文件关联 UI。 下图显示了虚构的 Litware 媒体播放器的此窗口。

litware 程序页的集关联屏幕截图

“文件关联”窗口显示应用程序注册的默认值,并显示其他扩展和协议的当前默认值。 用户完成其默认值的自定义后,单击“ 保存” 按钮提交更改。 如果用户单击“ 取消”,窗口将关闭,但不保存更改。

应将此 UI 用于应用程序,而不是创建自己的 UI。 通过这样做,可以保存以前开发文件关联 UI 所需的资源。 你还保证正确保存关联。

将应用程序设置为检查它是否为默认值

注意

从Windows 8开始,此功能不再受支持。

 

应用程序通常检查运行时是否将其设置为默认值。 通过调用 IApplicationAssociationRegistration::QueryAppIsDefaultIApplicationAssociationRegistration::QueryAppIsDefaultAll,将应用程序设置为使此检查。

如果应用程序确定它不是默认值,它可以显示 UI,询问用户是接受当前情况还是将应用程序设置为默认值。 始终在此 UI 中包含一个默认选择的检查框,该框显示“不再询问”选项。

注意

选择默认值应由用户驱动。 在未询问用户的情况下,应用程序绝不应回收默认值。

 

下图显示了一个示例对话框。

示例对话框的屏幕截图

其他资源

文件关联的最佳做法

文件关联示例方案

在 Windows Vista 及更高版本中管理默认应用程序的指南

(SPAD) 设置程序访问和计算机默认值