默认程序

使用 默认程序 设置默认用户体验。 用户可以从控制面板或直接从"开始"菜单菜单访问默认程序 (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 媒体播放器提供特定于应用程序的 HKEY_LOCAL_MACHINE SOFTWAREClasses\\LitwarePlayer11.AssocFile.MP3\ 子项。 该子项包含泛型默认子项中的所有信息HKEY_LOCAL_MACHINE\SOFTWAREClasses\\.mp3以及希望应用程序注册的任何其他信息。 这可确保如果用户将.mp3关联还原到 Litware 播放器,则 Litware 玩家的信息保持不变,并且未被另一个应用程序覆盖。 如果默认子项是唯一的信息源,则可能会出现覆盖 (。)

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

当可以在浏览器中内联查看 MIME 类型时,MIME 类型的 ProgID 必须包含使用相应应用程序的类标识符 (CLSID) 的 CLSID 子项。 此 CLSID 用于查找存储在 HKEY_LOCAL_MACHINE\ SOFTWAREClassesMIMEDatabaseContent\\\\Type 中的 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 客户端,但与 Internet 条目关联的注册表数据根本不由Windows使用。

 

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

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

对于"开始"菜单菜单中的电子邮件规范位置,它表示默认的 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_MACHINE\SOFTWAREClientsMailCanonicalName\\\ 下,添加具有应用程序名称的默认值。

这些条目允许从"开始"菜单菜单的电子邮件位置启动应用程序。 请注意,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 调用,以确保系统默认值正常运行。

然后 ,睡眠 语句允许系统进程处理通知的时间。

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

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

默认程序 UI

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

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

screen shot of the default programs entry page

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

screen shot of the set your default programs page

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

还会显示程序在注册期间提供的描述性文本。 此文本是必需的。 说明框下方指示程序当前从注册处理的完整号码中分配了多少个默认值。

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

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

注意

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

 

screen shot of the set assocations for a program page

使用默认程序的最佳做法

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

在安装期间

除了通常在 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 媒体播放器的此窗口。

screen shot of the set associations for a program page for litware

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

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

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

注意

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

 

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

如果应用程序确定它不是默认值,则它可以显示 UI,询问用户是接受当前情况还是使应用程序成为默认值。 始终在此 UI 中包含默认选中的复选框,并显示不再次询问的选项。

注意

默认选项应为用户驱动。 应用程序绝不应在不询问用户的情况下回收默认值。

 

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

screen shot of an example dialog box

其他资源

文件关联的最佳做法

文件关联示例方案

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

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