sndPlaySound函数播放声音求指点

zxvivian 2014-03-11 08:22:43
我在VC6.0中建立了MFC(EXE)对话框工程,已经添加mmsystem.h头文件和winmm.lib库文件,工作目录也改为存放有音乐的文件夹,可是点击对话框音乐按钮的时候只有“登”的一声,以下是该函数,请问如何修改啊
void CMusicDlg::OnUpdatePlayMusic(CCmdUI* pCmdUI) 
{
BOOL bCheck=m_main_menu.GetMenuState(IDR_PLAY_MUSIC,MF_CHECKED);
if(m_bstart)
{
m_main_menu.CheckMenuItem(IDR_PLAY_MUSIC,MF_BYCOMMAND|(bCheck?MF_CHECKED:MF_UNCHECKED));
}
PlayBackMusic(!bCheck);
Invalidate();
}
void CMusicDlg::PlayBackMusic(BOOL bflg)
{
if(bflg)
{
sndPlaySound("music.wav",SND_ASYNC);//播放音乐
}
else
{
sndPlaySound(NULL,SND_PURGE);//停止播放
}
}
...全文
662 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovedeadyou 2016-08-05
  • 打赏
  • 举报
回复
竟然 跟我的那效果一样, 同样是小的声音文件(我用的12345678do、re、mi、fa、so、la、si音轨文件) 响起来没完 长的播放却正常
ycs361858643 2015-10-28
  • 打赏
  • 举报
回复
引用 18 楼 ZXvivian 的回复:
[quote=引用 17 楼 niceworkteam 的回复:] [quote=引用 9 楼 ZXvivian 的回复:] [quote=引用 6 楼 niceworkteam 的回复:]

	sndPlaySound("msg.wav",SND_ASYNC);    
我的程序里面就这一行代码播放的声音,成功播放。
我重新建了一个工程,就添加了这一行代码,还是只有“灯”的一声,你的wav文件多大啊[/quote] 那个文件就是 QQ 的wavmsg,也就是 滴滴滴滴滴滴 。哈哈[/quote] 但是我的没滴滴滴。。。。。。只有“登”,很像win7操作系统的声音,非常短暂的一声[/quote] 与文件大小关系不大,直接把wav文件拷贝到exe目录里面,然后 直接用msg.wav",不要加目录即可,实验可以了
zxvivian 2014-03-17
  • 打赏
  • 举报
回复
引用 21 楼 zhoujielunzhimi 的回复:
呵呵呵,我的可以听到 嘀嘀嘀

#include <Vfw.h>
#pragma comment(lib,"vfw32.lib")

class Ring
{
public:
	bool Init(HWND hwnd);
	void Play(CString song);
	void Stop();
	void Destroy();
private:
	HWND m_hWnd;
};

bool Ring::Init( HWND hwnd )
{
	m_hWnd = MCIWndCreateW(hwnd, NULL, WS_POPUP | MCIWNDF_NOERRORDLG, NULL);
	return (m_hWnd != NULL);
}

void Ring::Play(CString song)
{
	if(m_hWnd == NULL)
		return;
	DWORD ret = MCIWndOpen(m_hWnd, song.operator LPCTSTR(), 0);
	if(ret == 0)
		MCIWndPlay(m_hWnd);
}

void Ring::Stop()
{
	if(m_hWnd != NULL)
		MCIWndStop(m_hWnd);
}

void Ring::Destroy()
{
	Stop();
	if(m_hWnd != NULL)
		MCIWndDestroy(m_hWnd);
}

BOOL CRingDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	m_ring.Init(m_hWnd);

	return TRUE;
}

void CRingDlg::OnDestroy()
{
	CDialogEx::OnDestroy();

	m_ring.Destroy();
}

void CRingDlg::OnBnClickedOk()
{
	m_ring.Play(_T("msg.wav"));
}
有点怀疑你文件路径是否正确。 比如我上面这个程序,从vs运行时,msg.wav要和工程目录一样。直接双击运行,msg.wav要和exe目录一样。
我一直用的VC运行的,我再用VS试试,太蛋疼了,谢谢哈
zxvivian 2014-03-17
  • 打赏
  • 举报
