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

如果你在开发的应用不使用 MSIX/UWP 或稀疏签名包,并且不是 C# 或 C++,则可以使用此页!

Toast 通知是用户当前未在应用内部时应用可构造并发送给用户的消息。 本快速入门指南将指导你完成创建、交付并显示 Windows 10 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,以便在应用中显示通知。

Simple text notification
// 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)。