mciSendString鼠标点击切换音乐出错

在使用mciSendString函数播放音乐时,鼠标将当前音乐切换为另一首音乐时,只能单一的从某首切换成另一首而不能双向切换,请问有没有解决的办法,以下是源码:

MOUSEMSG msg;
            int play = 0;
            while (1)
            {                msg = GetMouseMsg();
                if (msg.x > 100 && msg.x < 220 && msg.y>80 && msg.y < 150) {

                    if (msg.uMsg == WM_LBUTTONDOWN) {
                        be();
                       }                    
                    }else if (msg.x > 350 && msg.x < 530 && msg.y>500 && msg.y < 540) {
                    if (msg.uMsg == WM_LBUTTONDOWN) {    
                        if (play == 0) {
                            mciSendString("open./ 即兴.mp3", 0, 0, 0);
                            mciSendString("play ./即兴.mp3 ", 0, 0, 0);
                            play++;
                        }
                        else {
                            mciSendString("close ./雷车.mp3", 0, 0, 0);
                            mciSendString("open. /即兴.mp3", 0, 0, 0);
                            mciSendString("play./即兴.mp3 repeat", 0, 0, 0);
                        }
                    }
                }
                else if (msg.x > 560 && msg.x < 760 && msg.y>500 && msg.y < 540) {
                    if (msg.uMsg == WM_LBUTTONDOWN) {
                        if (play == 0) {
                            mciSendString("open ./雷车.mp3", 0, 0, 0);
                            mciSendString("play ./雷车.mp3 repeat", 0, 0, 0);
                            
                            play++;
                        }
                        else {
                            mciSendString("close ./即兴.mp3", 0, 0, 0);
                            mciSendString("open ./雷车.mp3", 0, 0, 0);
                            mciSendString("play ./雷车.mp3 repeat", 0, 0, 0);
                            
                        }
                    }
                }

问题是只能由即兴切换成雷车,不能由雷车切换到即兴,请问有没有什么解决办法?

不知道你说的双向是什么意思,你可以先 close 停下来,再播放啊

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/1063548
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:解决用mciSendString()函数不能播放音乐的问题
  • 除此之外, 这篇博客: mciSendString函数简介(播放音乐以及录音相关操作)中的 4.音量的调节 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    (1)获取当前的音量

    	char a[100];
    	mciSendString("status music volume", a, 100, 0);//获取此时的音量数据返回到a,这里的100是表示a的长度,sizeof(a)
    //其中a是字符串,如果想把a转换为数字,可以调用atoi函数
    int b=atoi(a);//通过atoi函数进行字符数字串转换到int类型
    char s[100];
    sprintf(s, "setaudio music volume to %d", b%1000+200);//这里建议去取模,此时获得的音量加上200,再除以1000乘上此时媒体音量就是将要播放出来的音量
    mciSendString(s,0,0,0);
    

     我们可以在这个基础上进行音量的加减,例如:

    当前媒体音量

    我们可以直接通过mciSendString("setaudio music volume to a",0,0,0),其中a是一个数字,来实现播放音量的改变,这个音量的换算是此时多媒体的音量乘上a/1000,所以这个a的范围是0~1000;如果a超过了1000,那么实际上a还是以1000来算。

    mciSendString("setaudio music volume to 800",0,0,0);
    //意思是把音量调节到当前媒体音量的80%,换算过来就是此时的音量为32

    既然知道了这些,那我们怎么去通过键盘或者鼠标的外部操作来改变播放音量呢?其实非常简单,利用循环就可以搞定了,代码如下:

    void volume()
    {
    int i=0;
    char a[100];
    	mciSendString("open kk.mp3 alias music", 0, 0, 0);
    while (true) {
    	mciSendString("play music", 0, 0, 0);
    	char s = getch();//在键盘上获取一个字符,但是不打印出来,接着往下执行
        system("cls");//清屏
    	if (s == 'w')//如果获取的字符为w,那么音量加100
    		i += 100;
    	else if(s=='s')//如果为s,音量减少100
    		i -=100 ;
    printf("%d",i);//打印此时的音量
    	sprintf(a, "setaudio music volume to %d", i);//把此时的音量以及操作字符串赋给a
    	mciSendString(a, 0, 0, 0);//音量的设置
    	
    }
    }

    这个函数的功能其实就是我们用的音乐软件里面的音量调节功能一样的,如下所示:

  • 以下回答来自chatgpt:

    对于使用mciSendString函数切换音乐出现单向切换问题的解决办法,可以通过以下步骤实现双向切换:

    1. 首先,在播放音乐之前需要先关闭已经打开的音乐文件,以避免冲突。可以使用以下代码关闭音乐文件:
    mciSendString("close music", 0, 0, 0);
    
    1. 接下来,根据需要切换的音乐文件,使用以下代码打开音乐文件并设置别名:
    mciSendString("open 音乐文件路径 alias music", 0, 0, 0);
    

    其中,音乐文件路径为要切换的音乐文件的路径,可以是相对路径或绝对路径。别名可以自定义,用于代替音乐文件路径。

    1. 对于双向切换音乐,可以通过设置一个变量来记录当前播放的音乐文件,然后根据该变量来切换音乐文件。

    2. 在鼠标点击或其他触发切换音乐的事件中,根据当前播放的音乐文件和要切换的音乐文件进行判断和切换,可以使用以下代码实现:

    string currentMusic = "即兴.mp3"; // 记录当前播放的音乐文件
    string switchMusic = "雷车.mp3"; // 要切换的音乐文件
    
    if (currentMusic == "即兴.mp3") {
        // 如果当前播放的音乐文件是即兴音乐,则切换到雷车音乐
        mciSendString("play 雷车.mp3", 0, 0, 0);
        currentMusic = "雷车.mp3"; // 更新当前播放的音乐文件
    } else if (currentMusic == "雷车.mp3") {
        // 如果当前播放的音乐文件是雷车音乐,则切换到即兴音乐
        mciSendString("play 即兴.mp3", 0, 0, 0);
        currentMusic = "即兴.mp3"; // 更新当前播放的音乐文件
    }
    

    请注意替换代码中的音乐文件路径和别名,以及适应你的具体情况。以上代码中,假设即兴音乐的路径为"即兴.mp3",雷车音乐的路径为"雷车.mp3"。

    通过以上步骤,可以实现从即兴音乐切换到雷车音乐,并且也能够从雷车音乐切换回即兴音乐。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^