首先要添加头文件
#include "mmsystem.h"//导入声音头文件 #pragma comment(lib,"winmm.lib")//导入声音头文件库
1. 通过filename来定位文件播放
PlaySound(TEXT("c:\\crossing field.wav"), NULL, SND_FILENAME | SND_ASYNC); // TEXT()函数处理宽字符问题,SND_FILENAME标识采用文件名播放,SND_ASYNC标识异步播放,即PlaySound函数开始播放后便返回执行代码而不是等到播放完了再执行(此种方式对应SND_SYNC)
sndPlaySound(TEXT("c:\\crossing field.wav"), SND_FILENAME | SND_ASYNC);
这种方式依赖于外部文件,若文件位置改变,则无法正常播放,所以有接下来两种方法。
2. 通过资源文件播放
首先将wav文件添加进资源.rc文件,假设文件ID为IDR_WAVE1,则代码如下
PlaySound((LPCTSTR)IDR_WAVE1, NULL, SND_RESOURCE | SND_ASYNC | SND_LOOP); // 将文件ID强制转换为LPCTSTR型数据,然后标明是采用资源文件的形式播放(SND_RESOURCE),异步(SND_ASYNC),循环(SND_LOOP)
sndPlaySound((LPCTSTR)IDR_WAVE1, SND_RESOURCE | SND_ASYNC | SND_LOOP); // 同PlaySound
3. 通过加载进内存播放
首先找到资源文件
HRSRC hrsrc = FindResource(NULL, (LPCTSTR)IDR_WAVE1, TEXT("WAVE")); // IDR_WAVE1为文件ID,WAVE为文件ID所在文件夹名称
若成功则返回资源文件句柄,将其赋给hrsrc,失败返回NULL
接着加载资源文件
HGLOBAL hglobal = LoadResource(NULL, hrsrc); // 将第一步成功的句柄传给LoadResource作为参数,并得到HGLOBAL的实例hglobal
同样失败返回NULL
最后锁定资源同时得到该资源在内存中的首地址
LPCWSTR pBuffer = (LPCWSTR)LockResource(hglobal); // LockResource返回LPVOID型指针,强制转换为LPCWSTR型
拿到pBuffer后就可以调用PlaySound和sndPlaySound函数了
PlaySound(pBuffer, NULL, SND_MEMORY | SND_ASYNC | SND_LOOP); // SND_MEMORY表明播放内存中的声音数据
sndPlaySound(pBuffer, SND_MEMORY | SND_ASYNC | SND_LOOP);
第一种方式是外部调用,所以生成的exe文件很小,而第二种第三种会把wav文件压进exe文件,所以文件会变得特别大……