管理默认应用程序

已将 “设置程序访问和计算机默认值 ” (SPAD) 功能添加到 Windows XP 和更高版本的 Windows 中,以管理每台计算机的默认值。 除了 SPAD,Windows Vista 还引入了每用户默认应用程序的概念和控制面板中的默认程序项。

重要

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

 

每用户默认设置特定于系统上的单个用户帐户。 如果存在每用户默认设置,则它们优先于该帐户的相应每台计算机默认设置。 从Windows 8开始,文件类型和协议默认值的扩展性系统严格按用户,而忽略每计算机默认值。 SPAD 在Windows 8中也发生了更改,以设置每用户默认值。

  • 在运行早于 Windows 8 版本的 Windows 的系统上,新创建的用户帐户将按计算机接收默认值,直到建立每用户默认值。 在 Windows Vista 及更高版本中,用户可以使用 控制面板 中的“默认程序”项来设置或更改其每用户默认值。 此外,首次运行应用程序时,可以使用 应用程序首次运行和 默认值部分中遵循的准则设置每用户默认值。
  • 在运行 Windows 8 的系统上,新创建的用户帐户从一开始就依赖于每用户默认值,并且不再支持在首次运行时设置这些默认值,如应用程序首次运行和默认值部分所述。

应用程序必须同时注册 SPAD 和默认程序功能,才能在 Windows Vista 及更高版本中作为默认程序提供。

本主题向独立软件供应商提供 (ISV) ,并提供在 Windows Vista 及更高版本中注册和管理应用程序默认值所需的步骤的快速指南。 提供了指向有关每个部分主题的更深入文章的链接。

控制面板 中的默认程序项

默认程序是 Windows Vista 中引入的一项功能,可直接从“开始”菜单和控制面板访问。 它提供了一个新的基础结构,该基础结构使用标准用户特权 (未提升) ,旨在使用户和应用程序能够管理每个用户的默认值。 对于用户,默认程序提供了一种统一且易于访问的方式来管理系统上所有应用程序的默认值、文件关联和自动播放设置。 对于应用程序,使用默认程序 API 提供的按用户范围具有以下优势:

  • 无提升

    应用程序不必将其权限提升为声明默认值。

  • 良好的公民资格

    在多用户计算机上,每个用户都可以选择不同的默认应用程序。

  • 默认管理

    默认程序 API 提供可靠且一致的机制,用于自行检查默认状态并回收丢失的设置,而无需直接写入注册表。 但是,从Windows 8开始,我们不建议应用程序查询默认状态,因为应用程序无法再更改默认设置,这些更改只能由用户进行。

若要使应用程序能够有效地管理默认值,必须将应用程序注册为潜在的默认程序。 有关注册和使用默认程序 API 的详细信息,请参阅 默认程序

默认程序还提供以下两项功能:

  • 可重用的默认值 UI

    程序默认值 (设置默认程序的 UI) 和文件关联 (将文件类型或协议与程序相关联 ,) 可以从应用程序内重复使用和调用。 这使应用程序能够提供用于管理默认值的标准用户体验,并使 ISV 不必开发自定义或等效的 UI。

  • 包含 URL 和营销信息

    作为 控制面板 中“默认程序”项的“设置默认程序”页的一部分,应用程序可以提供营销信息和指向供应商网站的链接。 此 URL 派生自应用程序签名时使用的 Authenticode 证书。 这可以防止滥用和未经授权替换此链接。 如果应用程序具有包含嵌入 URL 的 Authenticode 证书,Windows UI 将显示该嵌入的 URL。 ISV 应利用此功能将用户定向到其网站进行更新和其他下载。

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

设置程序访问和计算机默认值 (SPAD) 使管理员能够管理由该计算机的所有新用户继承的计算机范围的默认值。 在Windows 8之前,SPAD 还允许管理员在从系统中删除程序时修复文件关联损坏。 但是,截至Windows 8,SPAD 仅影响特定于用户的默认值。

有关在 SPAD 中注册应用程序的详细信息,请参阅 使用设置程序访问和计算机默认值 (SPAD) 使用客户端类型注册程序。 以下各节将讨论具体更改和新建议。

在 SPAD 中设置默认值