回复
引用 20 楼 ZXvivian 的回复:
[quote=引用 19 楼 niceworkteam 的回复:] [quote=引用 18 楼 ZXvivian 的回复:] [quote=引用 17 楼 niceworkteam 的回复:] [quote=引用 9 楼 ZXvivian 的回复:] [quote=引用 6 楼 niceworkteam 的回复:]

	sndPlaySound("msg.wav",SND_ASYNC);    
我的程序里面就这一行代码播放的声音,成功播放。
我重新建了一个工程,就添加了这一行代码,还是只有“灯”的一声,你的wav文件多大啊[/quote] 那个文件就是 QQ 的wavmsg,也就是 滴滴滴滴滴滴 。哈哈[/quote] 但是我的没滴滴滴。。。。。。只有“登”,很像win7操作系统的声音,非常短暂的一声[/quote] 嗯,当时我那个也是在win7下写的,但是还是滴滴滴滴滴滴出来了。我就没怎么在乎了。楼主换了其他声音都是只有一声么?要不换换其他的方式播放?[/quote] 对 换了几个文件都是只有一声,也换了好几种方法播放了,wav,mp3格式的播放函数都试过,可惜每一个成功了。。[/quote] 是没一个成功。。
sumos 2014-03-17
  • 打赏
  • 举报
回复
再次强烈推荐此方法,因为此方法可以播放mp3,而且还是异步的。
sumos 2014-03-17
  • 打赏
  • 举报
回复
呵呵呵,我的可以听到 嘀嘀嘀

#include <Vfw.h>
#pragma comment(lib,"vfw32.lib")

class Ring
{
public:
	bool Init(HWND hwnd);
	void Play(CString song);
	void Stop();
	void Destroy();
private:
	HWND m_hWnd;
};

bool Ring::Init( HWND hwnd )
{
	m_hWnd = MCIWndCreateW(hwnd, NULL, WS_POPUP | MCIWNDF_NOERRORDLG, NULL);
	return (m_hWnd != NULL);
}

void Ring::Play(CString song)
{
	if(m_hWnd == NULL)
		return;
	DWORD ret = MCIWndOpen(m_hWnd, song.operator LPCTSTR(), 0);
	if(ret == 0)
		MCIWndPlay(m_hWnd);
}

void Ring::Stop()
{
	if(m_hWnd != NULL)
		MCIWndStop(m_hWnd);
}

void Ring::Destroy()
{
	Stop();
	if(m_hWnd != NULL)
		MCIWndDestroy(m_hWnd);
}

BOOL CRingDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	m_ring.Init(m_hWnd);

	return TRUE;
}

void CRingDlg::OnDestroy()
{
	CDialogEx::OnDestroy();

	m_ring.Destroy();
}

void CRingDlg::OnBnClickedOk()
{
	m_ring.Play(_T("msg.wav"));
}
有点怀疑你文件路径是否正确。 比如我上面这个程序,从vs运行时,msg.wav要和工程目录一样。直接双击运行,msg.wav要和exe目录一样。
zxvivian 2014-03-17
  • 打赏
  • 举报
回复
引用 19 楼 niceworkteam 的回复:
[quote=引用 18 楼 ZXvivian 的回复:] [quote=引用 17 楼 niceworkteam 的回复:] [quote=引用 9 楼 ZXvivian 的回复:] [quote=引用 6 楼 niceworkteam 的回复:]

	sndPlaySound("msg.wav",SND_ASYNC);    
