Win32 C++中如何为Windows桌面Toast通知添加自定义声音?
Win32桌面程序Toast通知添加自定义声音方案
1. 准备合规音频文件
- 必须是PCM编码的WAV文件,建议16位深度、22050/44100Hz采样率,单/立体声均可,时长不超过10秒(系统会截断过长音频)。
- 文件名尽量简洁,比如
custom_toast.wav。
2. 把音频加入项目资源
- 在Visual Studio里右键项目 → 添加 → 资源 → 点击「导入」,选中你的WAV文件。
- 弹出「自定义资源类型」对话框时,输入
WAVE作为类型,确认。 - 打开资源视图,右键刚添加的WAV资源,在属性里设置资源ID为
IDR_CUSTOM_TOAST_SOUND(用命名ID比数字ID更不容易出错)。
3. 编写正确的Toast XML
- 之前出现「New notification」是因为XML语法错误,必须保证结构完整合法。
- 音频元素的
src用ms-resource:///WAVE/[资源ID]格式,完整XML示例:<toast> <visual> <binding template="ToastGeneric"> <text>自定义声音通知</text> <text>这是Win32程序发出的带自定义音频的Toast</text> </binding> </visual> <audio src="ms-resource:///WAVE/IDR_CUSTOM_TOAST_SOUND" loop="false"/> </toast>
4. 发送通知的代码注意事项
- 用Win32的Toast API发送时,确保XML字符串没有转义错误,示例C++代码片段:
#include <windows.ui.notifications.h> #include <wrl/client.h> using namespace Microsoft::WRL; using namespace Windows::UI::Notifications; void SendCustomSoundToast() { // 构造XML字符串 const wchar_t* xmlContent = L"<toast><visual><binding template=\"ToastGeneric\"><text>标题</text><text>内容</text></binding></visual><audio src=\"ms-resource:///WAVE/IDR_CUSTOM_TOAST_SOUND\"/></toast>"; ComPtr<IXmlDocument> xmlDoc; HRESULT hr = CoCreateInstance(__uuidof(XmlDocument), nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&xmlDoc)); if (SUCCEEDED(hr)) { xmlDoc->LoadXml(xmlContent); ComPtr<IToastNotification> toast; hr = CoCreateInstance(__uuidof(ToastNotification), nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&toast)); if (SUCCEEDED(hr)) { toast->put_Content(xmlDoc.Get()); ComPtr<IToastNotifier> notifier; hr = ToastNotificationManager::CreateToastNotifierWithId(L"你的程序唯一ID")->QueryInterface(IID_PPV_ARGS(¬ifier)); if (SUCCEEDED(hr)) { notifier->Show(toast.Get()); } } } }
排查要点
- 若仍显示「New notification」:检查XML标签是否闭合、属性引号是否配对,音频元素的
src格式是否正确。 - 无声音:确认音频文件是PCM编码的WAV,资源ID与XML中的一致,系统通知音量未静音。
内容的提问来源于stack exchange,提问作者Benjamin Krausse DB
相关产品推荐
相关产品推荐