每用户默认值替代每台计算机的默认值。

  • Windows 8之前:如果设置了相应的每用户默认值,则用户不会看到 SPAD (中设置的每台计算机) 的默认值。 如果用户尚未设置每用户默认值,系统将使用相应的计算机默认值。 计算机上的新用户帐户最初继承计算机默认值。 用户首次运行应用程序时,应用程序应提示用户分配其每用户默认值。 请参阅 应用程序首次运行和默认值
  • 从Windows 8开始:所有默认值都是每用户,任何每计算机的默认设置都将被忽略。 应用程序无法再设置默认选项,因此它们无法引导用户完成这些默认值的分配。

当预Windows 8应用程序在 SPAD 中实现设置为默认值时,应遵循以下准则:

  • 应用程序应仅通过 SPAD 声明计算机级默认值。
  • 应用程序 不应 通过 SPAD 声明每用户默认值。

当Windows 8应用程序在 SPAD 中实现 Set as Default 时,它们必须使用 SPAD 中使用的相同应用程序名称在默认程序中注册其文件类型和协议。 这允许 SPAD 中的更改反映为当前用户的相应默认程序条目中的更改。

在 SPAD 中隐藏访问权限

可通过以下两种方式之一访问 SPAD 中每个可能的默认值的隐藏访问选项:

  • 选择“ 非 Microsoft ”类别的默认值,这将删除对所有 Microsoft 默认设置的访问权限。
  • 选择“自定义”类别并清除“启用对此程序的访问权限检查框。

以前,执行上述任一操作会删除系统上相应应用程序的所有入口点。 针对这种情况的具体准则是,从以下位置删除快捷方式和图标:

  • 桌面
  • “开始”菜单
  • (Windows Vista 及更早版本的快速启动栏仅)
  • 通知区域
  • 快捷菜单
  • 文件夹任务带

建议供应商在应用程序的隐藏访问回调函数中实施这些准则。

SPAD 中的备用隐藏访问方法

对于某些旧版应用程序,完全实现隐藏访问可能不切实际。 实现相同效果但用户不容易逆的另一种方法是卸载应用程序。 下面显示了实现此行为的示例行为和示例代码。

此替代项的建议用户体验如下所示:

  • 当用户清除 SPAD 中的 “启用对此程序的访问权限 ”框时,将显示以下 UI。

    有关隐藏对程序的访问的 vista 对话框

  • 当用户单击“确定”时,将显示控制面板中的“程序和功能”项,以便用户可以卸载该应用程序。

  • Windows XP 用户应看到以下对话框。

    有关隐藏对程序的访问的 windows xp 对话框

  • 当 Windows XP 用户单击“确定”时,将显示控制面板中的“添加或删除程序”项,以便用户可以卸载该应用程序。

以下代码为前面概述的“隐藏访问”功能提供了可重用的实现。 它可以在 Windows XP、Windows Vista 和 Windows 7 上使用。

#include <windows.h>
#include <shlwapi.h>
#include <strsafe.h>

PCWSTR c_pszMessage1 = L"To hide access to this program, you need to uninstall it by ";
PCWSTR c_pszMessage2 = L"using\n%s in Control Panel.\n\nWould you like to start %s?";
PCWSTR c_pszApplicationName  = L"Sample App";

int _tmain(int argc, WCHAR* argv[])
{
    OSVERSIONINFO version;
    version.dwOSVersionInfoSize = sizeof(version);

    if (GetVersionEx(&version))
    {
        PCWSTR pszCPLName = NULL;

        if (version.dwMajorVersion >= 6)
        {
            // Windows Vista and later
            pszCPLName = L"Programs and Features";
        }
        else if (version.dwMajorVersion == 5 &&
                 version.dwMinorVersion == 1)
        {
            // XP
            pszCPLName = L"Add/Remove Programs";
        }

        if (pszCPLName != NULL)
        {
            WCHAR szMessage[256], szScratch[256];
            if (SUCCEEDED(StringCchPrintf(szScratch, 
                                          ARRAYSIZE(szScratch), 
                                          c_pszMessage2, 
                                          pszCPLName, 
                                          pszCPLName)))
            {
                if (SUCCEEDED(StringCchCopy(szMessage, 
                                            ARRAYSIZE(szMessage), 
                                            c_pszMessage1)))
                {
                    if (SUCCEEDED(StringCchCat(szMessage, 
                                               ARRAYSIZE(szMessage), 
                                               szScratch)))
                    {
                        if (IDOK == MessageBox(NULL, 
                                               szMessage, 
                                               c_pszApplicationName, 
                                               MB_OKCANCEL))
                        {
                            ShellExecute(NULL, 
                                         NULL, 
                                         L"appwiz.cpl", 
                                         NULL, 
                                         NULL, 
                                         SW_SHOWNORMAL);
                        }
                    }
                }
            }
        }
    }
    return 0;
}

