C# 播放MP3音乐 mciSendString正确使用方式 其他语言使用方式放在末尾链接

先发吨牢骚吧,什么破网络,什么破高手,写的什么垃圾文章。

作为一个思科交换机路由器出身的我进入了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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值