我的程序里面就这一行代码播放的声音,成功播放。
我重新建了一个工程,就添加了这一行代码,还是只有“灯”的一声,你的wav文件多大啊[/quote] 那个文件就是 QQ 的wavmsg,也就是 滴滴滴滴滴滴 。哈哈[/quote] 但是我的没滴滴滴。。。。。。只有“登”,很像win7操作系统的声音,非常短暂的一声[/quote] 嗯,当时我那个也是在win7下写的,但是还是滴滴滴滴滴滴出来了。我就没怎么在乎了。楼主换了其他声音都是只有一声么?要不换换其他的方式播放?[/quote] 对 换了几个文件都是只有一声,也换了好几种方法播放了,wav,mp3格式的播放函数都试过,可惜每一个成功了。。
Walle_Oyq 2014-03-17
  • 打赏
  • 举报
回复
引用 18 楼 ZXvivian 的回复:
[quote=引用 17 楼 niceworkteam 的回复:] [quote=引用 9 楼 ZXvivian 的回复:] [quote=引用 6 楼 niceworkteam 的回复:]

	sndPlaySound("msg.wav",SND_ASYNC);    
我的程序里面就这一行代码播放的声音,成功播放。
我重新建了一个工程,就添加了这一行代码,还是只有“灯”的一声,你的wav文件多大啊[/quote] 那个文件就是 QQ 的wavmsg,也就是 滴滴滴滴滴滴 。哈哈[/quote] 但是我的没滴滴滴。。。。。。只有“登”,很像win7操作系统的声音,非常短暂的一声[/quote] 嗯,当时我那个也是在win7下写的,但是还是滴滴滴滴滴滴出来了。我就没怎么在乎了。楼主换了其他声音都是只有一声么?要不换换其他的方式播放?
zxvivian 2014-03-17
  • 打赏
  • 举报
回复
引用 17 楼 niceworkteam 的回复:
[quote=引用 9 楼 ZXvivian 的回复:] [quote=引用 6 楼 niceworkteam 的回复:]

	sndPlaySound("msg.wav",SND_ASYNC);    
我的程序里面就这一行代码播放的声音,成功播放。
我重新建了一个工程,就添加了这一行代码,还是只有“灯”的一声,你的wav文件多大啊[/quote] 那个文件就是 QQ 的wavmsg,也就是 滴滴滴滴滴滴 。哈哈[/quote] 但是我的没滴滴滴。。。。。。只有“登”,很像win7操作系统的声音,非常短暂的一声
Walle_Oyq 2014-03-17
  • 打赏
  • 举报
回复
引用 9 楼 ZXvivian 的回复:
[quote=引用 6 楼 niceworkteam 的回复:]

	sndPlaySound("msg.wav",SND_ASYNC);    
我的程序里面就这一行代码播放的声音,成功播放。
我重新建了一个工程,就添加了这一行代码,还是只有“灯”的一声,你的wav文件多大啊[/quote] 那个文件就是 QQ 的wavmsg,也就是 滴滴滴滴滴滴 。哈哈
zxvivian 2014-03-16
  • 打赏
  • 举报
回复
引用 15 楼 ZXvivian 的回复:
[quote=引用 14 楼 zhoujielunzhimi 的回复:] 非常简单: 在XXXDlg头文件定义一个变量 Ring m_ring; 在XXXDlg的OnInitDialog中 m_ring.Init(m_hWnd); 在按钮相应函数中 m_ring.Play(); 在XXXDlg的OnDestroy函数中 m_ring.Destory();
我的Dlg中没有OnDestory这个函数,所以没有destory,但是其他的都加了,还是没有声音。。而且连“登”也没有了 真心求解决啊!谢谢!![/quote] 我添加了OnDestroy函数,然后在里面调用了m_ring.Destory() 还是没有声音啊。会不会是我的VC6.0有问题??
zxvivian 2014-03-16
  • 打赏
  • 举报
回复
引用 14 楼 zhoujielunzhimi 的回复:
非常简单: 在XXXDlg头文件定义一个变量 Ring m_ring; 在XXXDlg的OnInitDialog中 m_ring.Init(m_hWnd); 在按钮相应函数中 m_ring.Play(); 在XXXDlg的OnDestroy函数中 m_ring.Destory();
我的Dlg中没有OnDestory这个函数,所以没有destory,但是其他的都加了,还是没有声音。。而且连“登”也没有了 真心求解决啊!谢谢!!
sumos 2014-03-16
  • 打赏
  • 举报
