将应用固定到任务栏

现在,可以通过编程方式请求用户将 Win32 或 UWP 应用固定到任务栏,类似于将应用固定到“开始”菜单的方式。 可以检查应用当前是否已固定,以及任务栏是否允许固定。

Windows 11 任务栏的屏幕截图,其中显示了固定的应用。

重要

需要 Fall Creators Update:目标必须为 SDK 16299,并且必须运行版本 16299 或更高版本才能使用任务栏 API

重要的 APITaskbarManager 类

何时应要求用户将你的应用固定到任务栏?

TaskbarManager 类允许要求用户将你的应用固定到任务栏,用户必须批准此请求。 你投入了大量精力来构建一个出色的应用,现在你有机会要求用户将其固定到任务栏。 但在我们深入研究代码之前,在设计体验时需要牢记以下几点:

  • 务必在你的应用中设计无干扰且易于退出的用户体验,并有一个明确的行动号召。 避免使用对话框和浮出控件实现此目的。 建议使用可访问的固定图标或类似的用户体验,但并不强制要求。
  • 在要求用户固定应用之前,务必确保你的应用对用户具有价值
  • 如果磁贴已固定或设备不支持,切勿要求用户固定你的应用。 (本文介绍如何确定是否支持固定。)
  • 切勿反复要求用户固定你的应用(可能会让用户讨厌)
  • 切勿在没有显式用户交互的情况下调用固定 API,或者在应用最小化/未打开时调用。 你的应用必须位于前台,才能使进程正常运行。
  • 切勿使用安装程序调用 API

受限访问功能 (LAF) 审批

重要

任务栏固定是一项受限访问功能(请参阅 LimitedAccessFeatures 类)。 有关详细信息或若要请求解锁令牌,请联系 Microsoft 支持部门

1.检查是否存在所需的 API

UWP

如果你的应用支持较旧版本的 Windows 10,则需要检查 TaskbarManager 类是否可用。 你可以使用 ApiInformation.IsTypePresent 方法执行此检查。 如果 TaskbarManager 类不可用,请避免执行对 API 的任何调用。

if (ApiInformation.IsTypePresent("Windows.UI.Shell.TaskbarManager"))
{
    // Taskbar APIs exist!
}

else
{
    // Older version of Windows, no taskbar APIs
}

Win32

若要从 Win32 桌面应用使用 TaskbarManager,则需要检查是否存在桌面应用支持。 你可以通过在 TaskbarManager 激活工厂上查找 ITaskbarManagerDesktopAppSupportStatics 标记接口来执行此检查。 如果此接口不可用,则无法从桌面应用使用 TaskbarManager

if (winrt::try_get_activation_factory<winrt::Windows::UI::Shell::TaskbarManager, winrt::Windows::UI::Shell::ITaskbarManagerDesktopAppSupportStatics>())
{
    // TaskbarManager desktop app support is available.
}
else
{
    // TaskbarManager desktop app support is not available.
}

2.检查任务栏是否存在并允许固定

Windows 应用可以在各种设备上运行;并非所有设备都支持任务栏。 目前,只有桌面设备支持任务栏。 此外,应用可能会请求固定,但在任何给定时间都不允许固定。 建议应用在涉及用户体验之前检查是否允许固定,以免用户感到困惑。

即使任务栏可用,用户计算机上的组策略也可能会禁用任务栏固定。 因此,在尝试固定应用之前,需要检查是否支持固定到任务栏。 如果任务栏存在并允许固定,则 TaskbarManager.IsPinningAllowed 属性会返回 true

// Check if taskbar allows pinning, apps may request pinning, but pinning may not be allowed at any given time. It is suggested that apps check whether pinning is allowed before a UX is surfaced in order to prevent confusing users.

bool isPinningAllowed = TaskbarManager.GetDefault().IsPinningAllowed;

重要

此外,在实际进行调用时还必须满足一些要求,才能允许固定请求:

  • 应用位于前台
  • 应用具有“开始”菜单项

如果未满足这些要求,不会导致异常,只会拒绝固定请求。 可以调用 IsPinningAllowed 以确定是否允许固定请求(提示)。

注意

如果不想将应用固定到任务栏,只想确定任务栏是否可用,请使用 TaskbarManager.IsSupported 属性。

3.检查应用当前是否已固定到任务栏

显然,如果应用已固定到任务栏,则无需要求用户将应用固定到任务栏。 可以使用 TaskbarManager.IsCurrentAppPinnedAsync 方法检查在询问用户之前应用是否已固定。

// Check whether your app is currently pinned
bool isPinned = await TaskbarManager.GetDefault().IsCurrentAppPinnedAsync();

if (isPinned)
{
    // The app is already pinned--no point in asking to pin it again!
}
else
{
    //The app is not pinned.
}

4.固定应用

如果任务栏存在并且允许固定,同时你的应用当前未固定,则可能需要显示一个小提示,让用户知道他们可以固定你的应用。 例如,你可以在 UI 中的某处显示用户可以单击的固定图标。

如果用户单击你的固定建议 UI,则将调用 TaskbarManager.RequestPinCurrentAppAsync 方法。 此方法将显示一个对话框,要求用户确认是否要将你的应用固定到任务栏。

重要

此对话框必须从前台 UI 线程调用,否则将导致异常。

// Request to be pinned to the taskbar.
bool isPinned = await TaskbarManager.GetDefault().RequestPinCurrentAppAsync();

固定对话框

此方法会返回一个布尔值,指明你的应用现在是否已固定到任务栏。 如果你的应用已固定,此方法将立即返回 true,而不会向用户显示对话框。 如果用户在对话框中单击“否”,或者不允许将应用固定到任务栏,此方法将返回 false。 否则,如果用户单击“是”,应用固定完成,API 将返回 true

资源