C# windows应用程序SoundPlayer问题
我已经实现了音乐的播放和停止,但是我现在想实现暂停,就不知道怎么搞了。就是我点击一个按钮,音乐暂停了,再点一下,它就从之前暂停的地方接着播放。我试着用SoundPlayer.stop,可是每次音乐都是从头开始播的。麻烦各位大大们了.. --------------------编程问答-------------------- --------------------编程问答-------------------- 能否给个例子啊?这位大大 --------------------编程问答-------------------- 用windowsmediaplayer控件吧,我也刚用这个做了一个播放器,控件在工具箱com组件里面有。axWindowsMediaPlayer1.Ctlcontrols.pause();暂停的函数
建一个变量state来记录播放状态,实现一个按钮同时控制播放和暂停。 --------------------编程问答-------------------- 以下是我到网上找的一个同仁写的类,我的一个小工具是用了。
class Media
{
[DllImport("winmm.dll", EntryPoint = "mciSendString", CharSet = CharSet.Auto)]
private static extern int mciSendString(
string lpstrCommand,
string lpstrReturnString,
int uReturnLength,
int hwndCallback
);
[DllImport("winmm.dll", EntryPoint = "mciGetDeviceID", CharSet = CharSet.Auto)]
private static extern int mciGetDeviceID(string lpstrName);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetShortPathName(
string lpszLongPath,
string shortFile,
int cchBuffer
);
public enum PlayTypeName : byte
{
File = 1,
CDAudio = 2,
VCD = 3,
RealPlay = 4
}
public enum AudioSource : byte
{
H = 0,
L = 1,
R = 2
}
public enum Playstate : byte
{
Stopped = 1,
Playing = 2,
Pause = 3
}
public enum PlayStyle : byte
{
顺序 = 1,
随机 = 2,
循环 = 3
}
public PlayTypeName PlayType;
public int Temp; //零时变量 工程中将使用
public String SongName; //储存当前真正播放的歌曲名称
public string PreSongName;
public string NextSongName;
public int SongIndex; //储存当前播放的歌曲列表的位置
public int totalSong;
public PlayStyle PlayerStyle;//播放模式
public int Valume;//音量大小
public AudioSource audiosource;
public bool IsSlowly;//播放速度
/// <summary>
/// 获取DeviceID
/// </summary>
/// <returns>返回设备类型</returns>
public int GetDeviceID()
{
return mciGetDeviceID("NOWMUSIC");
}
/// <summary>
/// 根据文件名,确定设备
/// </summary>
/// <param name="ff">文件名</param>
/// <returns></returns>
public string GetDriverID(string ff)
{
string result = "";
ff = ff.ToUpper().Trim();
switch (ff.Substring(ff.Length - 3))
{
case "MID":
result = "Sequencer";
break;
case "RMI":
result = "Sequencer";
break;
case "IDI":
result = "Sequencer";
break;
case "WAV":
result = "Waveaudio";
break;
case "ASX":
result = "MPEGVideo2";
break;
case "IVF":
result = "MPEGVideo2";
break;
case "LSF":
result = "MPEGVideo2";
break;
case "LSX":
result = "MPEGVideo2";
break;
case "P2V":
result = "MPEGVideo2";
break;
case "WAX":
result = "MPEGVideo2";
break;
case "WVX":
result = "MPEGVideo2";
break;
case ".WM":
result = "MPEGVideo2";
break;
case "WMX":
result = "MPEGVideo2";
break;
case "WMP":
result = "MPEGVideo2";
break;
case ".RM":
result = "RealPlay";
break;
case "RAM":
result = "RealPlay";
break;
case ".RA":
result = "RealPlay";
break;
case "MVB":
result = "RealPlay";
break;
default:
result = "MPEGVideo";
break;
}
return result;
}
/// <summary>
/// 打开MCI设备,
/// </summary>
/// <param name="FileName">要打开的文件名</param>
/// <param name="Handle">mci设备的窗口句柄</param>
/// <returns>传值代表成功与否</returns>
public bool OpenMusic(string FileName, IntPtr Handle)
{
bool result = false;
string MciCommand;
int RefInt;
CloseMusic();
ShortPathName = "";
ShortPathName = ShortPathName.PadLeft(260, Convert.ToChar(" "));
RefInt=GetShortPathName(FileName, ShortPathName, ShortPathName .Length );
ShortPathName = GetCurrPath(ShortPathName);
string DriverID = GetDriverID(ShortPathName);
if (DriverID == "RealPlay")
return false;
MciCommand = string.Format("open {0} type {1} alias NOWMUSIC ", ShortPathName, DriverID);//"open " & RefShortName & " type " & DriverID & " alias NOWMUSIC"
if (DriverID == "AVIVideo" || DriverID == "MPEGVideo" || DriverID == "MPEGVideo2")
{
if (Handle != IntPtr.Zero)
{
MciCommand = MciCommand + string.Format(" parent {0} style child ", Handle);// " parent " & Hwnd & " style child"
}
else
{
MciCommand = MciCommand + " style overlapped ";
}
}
TemStr = "";
TemStr = TemStr.PadLeft(128, Convert.ToChar(" "));
RefInt = mciSendString(MciCommand, null, 0, 0);
mciSendString("set NOWMUSIC time format milliseconds", null, 0, 0);
if (RefInt == 0)
{
result = true;
SongName = Path.GetFileNameWithoutExtension(FileName);
}
return result;
}
/// <summary>
/// 播放音乐
/// </summary>
/// <returns></returns>
public bool PlayMusic()
{
bool result = false;
int RefInt = mciSendString("play NOWMUSIC", null, 0, 0);
if (RefInt == 0)
{
result = true;
SetValume(Valume);//当前音量大小
//检测播放速度
if (IsSlowly)
SetSpeed(800);
else
SetSpeed(1200);
//检测声道
switch ((int)audiosource)
{
case 0:
SetAudioSource(AudioSource.H);
break;
case 1:
SetAudioSource(AudioSource.L);
break;
case 2:
SetAudioSource(AudioSource.R);
break;
}
}
return result;
} --------------------编程问答--------------------
/// <summary>
/// 设置声音大小
/// </summary>
/// <param name="Valume">音量大小</param>
/// <returns></returns>
public bool SetValume(int Valume)
{
bool result = false;
string MciCommand = string.Format("setaudio NOWMUSIC volume to {0}", Valume);
int RefInt = mciSendString(MciCommand, null, 0, 0);
if (RefInt == 0)
{
result = true;
}
return result;
}
/// <summary>
/// 设置播放速度
/// </summary>
/// <param name="Speed"></param>
/// <returns></returns>
public bool SetSpeed(int Speed)
{
bool result = false;
string MciCommand = string.Format("set NOWMUSIC speed to {0}", Speed);
int RefInt = mciSendString(MciCommand, null, 0, 0);
if (RefInt == 0)
result = true;
return result;
}
/// <summary>
/// 设置声道
/// </summary>
/// <param name="audioSource"></param>
/// <returns></returns>
public bool SetAudioSource(AudioSource audioSource)
{
bool result = false;
string strSource = "";
switch ((int)audioSource)
{
case 1: strSource = "left"; break;
case 2: strSource = "right"; break;
case 0: strSource = "stereo"; break;
}
int RefInt = mciSendString("setaudio NOWMUSIC source to " + strSource, null, 0, 0);
if (RefInt == 0)
result = true;
return result;
}
/// <summary>
/// 设置静音 True为静音,FALSE为取消静音
/// </summary>
/// <param name="AudioOff"></param>
/// <returns></returns>
public bool SetAudioOnOff(bool AudioOff)
{
bool resut = false;
string OnOff;
if (AudioOff)
OnOff = "off";
else
OnOff = "on";
int RefInt = mciSendString("setaudio NOWMUSIC " + OnOff, null, 0, 0);
if (RefInt == 0)
resut = true;
return resut;
}
/// <summary>
/// 关闭媒体
/// </summary>
/// <returns></returns>
public bool CloseMusic()
{
int RefInt = mciSendString("close NOWMUSIC", null, 0, 0);
if (RefInt == 0)
return true;
return false;
}
/// <summary>
/// 暂停播放
/// </summary>
/// <returns></returns>
public bool PauseMusic()
{
int RefInt = mciSendString("pause NOWMUSIC", null, 0, 0);
if (RefInt == 0)
return true;
return false;
}
/// <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;
}
/// <summary>
/// 获取当前播放进度 毫秒
/// </summary>
/// <returns></returns>
public int GetMusicPos()
{
durLength = "";
durLength = durLength.PadLeft(128, Convert.ToChar(" "));
mciSendString("status NOWMUSIC position", durLength ,durLength .Length , 0);
durLength = durLength.Trim();
if (string.IsNullOrEmpty(durLength))
return 0;
else
return (int)(Convert.ToDouble(durLength) );
} --------------------编程问答--------------------
/// <summary>
/// 获取当前播放进度 格式 00:00:00
/// </summary>
/// <returns></returns>
public string GetMusicPosString()
{
durLength = "";
durLength = durLength.PadLeft(128, Convert.ToChar(" "));
mciSendString("status NOWMUSIC position", durLength, durLength.Length, 0);
durLength = durLength.Trim();
if (string.IsNullOrEmpty(durLength))
return "00:00:00";
else
{
int s = Convert.ToInt32(durLength)/1000;
int h = s /3600;
int m = (s - (h * 3600)) / 60;
s = s - (h * 3600 + m * 60);
return string.Format("{0:D2}:{1:D2}:{2:D2}", h, m, s);
}
}
/// <summary>
/// 获取媒体的长度
/// </summary>
/// <returns></returns>
public int GetMusicLength()
{
durLength = "";
durLength = durLength.PadLeft(128, Convert.ToChar(" "));
mciSendString("status NOWMUSIC length", durLength, durLength.Length, 0);
durLength = durLength.Trim();
if (string.IsNullOrEmpty(durLength))
return 0;
else
return Convert.ToInt32(durLength);
}
/// <summary>
/// 获取媒体的长度 00:00:00
/// </summary>
/// <returns></returns>
public string GetMusicLengthString()
{
durLength = "";
durLength = durLength.PadLeft(128, Convert.ToChar(" "));
mciSendString("status NOWMUSIC length", durLength, durLength.Length, 0);
durLength = durLength.Trim();
if (string.IsNullOrEmpty(durLength))
return "00:00:00";
else
{
int s = Convert.ToInt32(durLength) / 1000;
int h = s / 3600;
int m = (s - (h * 3600)) / 60;
s = s - (h * 3600 + m * 60);
return string.Format("{0:D2}:{1:D2}:{2:D2}", h, m, s);
}
}
public bool SetMusicPos(int Position)
{
string MciCommand = string.Format("seek NOWMUSIC to {0}", Position );
int RefInt = mciSendString( MciCommand , null, 0, 0);
if (RefInt == 0)
return true;
else
return false;
}
private string GetCurrPath(string name)
{
if (name.Length < 1) return "";
name = name.Trim();
name = name.Substring(0, name.Length - 1);
return name;
}
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
private string ShortPathName = "";
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
private string durLength = "";
[MarshalAs(UnmanagedType.LPTStr, SizeConst = 128)]
private string TemStr = "";
} --------------------编程问答-------------------- 我也遇到这样的问题,不好弄啊
补充:.NET技术 , C#