回复
非常简单: 在XXXDlg头文件定义一个变量 Ring m_ring; 在XXXDlg的OnInitDialog中 m_ring.Init(m_hWnd); 在按钮相应函数中 m_ring.Play(); 在XXXDlg的OnDestroy函数中 m_ring.Destory();
sumos 2014-03-15
  • 打赏
  • 举报
回复
mciSendString 只支持wav格式。把mp3转成wav后,文件大小剧增。

#include <Vfw.h>
#pragma comment(lib,"vfw32.lib")

class Ring
{
public:
	bool Init(HWND hwnd);
	void Play();
	void Stop();
	void Destroy();
private:
	std::wstring ring_;
	HWND hwnd_;
};

bool Ring::Init( HWND hwnd )
{
	ring_ = L"c:\\test.mp3";

	hwnd_ = MCIWndCreateW(hwnd, NULL, WS_POPUP | MCIWNDF_NOERRORDLG, NULL);
	if(hwnd_ == NULL)
	{
		DWORD err = GetLastError();
		return false;
	}
	else
		return true;
}

void Ring::Play()
{
	if(hwnd_ == NULL)
		return;

	DWORD ret = MCIWndOpen(hwnd_, ring_.c_str(), 0);
	if(ret == 0)
		MCIWndPlay(hwnd_);
	else
	{
		DWORD err = GetLastError();
	}
}

void Ring::Stop()
{
	if(hwnd_ != NULL)
		MCIWndStop(hwnd_);
}

void Ring::Destroy()
{
	if(hwnd_ != NULL)
		MCIWndDestroy(hwnd_);
}
zxvivian 2014-03-15
  • 打赏
  • 举报
回复
引用 12 楼 zhoujielunzhimi 的回复:
mciSendString 只支持wav格式。把mp3转成wav后,文件大小剧增。

#include <Vfw.h>
#pragma comment(lib,"vfw32.lib")

class Ring
{
public:
	bool Init(HWND hwnd);
	void Play();
	void Stop();
	void Destroy();
private:
	std::wstring ring_;
	HWND hwnd_;
};

bool Ring::Init( HWND hwnd )
{
	ring_ = L"c:\\test.mp3";

	hwnd_ = MCIWndCreateW(hwnd, NULL, WS_POPUP | MCIWNDF_NOERRORDLG, NULL);
	if(hwnd_ == NULL)
	{
		DWORD err = GetLastError();
		return false;
	}
	else
		return true;
}

void Ring::Play()
{
	if(hwnd_ == NULL)
		return;

	DWORD ret = MCIWndOpen(hwnd_, ring_.c_str(), 0);
	if(ret == 0)
		MCIWndPlay(hwnd_);
	else
	{
		DWORD err = GetLastError();
	}
}

void Ring::Stop()
{
	if(hwnd_ != NULL)
		MCIWndStop(hwnd_);
}

void Ring::Destroy()
{
	if(hwnd_ != NULL)
		MCIWndDestroy(hwnd_);
}
这段函数具体添加在哪?求指教
Walle_Oyq 2014-03-14
  • 打赏
  • 举报
回复

	sndPlaySound("msg.wav",SND_ASYNC);    
我的程序里面就这一行代码播放的声音,成功播放。
zxvivian 2014-03-14
  • 打赏
  • 举报
回复
引用 8 楼 zhoujielunzhimi 的回复:
建议不要使用sndPlaySound,推荐使用MCI方式,MCICreate等函数,这个可以支持MP3更多格式
刚刚查了半天,感觉还是不行啊
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib, "WINMM.LIB")
int main(int argc, char *argv[])
{
	mciSendString(TEXT("open let it go.mp3 alias mysong"), NULL, 0, NULL);
	mciSendString(TEXT("play MySong"), NULL, 0, NULL);
	Sleep(500000);
	return 0;
}
我是按照百度百科的例子写得,难道可以直接写open let it go.mp3吗,还没写目录啊,具体怎么改啊
zxvivian 2014-03-14
  • 打赏
  • 举报
