You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(&notifier));
                if (SUCCEEDED(hr)) {
                    notifier->Show(toast.Get());
                }
            }
        }
    }
    

排查要点

  • 若仍显示「New notification」:检查XML标签是否闭合、属性引号是否配对,音频元素的src格式是否正确。
  • 无声音:确认音频文件是PCM编码的WAV,资源ID与XML中的一致,系统通知音量未静音。

内容的提问来源于stack exchange,提问作者Benjamin Krausse DB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:03:31