Закрепите приложение на панели задач

Вы можете программно запросить пользователей закрепить приложение Win32 или WinUI на панели задач, аналогично тому, как можно закрепить приложение в меню "Пуск". Вы также можете проверить, закреплено ли ваше приложение в данный момент и разрешает ли панель задач его закрепление.

снимок экрана панели задач Windows 11 с закрепленным приложением.

Important

Для работы требуется Fall Creators Update. Вы должны установить целевой пакет SDK 16299 и запустить сборку 16299 или более поздней версии, чтобы использовать API панели задач.

Важные API: класс TaskbarManager

Когда вы попросите пользователя закрепить приложение на панели задач?

Класс TaskbarManager позволяет пользователю закрепить приложение на панели задач. Пользователь должен утвердить запрос. Вы положили много усилий в создание превосходного приложения, и теперь у вас есть возможность попросить пользователя закрепить его на панели задач. Но прежде чем мы рассмотрим код, вот некоторые вещи, которые следует учитывать, так как вы разрабатываете свой опыт:

  • Создавайте ненавязчивый и легко игнорируемый пользовательский интерфейс в вашем приложении с четким призывом к действию. Избегайте использования диалогов и всплывающих окон для этой цели. Рекомендуется, но не обязательно, использовать значки закрепления со специальными возможностями или аналогичные пользовательские интерфейсы.
  • Убедитесь, что приложение имеет значение для пользователя, прежде чем попросить пользователя закрепить его.
  • Не попросите пользователя закрепить приложение, если плитка уже закреплена или устройство не поддерживает его. (В этой статье объясняется, как определить, поддерживается ли закрепление.)
  • Не просите пользователя неоднократно закреплять ваше приложение (это может их раздражать).
  • не вызывать API пин-кода без явного взаимодействия с пользователем или когда приложение свернуто или не открыто. Приложение должно находиться на переднем плане, чтобы процесс работал.
  • Не используйте установщики для вызова API.

Утверждение функции ограниченного доступа (LAF)

Important

Закрепление панели задач — это функция ограниченного доступа для некоторых версий Windows (см. класс LimitedAccessFeatures). Для получения дополнительной информации или запроса токена разблокировки воспользуйтесь формой запроса токена доступа LAF.

Ограничение ограниченного доступа удаляется из Windows начиная с KB5074105 (сборки ОС 26200.7705 и 26100.7705).

В версиях Windows, где требуется маркер доступа LAF, перед вызовом API закрепления на панели задач необходимо сначала вызвать LimitedAccessFeatures.TryUnlockFeature. В более поздних версиях доступ к закреплению панели задач не ограничен, и вы можете перейти непосредственно к вызову API-интерфейсов закрепления панели задач.

Используйте этот код, чтобы определить, нужно ли вызвать TryUnlockFeature или можно пропустить этот вызов и закрепить приложение без токена доступа LAF.

 // LAF API seed value for com.microsoft.windows.taskbar.pin
 constexpr PCWSTR c_taskbarPinLAFSeedValue =
     L"4096B239A7295B635C090E647E867B5707DA6AB6CB78340B01FE4E0C8F4953D4";
 
 // Returns true if a Limited Access Feature token is required
 // for taskbar pinning on this machine.
 inline bool IsLAFTokenRequiredForTaskbarPinning()
 {
     wil::unique_hkey hKey;
     if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
             L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\AppModel"
             L"\\LimitedAccessFeatures\\com.microsoft.windows.taskbar.pin",
             0, KEY_READ, &hKey) != ERROR_SUCCESS)
     {
         return false;
     }
 
     DWORD value = 0;
     DWORD size = sizeof(value);
     LSTATUS status = RegQueryValueExW(hKey.get(),
         c_taskbarPinLAFSeedValue,
         nullptr, nullptr,
         reinterpret_cast<LPBYTE>(&value), &size);
 
     return (status == ERROR_SUCCESS) && (value != 0);
 }

1. Проверьте, существуют ли необходимые API

Win32

Если вы хотите использовать TaskbarManager из своего классического настольного приложения Win32, вам нужно проверить, доступна ли поддержка классических приложений. Чтобы выполнить эту проверку, можно искать интерфейс-маркер ITaskbarManagerDesktopAppSupportStatics на фабрике активации TaskbarManager. Если этот интерфейс недоступен, вы не сможете использовать 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;

Important

Существуют также требования, которые должны быть выполнены в момент непосредственного вызова для разрешения запроса на ввод пин-кода.

  • Приложение находится на переднем плане
  • Приложение имеет запись в меню «Пуск»
  • Для отображения уведомлений пользователю необходимо включить системные уведомления. Мы рекомендуем продемонстрировать это требование пользователям в пользовательском интерфейсе приложения.

Эти требования не приводят к исключению, если оно не выполнено, запрос пин-кода просто будет отклонен. IsPinningAllowed можно вызвать, чтобы определить, разрешен ли запрос пин-кода (подсказка).

Note

Если вы не хотите закрепить приложение на панели задач и просто хотите узнать, доступна ли панель задач, используйте свойство 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. Закрепите ваше приложение

Если панель задач присутствует, закрепление разрешено и ваше приложение в данный момент не закреплено, вы можете захотеть показать скрытую подсказку, чтобы сообщить пользователям, что они могут закрепить ваше приложение. Например, вы можете показать значок булавки в пользовательском интерфейсе, на который пользователь может нажать.

Если пользователь щелкает пользовательский интерфейс предложения пин-кода, вызовите метод TaskbarManager.RequestPinCurrentAppAsync . Этот метод отображает диалоговое окно, которое предлагает пользователю подтвердить, что они хотят закрепить ваше приложение на панели задач.

Important

Это должно вызываться из потока пользовательского интерфейса переднего плана, в противном случае создается исключение.

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

Диалоговое окно

Этот метод возвращает логическое значение, указывающее, закреплено ли ваше приложение на панели задач в данный момент. Если приложение уже закреплено, метод немедленно возвращается true без отображения диалогового окна пользователю. Если пользователь нажимает кнопку "нет" в диалоговом окне или закрепление приложения на панели задач запрещено, метод возвращается false. Иначе пользователь нажал "Да", и приложение было закреплено, а API вернет true.

Resources