在C ++中使用PlaySound()更改背景音乐

时间:2018-12-18 23:15:11

标签: c++ windows winapi playsound winmm

因为这是我第一次使用此功能(我是一个非常初级的初学者,三个月前开始用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工作原理的方式,但从根本上讲,这是我的程序中多次调用playound函数的方式。问题是,当我运行它时,它会编译,但给出一个memory access violation error(以法语表示,抱歉)。
所以我试图先停止播放第一个声音,然后播放第二个声音,如下所示:
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);

0 个答案:

没有答案