请教WINFORM里的音乐连续播放问题!

kof9032 2008-09-24 09:54:05
我用WINFORM写了个小程序,界面一打开就播放音乐,我的音乐地址是从数据库里读出来的,因为有多条路径,所以每次打开调用一次播放的方法,但是考虑到页面一直开着音乐会有播放结束的问题,所以想让音乐在播放结束后再自动调用音乐播放的方法,但是不知道怎么判断结束,及怎样重新调用!希望能给个思路及SIMPLE,在此多谢了啊~~
...全文
1245 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
pclove2010 2010-09-16
  • 打赏
  • 举报
回复
我也要添加声音啊..研究中啊..
baihe_591 2008-09-27
  • 打赏
  • 举报
回复

private void timer1_Tick(object sender, EventArgs e)
{
if (playList.Count == 0)//playlist为我用来保存音乐路径的arraylist
return;
if (cmci.IsPlaying() == Media.Playstate.Stopped)
{
playIndex++;//playIndex为现在播放的是第几首音乐
if (playIndex >= playList.Count)
playIndex = 0;

cmci.OpenMusic((string)playList[playIndex], this.Handle);
cmci.PlayMusic();
}
}

//IsPlaying做了修改.
public Playstate IsPlaying()
{

Playstate isPlaying = Playstate.Stopped;

try
{

durLength = "";

durLength = durLength.PadLeft(128, Convert.ToChar(" "));

int RefInt = mciSendString("status NOWMUSIC mode", durLength, durLength.Length, 0);

durLength = durLength.Trim();

if (durLength.Substring(0, 7) == "playing" || durLength.Substring(0, 2) == "播放")

isPlaying = Playstate.Playing;

else if (durLength.Substring(0, 7) == "stopped" || durLength.Substring(0, 2) == "停止")

isPlaying = Playstate.Stopped;

else isPlaying = Playstate.Pause;
}
catch
{
}

return isPlaying;

}

kof9032 2008-09-27
  • 打赏
  • 举报
回复
现在的问题是durLength这个提示越界了???
实在不知道什么原因?
baihe_591 2008-09-27
  • 打赏
  • 举报
回复
NOWMUSIC 是我为打开的音乐取的一个别名.

这样吧,我用mcisendstring写一个循环播放音乐的代码,你有油箱吗?
baihe_591 2008-09-27
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 kof9032 的回复:]
因为我是窗体登陆时从数据库中读取音乐的路径,而且每次登陆时都是随机获取的路径,这样的话如果窗体不关闭一首音乐放完后就需要重新调用音乐的播放,所以没有用的播放列表的问题啊???该如何实现啊??
[/Quote]


道理都一样拉,一首音乐播放完肯定得重新打开下一首啊,那timer中检测 到stopped,播放下一首不就行了!

举一反三.
ZengHD 2008-09-27
  • 打赏
  • 举报
回复
还没结啊?
kof9032 2008-09-27
  • 打赏
  • 举报
回复
因为我是窗体登陆时从数据库中读取音乐的路径,而且每次登陆时都是随机获取的路径,这样的话如果窗体不关闭一首音乐放完后就需要重新调用音乐的播放,所以没有用的播放列表的问题啊???该如何实现啊??
ZengHD 2008-09-26
  • 打赏
  • 举报
回复
不用你调用,系统自己会调用,你先试试行不行吧
kof9032 2008-09-26
  • 打赏
  • 举报
回复
WndProc这个方法该在什么地方调用呢??
kof9032 2008-09-26
  • 打赏
  • 举报
回复
不行的,提示该方法
ref System.Windows.Forms.Message m
未找到适合的方法。
kof9032 2008-09-26
  • 打赏
  • 举报
回复
我不是很明白,既然为空,它如何得到字节的?而且我这里始终都报字节长度超出索引
我很想知道到底什么时候才能自动获取这个值,查看代码空值就已经开始截取了??不知何意,关键现在是长度报错,望高手帮忙~~~
kof9032 2008-09-26
  • 打赏
  • 举报
回复
我不是很明白,既然为空,它如何得到字节的?而且我这里始终都报字节长度超出索引
我很想知道到底什么时候才能自动获取这个值,查看代码空值就已经开始截取了??不知何意,关键现在是长度报错,望高手帮忙~~~
baihe_591 2008-09-26
  • 打赏
  • 举报
回复
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]

private string durLength = "";

用于mcisendstring返回值.



kof9032 2008-09-26
  • 打赏
  • 举报
回复
请问durLength这是在哪声明的,是做什么用的?
baihe_591 2008-09-26
  • 打赏
  • 举报
回复
baihe_591 2008-09-26
  • 打赏
  • 举报
回复
然后在播放界面放一个timer控件,隔500ms检测一次playstate
ZengHD 2008-09-26
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 kof9032 的回复:]
不行的,提示该方法
ref System.Windows.Forms.Message m
未找到适合的方法。
[/Quote]
WndProc要放到窗口里
baihe_591 2008-09-26
  • 打赏
  • 举报
回复
呵呵,用mcisendstring的话,就自己设置一个属性playstate.


public enum Playstate : byte
{
Stopped = 1,
Playing = 2,
Pause = 3
}


/// <summary>

/// 获得当前媒体的状态是不是在播放

/// </summary>

/// <returns></returns>

public Playstate IsPlaying()

{

Playstate isPlaying=Playstate .Stopped ;

durLength = "";

durLength = durLength.PadLeft(128, Convert.ToChar(" "));

int RefInt= mciSendString("status NOWMUSIC mode", durLength, durLength.Length, 0);

durLength = durLength.Trim();

if (durLength.Substring(0, 7) == "playing" || durLength.Substring(0, 2) == "播放")

isPlaying = Playstate.Playing;

else if (durLength.Substring(0, 7) == "stopped" || durLength.Substring(0, 2) == "停止")

isPlaying = Playstate.Stopped;

else isPlaying = Playstate.Pause;



return isPlaying;

}



ZengHD 2008-09-25
  • 打赏
  • 举报
回复
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern int GetShortPathName(string lpszLongPath, StringBuilder shortFile, int cchBuffer);

[DllImport("winmm.dll", EntryPoint = "mciSendString", CharSet = CharSet.Auto)]
private static extern int mciSendString(string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback);

private const int MM_MCINOTIFY = 0x3B9;

private void button1_Click(object sender, EventArgs e)
{
string name = "c:\\123.MP3";
StringBuilder shortpath = new StringBuilder(80);
int result = GetShortPathName(name, shortpath, shortpath.Capacity);

mciSendString(@"close all", null, 0, 0);
mciSendString(@"open " + name + " alias song", null, 0, 0);
mciSendString("play song notify", null, 0, this.Handle.ToInt32());
}

protected override void WndProc(ref System.Windows.Forms.Message m)
{
if (m.Msg == MM_MCINOTIFY)
{
// 还要判断具体消息,没查到
MessageBox.Show("OK");
}
base.WndProc(ref m);
}

private void button2_Click(object sender, EventArgs e)
{
mciSendString(@"close all", null, 0, 0);
}
kof9032 2008-09-25
  • 打赏
  • 举报
回复
没看明白,如何使用,还请高手说明白点~~本人是初学者,还请海涵~~~
最好能给个详细代码分析或者解释也OK
加载更多回复(13)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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