Отправка локального всплывающего уведомления из других типов неупакованных приложений

Этот раздел предназначен для вас, если вы разрабатываете неупакованное приложение, которое не является C# или C++.

Это значит, что вы не разрабатываете упаковаемое приложение (см. статью Создание нового проекта для упаковаемого классического приложения WinUI 3) и не разрабатываете упаковаемое приложение с внешним расположением (см. раздел Предоставление удостоверения пакета с помощью упаковки с помощью внешнего расположения), и ваше приложение не является C# или C++.

Всплывающее уведомление — это сообщение, которое приложение может создать и доставить пользователю, пока пользователь не использует ваше приложение. В этом кратком руководстве описаны действия по созданию, доставке и отображению всплывающего уведомления Windows. В этом кратком руководстве используются локальные уведомления, которые являются простейшими уведомлениями для реализации.

Важно!

Если вы пишете приложение C#, ознакомьтесь с документацией по C#. Если вы пишете приложение C++, см. документацию по C++ UWP или C++ WRL .

Шаг 1. Регистрация приложения в реестре

Сначала необходимо зарегистрировать сведения о приложении в реестре, включая уникальный идентификатор AUMID, который идентифицирует ваше приложение, отображаемое имя приложения, значок и GUID активатора COM.

<registryKey keyName="HKEY_LOCAL_MACHINE\Software\Classes\AppUserModelId\<YOUR_AUMID>">
    <registryValue
        name="DisplayName"
        value="My App"
        valueType="REG_EXPAND_SZ" />
    <registryValue
        name="IconUri"
        value="C:\icon.png"
        valueType="REG_EXPAND_SZ" />
    <registryValue
        name="IconBackgroundColor"
        value="AARRGGBB"
        valueType="REG_SZ" />
    <registryValue
        name="CustomActivator"
        value="{YOUR COM ACTIVATOR GUID HERE}"
        valueType="REG_SZ" />
</registryKey>

Шаг 2. Настройка активатора COM

Уведомления можно щелкнуть в любой момент времени, даже если приложение не запущено. Таким образом, активация уведомлений обрабатывается через активатор COM. Com-класс должен реализовывать INotificationActivationCallback интерфейс . Guid для com-класса должен соответствовать GUID, указанному в значении CustomActivator реестра.

struct callback : winrt::implements<callback, INotificationActivationCallback>
{
    HRESULT __stdcall Activate(
        LPCWSTR app,
        LPCWSTR args,
        [[maybe_unused]] NOTIFICATION_USER_INPUT_DATA const* data,
        [[maybe_unused]] ULONG count) noexcept final
    {
        try
        {
            std::wcout << this_app_name << L" has been called back from a notification." << std::endl;
            std::wcout << L"Value of the 'app' parameter is '" << app << L"'." << std::endl;
            std::wcout << L"Value of the 'args' parameter is '" << args << L"'." << std::endl;
            return S_OK;
        }
        catch (...)
        {
            return winrt::to_hresult();
        }
    }
};

Шаг 3. Отправка всплывающего уведомления

В Windows 10 содержимое всплывающего уведомления описано с помощью адаптивного языка, который обеспечивает большую гибкость вида уведомления. Дополнительные сведения см. в документации по содержимому всплывающего уведомления.

Начнем с простого текстового уведомления. Создайте содержимое уведомления (с помощью библиотеки уведомлений) и отобразите уведомление!

Важно!

При отправке уведомления необходимо использовать AUMID, полученный ранее, чтобы уведомление отображалось из приложения.

Простое текстовое уведомление
// Construct the toast template
XmlDocument doc;
doc.LoadXml(L"<toast>\
    <visual>\
        <binding template=\"ToastGeneric\">\
            <text></text>\
            <text></text>\
        </binding>\
    </visual>\
</toast>");

// Populate with text and values
doc.SelectSingleNode(L"//text[1]").InnerText(L"Andrew sent you a picture");
doc.SelectSingleNode(L"//text[2]").InnerText(L"Check this out, The Enchantments in Washington!");

// Construct the notification
ToastNotification notif{ doc };

// And send it! Use the AUMID you specified earlier.
ToastNotificationManager::CreateToastNotifier(L"MyPublisher.MyApp").Show(notif);

Шаг 4. Обработка активации

Активатор COM будет активирован при нажатии уведомления.

Дополнительные сведения

Ограничения AUMID

AUMID должен содержать не более 129 символов. Если длина AUMID превышает 129 символов, запланированные всплывающие уведомления работать не будут. При добавлении запланированного уведомления возникнет следующее исключение: область данных, переданная в системный вызов, слишком мала. (0x8007007A).