如何通过 AppUserModelID 启用桌面 toast 通知

本主题演示如何为应用创建快捷方式、为其分配 AppUserModelID,以及如何在“开始”屏幕中安装它。 我们强烈建议你在 Windows Installer 中执行此操作,而不是在应用的代码中执行此操作。 如果没有在“开始”屏幕或 “所有程序”中安装有效的快捷方式,则无法从桌面应用引发 Toast 通知。

注意

本主题中使用的示例方法取自 桌面 Toast 示例

 

需要了解的事项

技术

  • COM

先决条件

    • C++:Runtime.object.lib
    • C#:Windows.Winmd
  • C#:适用于 Microsoft .NET Framework 的 Windows API 代码包
  • 至少支持 Windows 8 的 Microsoft Visual Studio 版本

Instructions

步骤 1:准备要创建的快捷方式

此示例首先通过 GetEnvironmentVariable 函数确定用户的应用数据文件夹的路径。 然后,它编写快捷方式的完整路径,确定该位置尚不存在该名称的快捷方式,并将该信息传递给另一个创建并安装快捷方式的方法。

请注意,快捷方式可以按用户或按应用部署。

HRESULT DesktopToastsApp::TryCreateShortcut()
{
    wchar_t shortcutPath[MAX_PATH];
    DWORD charWritten = GetEnvironmentVariable(L"APPDATA", shortcutPath, MAX_PATH);
    HRESULT hr = charWritten > 0 ? S_OK : E_INVALIDARG;

    if (SUCCEEDED(hr))
    {
        errno_t concatError = wcscat_s(shortcutPath, ARRAYSIZE(shortcutPath), L"\\Microsoft\\Windows\\Start Menu\\Programs\\Desktop Toasts App.lnk");
 
        hr = concatError == 0 ? S_OK : E_INVALIDARG;
        if (SUCCEEDED(hr))
        {
            DWORD attributes = GetFileAttributes(shortcutPath);
            bool fileExists = attributes < 0xFFFFFFF;

            if (!fileExists)
            {
                hr = InstallShortcut(shortcutPath);  // See step 2.
            }
            else
            {
                hr = S_FALSE;
            }
        }
    }
    return hr;
}

步骤 2:创建快捷方式并将其安装在“开始”屏幕中

此示例还检索快捷方式的属性存储区,并从先前定义的变量 AppID中设置所需的 System.AppUserModel.ID 属性。

HRESULT DesktopToastsApp::InstallShortcut(_In_z_ wchar_t *shortcutPath)
{
    wchar_t exePath[MAX_PATH];
    
    DWORD charWritten = GetModuleFileNameEx(GetCurrentProcess(), nullptr, exePath, ARRAYSIZE(exePath));

    HRESULT hr = charWritten > 0 ? S_OK : E_FAIL;
    
    if (SUCCEEDED(hr))
    {
        ComPtr<IShellLink> shellLink;
        hr = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&shellLink));

        if (SUCCEEDED(hr))
        {
            hr = shellLink->SetPath(exePath);
            if (SUCCEEDED(hr))
            {
                hr = shellLink->SetArguments(L"");
                if (SUCCEEDED(hr))
                {
                    ComPtr<IPropertyStore> propertyStore;

                    hr = shellLink.As(&propertyStore);
                    if (SUCCEEDED(hr))
                    {
                        PROPVARIANT appIdPropVar;
                        hr = InitPropVariantFromString(AppId, &appIdPropVar);
                        if (SUCCEEDED(hr))
                        {
                            hr = propertyStore->SetValue(PKEY_AppUserModel_ID, appIdPropVar);
                            if (SUCCEEDED(hr))
                            {
                                hr = propertyStore->Commit();
                                if (SUCCEEDED(hr))
                                {
                                    ComPtr<IPersistFile> persistFile;
                                    hr = shellLink.As(&persistFile);
                                    if (SUCCEEDED(hr))
                                    {
                                        hr = persistFile->Save(shortcutPath, TRUE);
                                    }
                                }
                            }
                            PropVariantClear(&appIdPropVar);
                        }
                    }
                }
            }
        }
    }
    return hr;
}

备注

作为本主题中所示方法的替代方法,你可以使用 Windows Installer XML (WiX) 等框架来生成快捷方式并将其部署为 Windows Installer 的一部分。 在这种情况下,此代码应包含在 MSI 中,而不是包含在应用的代码中。 有关详细信息,请参阅 从桌面应用发送 Toast 通知 示例中包含的示例 WiX 配置文件。

快速入门:从桌面发送 Toast 通知

从桌面应用发送 toast 通知示例

应用程序用户模型 ID (AppUserModelIDs)

如何:安装 Windows Installer XML (WiX) Tools

Toast XML 架构

Toast 通知概述

快速入门:发送 Toast 通知

快速入门:发送 Toast 推送通知

Toast 通知指南和清单

如何将图像添加到 Toast 模板

如何检查 Toast 通知设置

如何选择和使用 Toast 模板

如何处理 Toast 通知中的激活

如何选择加入 Toast 通知

选择 Toast 模板

Toast 音频选项