因为只需在Windows上执行,先想到用MCI接口。试了一下,用mciSendCommand可以实现基本的播放wav文件的功能。但循环播放wav就麻烦了,必须向窗口传送MM_MCINOTIFY消息。

google了一下,才发现原来有更简单的方法——用sndPlaySound。一条语句sndPlaySound(filename, SND_ASYNC | SND_LOOP)就可以循环播放声音文件,完全满足我的要求。简单吧。

函数定义是:
BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound);

其中,lpszSound一般是wav文件的文件名,fuSound是参数。常见的fuSound参数有:
SND_ASYNC 异步播放,即程序不等播放结束就继续执行,播放背景声。
SND_SYNC 同步播放,即播放结束才继续执行
SND_LOOP 循环播放
SND_NODEFAULT 如果找不到指定文件,保持安静。如不指定此参数,则播放系统默认警告音。如没有默认警告音,则为失败。

执行成功返回TRUE,失败返回FALSE。

要停止播放只需再执行一遍lpszSound参数为NULL的sndPlaySound函数。

要求:
程序要加入Mmsystem.h,编译时链入Winmm.lib库。

限制:
sndPlaySound只能播放wav文件。
wav文件在播放前将被装入内存,所以不能太大。
只能同时播放一个声音。后一个声音会关闭前一个声音。

函数PlaySound是sndPlaySound的增强版,支持更多声音类型和fuSound参数,并可以播放内存和资源中的声音。

或者增加以下: 
#include <Mmsystem.h> 
#pragma comment(lib, "Winmm.lib")

PlaySound(...)

第一种方法是直接播出声音文件,相应的代码为: 
PlaySound("c:\win95\media\The Microsoft Sound.wav", NULL, SND_FILENAME | SND_ASYNC); 
注意参数中的路径使用两个连续的反斜杠转义代表一个反斜杠。

第二种方法是把声音文件加入到资源中,然后从资源中播放声音。Visual C++支持WAVE型资源,用户在资源视图中单击鼠标右键并选择Import命令,然后在文件选择对话框中选择The Microsoft Sound.wav文件,则该文件就会被加入到WAVE资源中。假定声音资源的ID为IDR_STARTWIN,则下面的调用同样会输出启动声音: 
PlaySound((LPCTSTR)IDR_STARTWIN, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC);

第三种方法是用PlaySound播放系统声音,Windows启动的声音是由SystemStart定义的系统声音,因此可以用下面的方法播放启动声音: 
PlaySound("SystemStart",NULL,SND_ALIAS|SND_ASYNC);

sndPlaySound不能直接播放声音资源。要用该函数播放WAVE文件,可按下面的方式调用: 
sndPlaySound(“MYSOUND.WAV”,SND_ASYNC);

360Doc 方案

一.播放声音文件的简单方法
  在VC++ 中的多媒体动态连接库中提供了一组与音频设备有关的函数。利用这些函数可以方便地播放声音。最简单的播放声音方法就是直接调用VC++中提供的声音播放函数BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound ); 或BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound );其中参数lpszSound是需要播放声音的.WAV文件的路径和文件名, hmod在这里为NULL,fuSound是播放声音的标志,具体说明请参考VC++中的帮助。例如播放C:\sound\music.wav可以用sndPlaySound ("c:\\sound\\music.wav",SND_ASYNC);或PlaySound("c:\\sound\\music.wav",NULL, SND_ASYNC|SND_NODEFAULT );假如没有找到music.wav文件,第一种格式将播放系统默认的声音,第二种格式不会播放系统默认的声音。

二.将声音文件加入到程序中
  在VC++的程序设计中,可以利用各种标准的资源,如位图,菜单,对话框等。同时VC++也答应用户自定义资源,因此我们可以将声音文件作为用户自定义资源加入程序资源文件中,经过编译连接生成EXE文件,实现无.WAV文件的声音播放。
  要实现作为资源的声音文件的播放,首先要在资源管理器中加入待播放的声音文件(实现过程并不复杂,这里不在叙述)。假设生成的声音文件资源标识符为IDR_WAVE1。在播放时只需要调用下面的语句:
  PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),   SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);
  其中MAKEINTRESOURCE()宏将整数资源标识符转变为字符串,AfxGetResourceHandle()函数返回包含资源的模块句柄,
SND_RESOURCE是必须的标志。
  作为资源的声音文件的第二种播放方法是把资源读入内存后作为内存数据播放。具体步骤入下:
  1.获得包含资源的模块句柄:
  HMODULE hmod=AfxGetResourceHandle();
  2.检索资源块信息:
  HRSRC hSndResource=FindResource(hmod,MAKEINTRESOURCE(IDR_WAVE1),_T("WAVE"));
  3. 装载资源数据并加锁:
  HGLOBAL hGlobalMem=LoadResource(hmod,hSndResource);
