管理默认应用程序

将“设置程序访问和计算机默认值” (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 中注册应用程序的详细信息,请参阅 使用 Set Program Access 和 Computer Defaults (SPAD) 向客户端类型注册程序。 后续各节将讨论具体的更改和新建议。

在 SPAD 中设置默认值

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

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

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

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

当Windows 8应用程序在 SPAD 中实现“设置为默认值”时,必须使用 SPAD 中使用的相同应用程序名称在默认程序中注册其文件类型和协议。 这允许 SPAD 中的更改作为当前用户的相应默认程序条目中的更改进行反映。

在 SPAD 中隐藏访问权限

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

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

以前,采取上述任一操作会删除系统上相应应用程序的所有入口点。 此情况的具体指南说明如何从以下位置删除快捷方式和图标:

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

建议供应商在应用程序的 Hide Access 回调函数中实施这些准则。

SPAD 中的备用隐藏访问方法

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

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

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

    vista dialog box about hiding access to program

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

  • Windows XP 用户应显示以下对话框。

    windows xp dialog box about hiding access to program

  • 当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 的文件类型和协议。 在默认程序框架中注册协议的应用程序会自动添加到协议的 “打开方式 ”选项。

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

"开始"菜单菜单和快速启动栏

为使用户更容易发现,应用程序可以将快捷方式添加到Windows中的各种位置。 添加快捷方式的最常用位置是"开始"菜单菜单。 在 Windows Vista 及更高版本中,应用程序在隐藏文件夹 %ProgramData%\Microsoft\Windows\"开始"菜单 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)