注册应用程序入口点

一个应用程序在操作系统中可以有多个入口点。 下面是入口点的建议位置:

  • 桌面
  • “开始”菜单
  • (Windows Vista 及更早版本的快速启动栏仅)
  • 通知区域
  • 快捷菜单
  • 文件夹任务带

本部分重点介绍以下特定领域:

打开方式

使用 “打开方式 ”快捷菜单,用户可以选择可以处理特定文件类型的应用程序。 虽然 Open With 可用于使用应用程序一次打开文件,但它也可用于设置该文件扩展名的默认值。 因此,应用程序应始终注册 “打开方式 ”,以便向用户显示该应用程序作为选择。 应用程序可以为 Open With 注册文件类型和协议。 在默认程序框架中注册协议的应用程序会自动添加到协议的 “打开方式 ”选项中。

有关注册 Open With 的信息,请参阅 文件关联简介

“开始”菜单和快速启动栏

为了便于用户发现,应用程序可以将快捷方式添加到 Windows 中的各个位置。 添加快捷方式的最常见位置是 “开始 ”菜单。 在 Windows Vista 及更高版本中,应用程序在隐藏文件夹 %ProgramData%\Microsoft\Windows\Start Menu\Programs 中创建快捷方式,以便在所有用户的 “开始” 菜单的程序列表中显示。 通常,应用程序会添加包含快捷方式的子文件夹。

对于浏览器和电子邮件程序,Windows Vista “开始 ”菜单还会在程序列表外显示两个专用链接,即“ Internet ”和 “电子邮件”。 应用程序注册这些类别后,默认程序框架可以管理通过这些链接启动的内容。

注意

自 Windows 7 起, Internet电子邮件 专用 的“开始” 菜单链接不再存在。

 