LPCTSTR lpMemSound=(LPCSTR)LockResource(hGlobalMem);
  4.播放声音文件:
  sndPlaySound(lpMemSound,SND_MEMORY));
  5.释放资源句柄:
  FreeResource(hGlobalMem);

第三种方法是用PlaySound播放系统声音,Windows启动的声音是由SystemStart定义的系统声音,因此可以用下面的方法播放启动声音:
PlaySound("SystemStart",NULL,SND_ALIAS|SND_ASYNC);
函数sndPlaySound的功能与PlaySound类似,但少了一个参数。函数的声明为:
BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound);
除了不能指定资源名字外,参数lpszSound与PlaySound的是一样的。参数fuSound是如何播放声音的标志,可以是SND_ASYNC、SND_LOOP、SND_MEMORY、SND_NODEFAULT、SND_NOSTOP和SND_SYNC的组合,这些标志的含义与PlaySound的一样。
可以看出,sndPlaySound不能直接播放声音资源。要用该函数播放WAVE文件,可按下面的方式调用

=================================================================================

一、PlaySound函数的声明为:

BOOL PlaySound(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound);

参数说明:

pszSound:是指定了要播放声音的字符串,该参数可以是WAVE文件的名字,或是WAVE资源的名字,或是内存中声音数据的指针,或是在系统注册表WIN.INI中定义的系统事件声音.假如该参数为NULL则停止正在播放的声音.

hmod:是应用程序的实例句柄,当播放WAV资源时要用到该参数,否则它必须为NULL.

fdwSound: 是标志的组合,如下表所示。若成功则函数返回TRUE,否则返回FALSE。
二、播放标志以及含义:

SND_APPLICATION
用应用程序指定的关联来播放声音。

SND_ALIAS
pszSound参数指定了注册表或WIN.INI中的系统事件的别名。

SND_ALIAS_ID
pszSound参数指定了预定义的声音标识符。

SND_ASYNC
用异步方式播放声音,PlaySound函数在开始播放后立即返回。

SND_FILENAME
pszSound参数指定了WAVE文件名。

SND_LOOP
反复播放声音,必须与SND_ASYNC标志一块使用。

SND_MEMORY
播放载入到内存中的声音,此时pszSound是指向声音数据的指针。

SND_NODEFAULT
不播放缺省声音,若无此标志,则PlaySound在没找到声音时会播放缺省声音。

SND_NOSTOP
PlaySound不打断原来的声音播出并立即返回FALSE。

SND_NOWAIT
假如驱动程序正忙则函数就不播放声音并立即返回。
SND_PURGE
停止所有与调用任务有关的声音。若参数pszSound为NULL,就停止所有的声音,否则,停止pszSound指定的声音。
SND_RESOURCE
pszSound参数是WAVE资源的标识符,这时要用到hmod参数。
SND_SYNC
同步播放声音,在播放完后PlaySound函数才返回。

三、函数使用方法及代码:

注重:在使用函数前要加入:

#include "mmsystem.h"//导入声音头文件

#pragma comment(lib,"winmm.lib")//导入声音头文件库

1、直接播出声音文件:

PlaySound("c:\\win95\\media\\The Microsoft Sound.wav", NULL, SND_FILENAME | SND_ASYNC);
注重:参数中的路径使用两个连续的反斜杠转义代表一个反斜杠。

2、把声音文件加入到资源中,然后从资源中播放声音:

Visual C++支持WAVE型资源,用户在资源视图中单击鼠标右键并选择Import命令,然后在文件选择对话框中选择The Microsoft Sound.wav文件,则该文件就会被加入到WAVE资源中。假定声音资源的ID为IDR_STARTWIN,则下面的调用同样会输出启动声音:
PlaySound((LPCTSTR)IDR_STARTWIN, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC);

或:

PlaySound(MAKEINTRESOURCE(IDR_WAVE2),AfxGetResourceHandle(),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);//将声音文件写入到程序中
3、用PlaySound播放系统声音:

Windows启动的声音是由SystemStart定义的系统声音,因此可以用下面的方法播放启动声音:
PlaySound("SystemStart",NULL,SND_ALIAS|SND_ASYNC);

sndPlaySound函数的声明为:
BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound);

用法:

除了不能指定资源名字外,参数lpszSound与PlaySound的是一样的。参数fuSound是如何播放声音的标志,可以是SND_ASYNC、SND_LOOP、SND_MEMORY、SND_NODEFAULT、SND_NOSTOP和SND_SYNC的组合,这些标志的含义与PlaySound的一样。
可以看出,sndPlaySound不能直接播放声音资源。要用该函数播放WAVE文件,可按下面的方式调用:
sndPlaySound("MYSOUND.WAV",SND_ASYNC);

