C# 使用System.Media.SoundPlayer播放Windows系统声音

C# 使用System.Media.SoundPlayer播放Windows系统声音,c#,wpf,audio,C#,Wpf,Audio,System.Media.SoundPlayer是否可能无法播放在c:\Windows\Media中找到的Windows系统声音 我有密码: using (var soundPlayer = new SoundPlayer(@"c:\Windows\Media\Landscape\Windows Notify.wav")) { soundPlayer.Play(); } 但是当我运行这段代码时,我得到了一个错误: Sound API only supports p

System.Media.SoundPlayer
是否可能无法播放在c:\Windows\Media中找到的Windows系统声音

我有密码:

using (var soundPlayer = 
       new SoundPlayer(@"c:\Windows\Media\Landscape\Windows Notify.wav")) 
{ 
    soundPlayer.Play(); 
}
但是当我运行这段代码时,我得到了一个错误:

Sound API only supports playing PCM wave files.

我错过什么了吗?有没有办法从WPF应用程序播放这些文件?(不转换为PCM)

SystemSounds类包含以下预定义的系统声音:

星号 嘟嘟声 感叹号 手 问题:

例如,要播放停止:

System.Media.SystemSounds.Hand.Play();
所有其他声音都要求您从注册表中读取所需的声音,并使用如下代码播放:

SoundPlayer simpleSound = new SoundPlayer(@"c:\Windows\Media\Landscape\Windows Notify.wav");

SystemSounds类包含以下预定义的系统声音:

星号 嘟嘟声 感叹号 手 问题:

例如,要播放停止:

System.Media.SystemSounds.Hand.Play();
所有其他声音都要求您从注册表中读取所需的声音,并使用如下代码播放:

SoundPlayer simpleSound = new SoundPlayer(@"c:\Windows\Media\Landscape\Windows Notify.wav");

这是一个有趣的问题,但答案很简单。在阅读了关于这个问题的文章后,我尝试了你的代码,得到了同样的问题,所以我在网上搜索了一个解决方案。虽然没有找到确切的解决方案,但我确实在StackOverflow上找到了这篇文章,其中显示了一些代码,这些代码成功地播放了
Windows\Media
文件夹中的音频文件

我尝试了那个代码,它成功了,所以我必须找出为什么你的例子不起作用。我在音频编辑器中检查了确实播放的音频文件和您的notify音频文件之间的任何差异,但它们都肯定是WAV文件

我尝试从
Windows\Media\Landscape
文件夹播放不同的音频文件,但出现了相同的错误。然后,我尝试从
Windows\Media
文件夹中的不同子文件夹播放音频文件,但仍然收到相同的错误。然而,我随后注意到
Windows\Media
文件夹中的许多文件夹中都有相同的音频文件

这引起了我的思考,我最终意识到这些文件夹中的所有音频文件实际上都直接位于
Windows\Media
文件夹中。因此,您可以播放声音,但只需忽略子文件夹中的声音,播放
Windows\Media
文件夹中的声音即可。这将有助于:

SoundPlayer soundPlayer = new SoundPlayer(@"C:\Windows\Media\Windows Notify.wav");
soundPlayer.Play();

但是,我无法告诉您为什么会出现这种奇怪的错误,但我只能假设文件夹中的文件可能是指向
Windows\Media
文件夹中实际文件的某种链接,操作系统仅使用这些链接将其分为几类。。。这是一个有趣的问题,但有一个简单的答案。在阅读了关于这个问题的文章后,我尝试了你的代码,得到了同样的问题,所以我在网上搜索了一个解决方案。虽然没有找到确切的解决方案,但我确实在StackOverflow上找到了这篇文章,其中显示了一些代码,这些代码成功地播放了
Windows\Media
文件夹中的音频文件

我尝试了那个代码,它成功了,所以我必须找出为什么你的例子不起作用。我在音频编辑器中检查了确实播放的音频文件和您的notify音频文件之间的任何差异,但它们都肯定是WAV文件

我尝试从
Windows\Media\Landscape
文件夹播放不同的音频文件,但出现了相同的错误。然后,我尝试从
Windows\Media
文件夹中的不同子文件夹播放音频文件,但仍然收到相同的错误。然而,我随后注意到
Windows\Media
文件夹中的许多文件夹中都有相同的音频文件

这引起了我的思考,我最终意识到这些文件夹中的所有音频文件实际上都直接位于
Windows\Media
文件夹中。因此,您可以播放声音,但只需忽略子文件夹中的声音,播放
Windows\Media
文件夹中的声音即可。这将有助于:

SoundPlayer soundPlayer = new SoundPlayer(@"C:\Windows\Media\Windows Notify.wav");
soundPlayer.Play();
但是,我无法告诉您为什么会出现这种奇怪的错误,但我只能假设文件夹中的文件可能是指向
Windows\Media
文件夹中实际文件的某种链接,操作系统仅使用这些链接将其分为几类。。。或类似的东西。

“横向”指的是Windows“声音方案”,其中的wav文件由Windows操作系统使用。正如您已经确定的,这些文件不能直接使用

横向目录中的Windows Notify.wav文件大小与基本Windows\Media目录中的Windows Notify.wav文件大小的比较相当大;222KB对25.5KB--

如果进入“声音”控制面板小程序并浏览到“声音”选项卡,您将看到“声音方案:”的下拉列表,Windows\Media中的其他文件夹将显示在该列表中

我没有支持这一点的链接,但在以编程方式处理控制面板声音的无数个小时后,我会大胆猜测“声音方案”wav文件只包含相关数据(可能是效果数据),这些数据在运行时用于播放这些声音的修改版本。。。最后一部分我可能完全错了;这只是猜测。无论如何,您将无法在代码中直接使用这些声音方案文件

如果您必须播放Notify wav的“横向”版本,那么我建议您播放声音并将其保存到音频编辑器中的新wav文件中。您可以将wave文件添加到安装程序/部署项目中,以便将其播放到Windows\Media文件夹中,并直接以与以前相同的方式调用它。

“横向”指的是Windows“声音方案”,其中的wav文件由Windows操作系统使用。正如您已经确定的,这些文件不能直接使用

横向目录中的Windows Notify.wav文件大小与基本Windows\Media目录中的Windows Notify.wav文件大小的比较相当大