9 个解决方案
#1
加一个定时器
如:SetTimer(1,100,NULL);//每0.1秒检查一次
定时器里:
获取当前文件播放的的播放进度
如果进度=0,那么再重新播放文件
如:SetTimer(1,100,NULL);//每0.1秒检查一次
定时器里:
获取当前文件播放的的播放进度
如果进度=0,那么再重新播放文件
#2
哇,好主意
#3
哇,好主意,等我试试
#4
应该是判断当前的进度 大于等于 文件的长度
#5
发送play命令时设置MCI_NOTIFY标志,在播放完毕后会发送一个通知,
MCI_PLAY_PARMS mciPlay;
mciPlay.dwCallback = (DWORD)hWnd; <== 通知消息的目标窗口句柄, 我们这里假设是一个对话框CDlg
mciSendCommand( m_mciOpenParms.wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)&mciPlay);
然后在对话框类CDlg中添加消息响应函数
ON_MESSAGE( MM_MCINOTIFY, &CDlg::OnMciNotify)
...
LRESULT CDlg::OnMciNotify(WPARAM wParam, LPARAM lParam)
{
if ( wParam == MCI_NOTIFY_SUCCESSFUL )
{
//重新定位到文件的起始位置
MCI_SEEK_PARMS parms;
mciSendCommand( m_mciOpenParms.wDeviceID, MCI_SEEK, MCI_WAIT | MCI_SEEK_TO_START , (DWORD)&parms );
// 重新发送 play 命令
play();
return 0L;
}
MCI_PLAY_PARMS mciPlay;
mciPlay.dwCallback = (DWORD)hWnd; <== 通知消息的目标窗口句柄, 我们这里假设是一个对话框CDlg
mciSendCommand( m_mciOpenParms.wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)&mciPlay);
然后在对话框类CDlg中添加消息响应函数
ON_MESSAGE( MM_MCINOTIFY, &CDlg::OnMciNotify)
...
LRESULT CDlg::OnMciNotify(WPARAM wParam, LPARAM lParam)
{
if ( wParam == MCI_NOTIFY_SUCCESSFUL )
{
//重新定位到文件的起始位置
MCI_SEEK_PARMS parms;
mciSendCommand( m_mciOpenParms.wDeviceID, MCI_SEEK, MCI_WAIT | MCI_SEEK_TO_START , (DWORD)&parms );
// 重新发送 play 命令
play();
return 0L;
}
#6
mci函数有一个获取播放状态的函数,可以利用一下
TCHAR songstatus[MAX_PATH];
TCHAR resName[MAX_PATH+20];
wsprintf(resName,"status %s mode",shortPathName);
mciSendString(resName,songstatus,MAX_PATH,0);
switch(cycle)
{
case 2://列表循环
if(strcmp(songstatus,"playing")==0)
{
}
else
{
if(strcmp(songstatus,"stopped")==0)
{
PlayNextSong3(hwnd);
}
}
break;
}
//循环播放模式
void PlayNextSong3(HWND hwnd)
{
TCHAR resName[MAX_PATH+10];
TCHAR buf[MAX_PATH];
indexSong=SendDlgItemMessage(hwnd,ID_LB,LB_GETCURSEL,0,0);
SendDlgItemMessage(hwnd,ID_LB,LB_GETTEXT,indexSong,(LPARAM)currentSong);
lstrcpy(preSongName,currentSong);
StopMusic(hwnd,preSongName);
indexSong+=1;
if(indexSong+1>count)
{
SendDlgItemMessage(hwnd,ID_LB,LB_SETCURSEL,-1,0);
PlayNextSong2(hwnd);
}
else
{
SendDlgItemMessage(hwnd,ID_LB,LB_SETCURSEL,indexSong,0);
SendDlgItemMessage(hwnd,ID_LB,LB_GETTEXT,indexSong,(LPARAM)currentSong);
GetShortPathName(currentSong,shortPathName,MAX_PATH);
wsprintf(resName,"play %s",shortPathName);
mciSendString(resName,buf,sizeof(buf),NULL);
GetLength(hwnd,currentSong);
}
}
#7
当然你需要一个定时器每隔1秒钟看看歌曲是否停止
#8
综合一下下~~~~
#9
还是5楼的方法更加好,设置定时器会影响软件运行的效率
#1
加一个定时器
如:SetTimer(1,100,NULL);//每0.1秒检查一次
定时器里:
获取当前文件播放的的播放进度
如果进度=0,那么再重新播放文件
如:SetTimer(1,100,NULL);//每0.1秒检查一次
定时器里:
获取当前文件播放的的播放进度
如果进度=0,那么再重新播放文件
#2
哇,好主意
#3
哇,好主意,等我试试
#4
应该是判断当前的进度 大于等于 文件的长度
#5
发送play命令时设置MCI_NOTIFY标志,在播放完毕后会发送一个通知,
MCI_PLAY_PARMS mciPlay;
mciPlay.dwCallback = (DWORD)hWnd; <== 通知消息的目标窗口句柄, 我们这里假设是一个对话框CDlg
mciSendCommand( m_mciOpenParms.wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)&mciPlay);
然后在对话框类CDlg中添加消息响应函数
ON_MESSAGE( MM_MCINOTIFY, &CDlg::OnMciNotify)
...
LRESULT CDlg::OnMciNotify(WPARAM wParam, LPARAM lParam)
{
if ( wParam == MCI_NOTIFY_SUCCESSFUL )
{
//重新定位到文件的起始位置
MCI_SEEK_PARMS parms;
mciSendCommand( m_mciOpenParms.wDeviceID, MCI_SEEK, MCI_WAIT | MCI_SEEK_TO_START , (DWORD)&parms );
// 重新发送 play 命令
play();
return 0L;
}
MCI_PLAY_PARMS mciPlay;
mciPlay.dwCallback = (DWORD)hWnd; <== 通知消息的目标窗口句柄, 我们这里假设是一个对话框CDlg
mciSendCommand( m_mciOpenParms.wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)&mciPlay);
然后在对话框类CDlg中添加消息响应函数
ON_MESSAGE( MM_MCINOTIFY, &CDlg::OnMciNotify)
...
LRESULT CDlg::OnMciNotify(WPARAM wParam, LPARAM lParam)
{
if ( wParam == MCI_NOTIFY_SUCCESSFUL )
{
//重新定位到文件的起始位置
MCI_SEEK_PARMS parms;
mciSendCommand( m_mciOpenParms.wDeviceID, MCI_SEEK, MCI_WAIT | MCI_SEEK_TO_START , (DWORD)&parms );
// 重新发送 play 命令
play();
return 0L;
}
#6
mci函数有一个获取播放状态的函数,可以利用一下
TCHAR songstatus[MAX_PATH];
TCHAR resName[MAX_PATH+20];
wsprintf(resName,"status %s mode",shortPathName);
mciSendString(resName,songstatus,MAX_PATH,0);
switch(cycle)
{
case 2://列表循环
if(strcmp(songstatus,"playing")==0)
{
}
else
{
if(strcmp(songstatus,"stopped")==0)
{
PlayNextSong3(hwnd);
}
}
break;
}
//循环播放模式
void PlayNextSong3(HWND hwnd)
{
TCHAR resName[MAX_PATH+10];
TCHAR buf[MAX_PATH];
indexSong=SendDlgItemMessage(hwnd,ID_LB,LB_GETCURSEL,0,0);
SendDlgItemMessage(hwnd,ID_LB,LB_GETTEXT,indexSong,(LPARAM)currentSong);
lstrcpy(preSongName,currentSong);
StopMusic(hwnd,preSongName);
indexSong+=1;
if(indexSong+1>count)
{
SendDlgItemMessage(hwnd,ID_LB,LB_SETCURSEL,-1,0);
PlayNextSong2(hwnd);
}
else
{
SendDlgItemMessage(hwnd,ID_LB,LB_SETCURSEL,indexSong,0);
SendDlgItemMessage(hwnd,ID_LB,LB_GETTEXT,indexSong,(LPARAM)currentSong);
GetShortPathName(currentSong,shortPathName,MAX_PATH);
wsprintf(resName,"play %s",shortPathName);
mciSendString(resName,buf,sizeof(buf),NULL);
GetLength(hwnd,currentSong);
}
}
#7
当然你需要一个定时器每隔1秒钟看看歌曲是否停止
#8
综合一下下~~~~
#9
还是5楼的方法更加好,设置定时器会影响软件运行的效率