VC++中播放声音wav相关推荐

  1. VC中使用低级音频函数WaveX播放声音文件

    文章摘要: 本文讨论并实现了在VC++中使用低级音频函数WaveX播放声音文件的方法. -------------------------------------------------------- ...

  2. android打开wav格式,FileNotFoundException从Android资产中打开wav文件

    在我们的android应用程序中,我们打开位于assets/config/notification.wav中的wav文件.要打开和播放声音,我们使用下面的代码:FileNotFoundExceptio ...

  3. VC++中使用使用winnet类获取网页内容

    2005-09-01 VC++中使用使用winnet类获取网页内容 - [VC专栏] 微软提供的Winnet类是一个应用层的网络通信组件, 它可以使你的应用程序很容易的实现http.ftp.gophe ...

  4. 我学习VC中所得的点点心得

    1  toolbar默认位图左上角那个点的颜色是透明色,不喜欢的话可以自己改. 2  VC++中 WM_QUERYENDSESSION WM_ENDSESSION 为系统关机消息. 3  Java学习 ...

  5. 学习VC中所得的点点心

    我学习VC中所得的点点心得,有新的内容我会慢慢补上的 1  toolbar默认位图左上角那个点的颜色是透明色,不喜欢的话可以自己改. 2  VC++中 WM_QUERYENDSESSION WM_EN ...

  6. VC中基于 Windows 的精确定时

    方式一:VC中的WM_TIMER消息映射能进行简单的时间控制.首先调用函数SetTimer()设置定时 间隔,如SetTimer(0,200,NULL)即为设置200ms的时间间隔.然后在应用程序中增 ...

  7. vc中常用文件操作(二) Ini文件操作

    在我们写的程序当中,总有一些配置信息需要保存下来,以便完成程序的功能,最简单的办法就是将这些信息写入INI文件中,程序初始化时再读入.具体应用如下: 一.将信息写入.INI文件中. 1.所用的WINA ...

  8. VC++中GlobalAlloc()、malloc()和new()函数之间区别

    VC++中GlobalAlloc().malloc()和new()函数都可以用来实现内存的动态分配,那么它们之间有什么区别呢? 三者的区别主要有以下几点: 1.GlobalAlloc()函数在程序的堆 ...

  9. c 语言 多进程,VC++中进程与多进程管理的方法详解

    本文实例讲述了VC++中进程与多进程管理的方法,分享给大家供大家参考.具体方法分析如下: 摘要: 本文主要介绍了多任务管理中的多进程管理技术,对进程的互斥运行.子进程的创建与结束等作了较详细的阐述. ...

最新文章

  1. C\S B\S 结果,其实就是这个样子的。
  2. 【AutoML】强化学习如何用于自动模型设计(NAS)与优化?
  3. leetcode之Climbing Stairs爬楼梯
  4. JavaScript push(),join() 函数
  5. android studio导入eclipse项目各种问题,Android | 导入Eclipse项目到Android studio的问题解决全过程...
  6. Python菜鸟之路:原生Ajax/Jquery Ajax/IFrame Ajax的选用
  7. linux基础(四)——任务调度cron和anacron
  8. u盘修复计算机w7,制作win7系统修复u盘的方法
  9. 显示器是计算机多媒体的什么设备,多媒体输入设备有哪些
  10. JAVAEE工程师-2年经验-个人简历
  11. Keil4 keil5兼容
  12. 概率论基础-严士健 第二版 习题与补充3.3答案
  13. php轻松入门视频教程,PHP轻松入门视频教程
  14. 服务器系统0 c000000f,win10系统提示错误代码0xc000000f的三种解决方法
  15. 【Spinning up】零、DRLib:一个简洁的强化学习库,集成了HER和PER
  16. 【CST】贴片天线阵列设计
  17. 黑客劫持域名步骤大曝光
  18. 以太坊平台增加类 CrytoNote 环签名
  19. 数据分析实战平台分享
  20. 少儿编程电子学会图形化scratch编程等级考试四级真题答案解析(选择题)2021-3

热门文章

  1. Android SDK下载与安装(仅支持jdk1.8及以下)
  2. Java 数据库连接池C3P0,德鲁伊(Druid)的详解
  3. CPP----高质量编程100例
  4. url 中文字符参数 php,php处理带有中文URL的方法
  5. 机器人开发实践源码编译报错问题解决方法
  6. Unity编译器 《策划表编表工具》 Excel转Json自动生成解析c#代码
  7. 基于springboot的信息化药品管理系统
  8. 一键部署openvpn服务端和客户端(已写成脚本)
  9. 一款超好看的个人主页HTML源码
  10. 如何选择第三方物流供应商?