首页 > 解决方案 > 在 C++ 中使用 PlaySound() 更改 BGM

问题描述

因为是第一次使用这个功能(我是一个非常早的初学者,三个月前开始用c++编写代码),所以我想尝试一下,并取得了不同程度的成功:基本上,我的问题是通过在我的程序中,我首先使用 PlaySound() 函数,如下所示: PlaySound(MAKEINTRESOURCE(IDR_WAVE1), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC);

如您所见,该文件是我使用 VS2017 直接包含在我的项目中的资源。但问题不存在,因为声音本身可以正常播放。
当我尝试停止此声音并播放另一首歌曲(也在我的项目资源中)时,问题就出现了。我是这样做的:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC); Sleep(2000); PlaySound(MAKEINTRESOURCE(IDR_WAVE2), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC);
这是我测试 PlaySound 的工作原理的方式,但从根本上说,它是在我的程序中多次调用 playsound 函数的方式。问题是,当我运行它时,它会编译,但会给出一个内存访问冲突错误(法语,抱歉)。
所以我试着先停止播放第一个声音,然后播放第二个,像这样:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC); Sleep(2000); PlaySound(NULL, NULL, SND_ASYNC); PlaySound(MAKEINTRESOURCE(IDR_WAVE2), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC);
但我仍然遇到同样的错误。最后我搞砸了,发现像这样添加 SND_NOSTOP 标志:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC); Sleep(2000); PlaySound(NULL, NULL, SND_ASYNC); PlaySound(MAKEINTRESOURCE(IDR_WAVE2), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC | SND_NOSTOP); 没有导致错误运行正常,但是第二首歌曲从不播放,只是没有声音。

最后一点,我想补充一点,我尝试交换 IDR_WAVE1 和 IDR_WAVE2 并且它与互换的歌曲效果恰到好处,所以它(可能?)不是这里的原因。
感谢您的阅读!



感谢@TedLyngmo,我阅读了手册并将提供的示例用于工作代码:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1), GetModuleHandle(NULL), SND_RESOURCE | SND_LOOP | SND_ASYNC); PlaySound(NULL, 0, 0); PlaySound(MAKEINTRESOURCE(IDR_WAVE2), GetModuleHandle(NULL), SND_RESOURCE | SND_LOOP | SND_ASYNC | SND_NOSTOP);

标签: c++windowswinapiplaysoundwinmm

解决方案


推荐阅读