从其他类型的非打包应用发送本地 toast 通知

如果你正在开发非 C# 或 C++ 的未打包应用,则本主题适合你。

也就是说, 如果不开发打包 应用 (请参阅 为打包的 WinUI 3 桌面应用创建新项目) ,并且未开发具有外部位置的打包应用 (请参阅 使用外部位置) 打包授予包标识 ,并且你的应用不是 C# 或 C++。

Toast 通知是一条消息,当用户当前未使用你的应用时,应用可以构造并传递给用户。 本快速入门将引导你完成创建、传递和显示 Windows Toast 通知的步骤。 本快速入门使用本地通知,这是要实现的最简单通知。

重要

如果要编写 C# 应用,请参阅 C# 文档。 如果要编写 C++ 应用,请参阅 C++ UWPC++ WRL 文档。

步骤 1:在注册表中注册应用

首先需要在注册表中注册应用的信息,包括用于标识应用的唯一 AUMID、应用的显示名称、你的图标以及 COM 激活器的 GUID。

<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 接口。 COM 类的 GUID 必须与你在注册表 CustomActivator 值中指定的 GUID 匹配。

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:发送 toast

在 Windows 10 中,你的 toast 通知内容是使用对于你的通知外观给予了最大程度灵活性的自适应语言描述的。 有关详细信息,请参阅 toast 内容文档

我们将从基于文本的简单通知开始。 构造通知内容(使用通知库),然后显示通知!

重要

早在发送通知时就必须使用 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 个字符,则计划的 toast 通知将无法工作 - 添加计划的通知时,你会收到以下异常:传递到系统调用的数据区域太小。(0x8007007A)。