为了进一步提高可发现性,应用程序还可以向桌面和快速启动栏添加快捷方式。 在将图标添加到 “开始” 菜单、桌面或“快速启动”栏之前,应用程序应在安装期间或首次运行) 请求用户 (权限。

注意

从 Windows 7 开始,快速启动栏不再可用。 Windows 7 的替代方法是将应用程序固定到任务栏,但无法以编程方式进行固定,因为它是用户严格选择。

 

有关详细信息,请参阅以下主题:

应用程序安装和默认值

自 Windows XP 以来,应用程序安装过程没有根本更改,但针对运行早于 Windows 8 版本的 Windows 的系统的新准则除外:在安装时采用每台计算机默认值,但在该用户首次运行应用程序之前,不设置任何每用户默认值。 (请参阅 应用程序首次运行和 Defaults。) 应用程序不应在安装过程中设置每个用户的默认值,因为在某些情况下,安装应用程序的人员不是预期用户。 从Windows 8开始,不支持每台计算机的默认设置,应用程序无法更改每用户默认设置。

在安装过程中,应用程序应将其二进制文件复制到硬盘,并将其 ProgID 写入注册表。 此时,应用程序还应注册默认程序,并针对要处理的每个文件关联注册 打开方式 。 应用程序可以使用 OpenWithProgIds 子项向 Open With 注册。

有关详细信息,请参阅以下主题:

应用程序升级和默认值

许多应用程序能够随着时间的推移自行升级。 此升级过程不应更改每用户默认值的状态,因为该更改对用户是意外的。 但是,应用程序可以检查计算机级文件关联,并在它们已损坏时进行修复。

应用程序首次运行和默认值

注意

从Windows 8开始,系统代表所有应用程序处理此过程。 应用程序本身无法再查询和更改默认值。 只有用户才能执行此操作。 因此,应用程序不应通过任何机制尝试查询当前默认值或更改该默认值。 但是,应用程序可以通过调用 IApplicationAssociationRegistrationUI 接口的 LaunchAdvancedAssociationUI 方法,为控制面板中的默认程序提供入口点。

 

随着 Windows Vista 中每用户默认值的引入,争用常用文件扩展名的应用程序都提供声明这些扩展的常见用户体验非常重要。 由于这些默认值现在在用户的上下文中设置,因此仅当用户在安装后运行程序时,它们才应呈现为默认的可能性。

建立每用户默认值的准则如下:首次为特定用户运行应用程序时,该应用程序应请求用户对自己的默认值和文件关联的首选项。

建议的 UI 应为用户提供两个明确的选择:

  1. 接受应用程序要声明的所有默认值。 此选项还可能设置应用程序的其他默认属性,例如隐私或自动更新设置。 此选项允许应用程序声明其注册的所有默认值。
  2. 通过单独接受或不接受默认选择和程序设置进行自定义。 此选项提供进一步的 UI,使用户能够对其默认选项进行精细选择。

有关详细信息,请参阅 默认程序

注意

自Windows 8起,不支持此操作。

 

应用程序在 Windows Vista 及更高版本中向默认程序注册后,某些 API 可供应用程序使用。 例如,应用程序可能需要检查它是否为默认程序。 IApplicationAssociationRegistration 接口提供了执行此操作的方法。

任何想要声明默认值的应用程序必须首先询问用户,并且绝不在未经许可的情况下声明默认值。 应询问用户是希望将应用程序设为默认应用程序还是保留当前默认值。 在用户做出选择后,还应有一个选项不再次提出此问题。

有关详细信息,请参阅 默认程序

应用程序兼容性提示

本部分提供一些与 Windows 中的“默认程序”体验相关的应用程序兼容性提示。

避免触发Per-User虚拟化

通过用户帐户控制 (UAC) 环境,应用程序应始终仅使用标准用户权限运行,以获得最佳客户体验。 出于安全原因,将阻止具有标准用户特权级别的应用程序写入注册表的某些部分和某些系统文件。 Windows Vista 和更高版本的 Windows (AppCompat) 层提供临时应用程序兼容性,以帮助应用程序实现过渡。 阻止写入注册表或系统文件的尝试将“虚拟化”,以便应用程序继续运行,但不会更改系统的敏感区域。 但是,应用程序不应将 AppCompat 技术作为长期解决方案。 相反,应用程序应使用许多可用工具来验证它们是否可以在标准用户权限下成功运行。 可能需要对应用程序进行一些重新编程才能完成此操作,但这样做是为了长期兼容性。

避免从程序兼容性助手发出 AppCompat 警告或阻止

Windows Vista 及更高版本中提供了 (PCA) 的程序兼容性助手。 它的目的是提供一种自动化方法,使具有兼容性问题的旧程序更好地工作。 PCA 监视程序的已知问题。 如果检测到问题,它会通知用户该问题,并提供在用户再次运行程序之前应用有效的解决方案。 为了避免看到这些警告或阻止,ISV 应使用许多可用的工具,以确保其应用程序与 Windows Vista、Windows 7 及更高版本兼容。

支持以前的 Windows 操作系统版本

默认程序基础结构在 Windows Vista 之前的任何 Windows 操作系统上都不可用。 因此,当应用程序移动到新的默认程序基础结构时,它们应保留其较旧的应用程序默认代码,以保持与旧版 Windows 的兼容性。 应用程序应在安装过程中运行操作系统版本检查,以确定要运行哪些应用程序默认代码。

若要支持从 Windows XP 升级到 Windows Vista 或更高版本,应用程序应添加默认程序所需的所有注册表项,即使它们在运行 Windows XP 的计算机上安装也是如此。 注册对运行 Windows XP 的计算机没有影响,但如果计算机稍后升级,应用程序将已注册并能够利用框架。

有关详细信息,请参阅 OSVERSIONINFO

其他资源

文件关联的最佳做法

文件关联示例方案

默认程序

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