windows 通过读取注册表 hkey_current_user\appevents\schemes\apps.default\notification.current 获取通知声音绝对路径,需判空且校验文件存在性。

Windows 上怎么拿到系统通知声音路径?
Windows 的事件声音(比如“通知”“邮件到达”)实际是注册表里存的绝对路径,不是 API 直接返回的。调用 SystemParametersInfo 或 GetSoundEvent 都拿不到真实文件路径——它们只返回事件名或是否启用。真要查路径,得自己读注册表。
- 关键路径是
HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default\Notification\,后面加.Current后缀的值就是当前启用的声音文件全路径 - 注意:这个键可能不存在(用户设为“无声音”),此时值为空或根本没这个子项,代码必须判空
- 别硬编码
.Default—— 有些软件会改用自定义应用名(如MyApp),但系统通知默认走这个 - 需要
RegOpenKeyEx+RegQueryValueEx,权限没问题(读 HKCU 不需要管理员)
macOS 怎么查通知声音?
macOS 没有统一“系统通知声音路径”的概念。它分两层:一是系统偏好设置里选的“提醒声”,二是 App 自己指定的 soundName(比如 "Ping")。前者路径藏在 ~/Library/Preferences/com.apple.sound.plist 里,但它是二进制 plist,且字段名不固定(比如叫 com.apple.sound.uiaudio 或 com.apple.sound.notification),不稳定。
- 真正靠谱的做法是用
NSUserNotification(旧)或UNUserNotificationCenter(新)的getNotificationSettings,但它只告诉你“是否允许声音”,不暴露路径 - 如果非要拿到实际播放的音频文件,只能 fallback 到硬编码常见路径:
/System/Library/Sounds/下的Ping.aiff、Pop.aiff等,再拼上用户选择的名称(从NSUserDefaults读com.apple.sound.uiaudio字符串) - 注意:macOS 12+ 默认禁用对
~/Library/Preferences/的完全访问,沙盒 App 读不到,必须声明com.apple.security.files.user-selected.read-only权限并让用户手动选一次
Linux(GNOME/KDE)有没有通用方案?
没有。Linux 桌面环境碎片化严重,GNOME 用 GSettings 存通知音效(org.gnome.desktop.sound 下的 event-sounds 和 theme-name),KDE 走 ~/.config/kdeglobals 或 KConfig API,而命令行工具(canberra-gtk-play)压根不记录路径,只按 name 查 theme 里的资源。
- 最现实的做法是放弃“查路径”,改为“查是否启用 + 猜默认路径”:先看
gsettings get org.gnome.desktop.sound event-sounds是否为true,再拼/usr/share/sounds/gnome/default/alerts/+ 主题名 +.oga - 别依赖
libnotify的 API —— 它只负责发通知,不提供配置查询接口 - Wayland 下连
xprop都不可靠,更别说跨桌面统一了
C++ 跨平台封装要注意什么?
直接写一套“自动适配三端”的函数容易翻车,因为三者底层机制完全不同:Windows 是注册表路径,macOS 是 plist + 硬编码 fallback,Linux 是 GSettings + 主题路径拼接。强行抽象会掩盖差异,反而让 bug 更难定位。
立即学习“C++免费学习笔记(深入)”;
- 不要设计
getSystemNotificationSoundPath()这种统一接口 —— 它在 Linux 上永远返回空,在 macOS 上可能错读成旧 key 名 - 推荐按平台条件编译,每个分支只处理自己能确定的事:Windows 返回注册表值(带存在性检查),macOS 返回
NSUserDefaults读出的 soundName + 固定前缀,Linux 返回gsettings命令执行结果 + 拼接逻辑 - 所有路径返回前必须用
std::filesystem::exists()校验,尤其 macOS 的Ping.aiff在某些版本里被移除了,Linux 主题目录也可能缺失 - 别忘了用户可能禁用了声音 —— 此时路径存在但不该播放,需额外查开关状态(Windows 读
SoundSchemes,macOS 查NSUserNotificationSettings)










