如何通过 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 配置文件。
相关主题