从其他类型的非打包应用发送本地 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)