回复
引用 7 楼 zdrone 的回复:
以为是同步函数的原因,顺序执行就过了。或者用线程或者用异步播放 下面是一个自己写的播放函数类,可以正常使用,供参考。
#include "StdAfx.h"
#include "BRSoundPlay.h"

CBRSoundPlay::CBRSoundPlay(void)
{
	m_hRecieveWnd=NULL;
}

CBRSoundPlay::~CBRSoundPlay(void)
{
}
BOOL CBRSoundPlay::OpenFile(LPCTSTR tscFileName)
{
	_tcscpy(m_tscFileName,tscFileName);
	MCI_OPEN_PARMS mciOpen;
	mciOpen.lpstrDeviceType = _T("mpegvideo"); 
	mciOpen.lpstrElementName = tscFileName; 

	Close();

	mciError = mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,(DWORD)&mciOpen); 
	if(mciError) 
	{ 
	  mciGetErrorString(mciError,tscErrorBuf,128); 
	  return FALSE;
	} 
	else
    {
	   DeviceID = mciOpen.wDeviceID ;
    }
	return TRUE;
}
BOOL CBRSoundPlay::Play()
{  
   MCI_PLAY_PARMS mciPlay; 
   if(m_hRecieveWnd)
   {
      //mciPlay.dwFrom =(DWORD) m_hRecieveWnd;
	  mciPlay.dwCallback=(DWORD) m_hRecieveWnd;
   }
   mciError = mciSendCommand(DeviceID,MCI_PLAY,MCI_NOTIFY ,(DWORD)&mciPlay); 
   if(mciError) 
   { 
	 mciGetErrorString(mciError,tscErrorBuf,128); 
     return FALSE; 
   }
  
   return TRUE;
}
BOOL CBRSoundPlay::Pause()
{
   MCI_PLAY_PARMS mciPlay; 
   mciError = mciSendCommand(DeviceID,MCI_PAUSE,0 ,(DWORD)&mciPlay); 
   if(mciError) 
   { 
	 mciGetErrorString(mciError,tscErrorBuf,128); 
     return FALSE; 
   }

   return TRUE;
}

BOOL CBRSoundPlay::Resume()
{ 
   MCI_PLAY_PARMS mciPlay; 
   mciError = mciSendCommand(DeviceID,MCI_RESUME,0 ,(DWORD)&mciPlay); 
   if(mciError) 
   { 
     mciGetErrorString(mciError,tscErrorBuf,128); 
     return FALSE; 
   }
   return TRUE;
}
BOOL CBRSoundPlay::Stop()
{   
   MCI_PLAY_PARMS mciPlay; 
   mciError = mciSendCommand(DeviceID,MCI_STOP,0 ,(DWORD)&mciPlay); 
   if(mciError) 
   { 
     mciGetErrorString(mciError,tscErrorBuf,128); 
     return FALSE; 
   }
   return TRUE;
}
BOOL CBRSoundPlay::Close()
{   
   MCI_PLAY_PARMS mciPlay; 
   mciError = mciSendCommand(DeviceID,MCI_CLOSE,0 ,(DWORD)&mciPlay); 
   if(mciError) 
   { 
     mciGetErrorString(mciError,tscErrorBuf,128); 
     return FALSE; 
   }
   return TRUE;
}
用这个就不需要播放音乐的API函数了?
zxvivian 2014-03-14
  • 打赏
  • 举报
回复
引用 6 楼 niceworkteam 的回复:

	sndPlaySound("msg.wav",SND_ASYNC);    
我的程序里面就这一行代码播放的声音,成功播放。
我重新建了一个工程,就添加了这一行代码,还是只有“灯”的一声,你的wav文件多大啊
sumos 2014-03-14
  • 打赏
  • 举报
回复
建议不要使用sndPlaySound,推荐使用MCI方式,MCICreate等函数,这个可以支持MP3更多格式
加载更多回复(6)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