先发吨牢骚吧,什么破网络,什么破高手,写的什么垃圾文章。
作为一个思科交换机路由器出身的我进入了Java的编程行业,奈何涉及到的什么PHP,C,C++,Delphi都写过了,对了,VB也搞过,就是没搞过C#,结果就遇到了问题。
需求目的,用C#播放MP3文件,百度了一下,没有什么好的文章,由于用的VS2022开发,不知道为啥内置的那个播放器无法使用,放弃了,结果mciSendString映入眼帘,就它了,看着简单。
说重点
//1.引入winmm.dll
[DllImport("winmm.dll")]
//2.声明函数
public static extern Int32 mciSendString(string command, StringBuilder buffer, int bufferSize, IntPtr hwndCallback);
//3参数说明
1) command 字符串类型的命令
2) buffer 类型必须是StringBuilder 否则需要返回值的时候拿不到*** 不能直接写 " "
3) bufferSize 这个类型是返回参数的长度,一般写128足够了。不能写 buffer.length
4) hwndCallback 类型必须是 IntPtr 不能直接写0
正确的例子
public void OpenCD()
{
IntPtr ptr = IntPtr.Zero; //重点
StringBuilder returnstring = new StringBuilder(); //重点
mciSendString("set CDAudio door open", returnstring, 127, IntPtr.Zero);
}
错误的例子
mciSendString(@"close temp_alias", " ", 0, 0); 网上某些文章这么写是绝对有问题的,虽然可以执行,但是 但是会大概率会导致JSON解析失败,Websocket链接失败。
上代码吧
internal class MusicPlay
{
public static bool isRepeat = false;//是否重复播放
//[DllImport("winmm.dll")]
[DllImport("winmm.dll")]
public static extern Int32 mciSendString(string command, StringBuilder buffer, int bufferSize, IntPtr hwndCallback);
/** 播放音乐文件 **/
public static void PlayMusic(string p_FileName)
{
try
{
mciSendString(@"close temp_music", new StringBuilder(), 0, IntPtr.Zero);
mciSendString(@"open """ + p_FileName + @""" alias temp_music", new StringBuilder(), 0, IntPtr.Zero);
if (isRepeat)
{
mciSendString(@"play temp_music repeat", new StringBuilder(), 0, IntPtr.Zero);
}
else
{
mciSendString(@"play temp_music", new StringBuilder(), 0, IntPtr.Zero);
}
}
catch
{ }
}
/**获取 时长**/
public static int getLength() {
try
{
StringBuilder buffer = new StringBuilder();
mciSendString("status temp_music length ", buffer, 128, IntPtr.Zero);
Debug.WriteLine(buffer);
if (String.IsNullOrEmpty(buffer.ToString())) return 0;
else return Int32.Parse(buffer.ToString().Trim());
}
catch
{
}
return 0;
}
/**获取 当前位置**/
public static int getPosition()
{
try
{
StringBuilder buffer = new StringBuilder();
mciSendString("status temp_music position ", buffer, 128, IntPtr.Zero);
if (String.IsNullOrEmpty(buffer.ToString())) return 0;
else return Int32.Parse(buffer.ToString().Trim());
}
catch
{
}
return 0;
}
/** 指定位置开始播放 配合进度条使用 **/
public static void setPosition(int pos)
{
try
{
mciSendString("seek temp_music to "+ (pos).ToString(), new StringBuilder(), 0, IntPtr.Zero);
if (isRepeat)
{
mciSendString(@"play temp_music repeat", new StringBuilder(), 0, IntPtr.Zero);
}
else
{
mciSendString(@"play temp_music", new StringBuilder(), 0, IntPtr.Zero);
}
}
catch
{
}
}
/** 获取播放状态 **/
public static string getStatus()
{
try
{
//string moveStatus = "";
//moveStatus = moveStatus.PadLeft(128, Convert.ToChar(" "));
StringBuilder buffer = new StringBuilder();
mciSendString("status temp_music mode ", buffer, 128, IntPtr.Zero);
Debug.WriteLine(buffer.ToString());
return buffer.ToString();
}
catch
{
}
return "";
}
/**暂停**/
public static void pause()
{
try
{
mciSendString("pause temp_music", new StringBuilder(), 0, IntPtr.Zero);
}
catch
{
}
}
/**恢复**/
public static void resume()
{
try
{
mciSendString("resume temp_music", new StringBuilder(), 0, IntPtr.Zero);
}
catch
{
}
}
/**停止**/
public static void stop()
{
try
{
mciSendString("stop temp_music", new StringBuilder(), 0, IntPtr.Zero);
}
catch
{
}
}
/**重复播放**/
public static void repeat()
{
try
{
if (isRepeat)
{
mciSendString("play temp_music repeat", new StringBuilder(), 0, IntPtr.Zero);
}
else
{
mciSendString("play temp_music", new StringBuilder(), 0, IntPtr.Zero);
}
}
catch
{
}
}
}
奉上完整可以用的代码。复制即可。
其他开发平台的用法可以参考这个地址
pinvoke.net:mcisendstring (winmm)
本人擅长以下语言,可以沟通学习哦,支持C、C#、Delphi、Java、PHP、安卓、易语言、游戏逆向分析。
喜欢的点赞收藏哦。
联系方式:QQ1580007242