鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: wiliam

[技术交流] 如何写一个win32程序并且自动播放音乐

[复制链接]
发表于 2014-7-27 23:05:19 | 显示全部楼层
void _play(TCHAR *filename)
{
        display_filename(get_current_play(filename));
        TCHAR cmd[MAX_PATH + 10];
        TCHAR shortName[MAX_PATH];
        GetShortPathName(filename, shortName, sizeof(shortName) / sizeof(TCHAR));
        wsprintf(cmd, TEXT("play  %s"), shortName);
        mciSendString(cmd, NULL, 0, NULL);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-27 23:06:10 | 显示全部楼层
领用上面的函数就可以播放MP3,wav等格式的音乐了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-27 23:12:48 | 显示全部楼层
不知道这里有没有大神路过呀,其最近遇到了一个问题,这个函数可以播放很多的音乐但是有那么几个钉子户,就是不能播放会产生一个错误,错误提示如下
C:\Users\gongfan\Desktop\1.jpeg
有好几天了就是找不到解决方案。

我怀疑可能是因为MP3的id3v2中有了同步信号,导致解码器不能识别正常的播放位置造成的,可是在网上实在收不到相关的帖子。

或许还有其他的问题,希望高手指点迷津呀!!!

非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-28 11:12:40 | 显示全部楼层
写出来 我也看看呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-28 13:10:10 | 显示全部楼层
许许 发表于 2014-7-27 23:05
void _play(TCHAR *filename)
{
        display_filename(get_current_play(filename));

写一个win32汇编的可以吗  我不知道 mciSendString 在汇编怎么调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-28 19:16:24 | 显示全部楼层
wiliam 发表于 2014-7-24 21:39
用win32汇编该怎么调用呢

invoke mcisendstring,参数列表。
具体参数真么用你就需要看msdn了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-28 22:10:19 | 显示全部楼层
我要鱼币  我要鱼币  我要鱼币  我要鱼币  我要鱼币  我要鱼币  我要鱼币  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-29 14:56:42 | 显示全部楼层
问题就是图片显示的那个样子

1.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-29 15:00:10 | 显示全部楼层
我读去了MP3文件中的id3v2信息发现他们的不同之处是:

1.可以播放的MP3 在标签头的flag第一位是0

2.不可以播放的MP3 在标签头的flag位是 1

标签头的定义
typedef struct _LABELHEAD
{
        char header[3];
        char version;
        char reversion;
        unsigned char flag;
        unsigned char size[4];
} LABELHEAD, *pLABELHEAD;

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-30 15:45:09 | 显示全部楼层
俺也觀摩看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-30 22:01:12 | 显示全部楼层
看着各种api就烦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-30 23:12:35 | 显示全部楼层
扔给你一份C语言源码,直接改成WIN32就行  真不会了  就push call
// Music.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#pragma commet(lib,"WINMM.LIB")


int WINAPI mainproc (HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{


        switch(msg)
        {

        case        WM_INITDIALOG:

                                                        break;
        case        WM_CLOSE:
                                        EndDialog(hwnd,NULL);
                                        break;
        case        WM_COMMAND:
                        switch(LOWORD(wParam))
                        {        
                        case    IDC_OPEN:                        

                                                OPENFILENAME ofn;
                                                char szFile[256];//MAX_PATH操作系统定义的最大路径的长度 
                                                
                                                ZeroMemory(&ofn,sizeof(ofn));
                                                ofn.lStructSize = sizeof(ofn);//定义结构体的大小,判断是win95还是win2000系统 
                                                ofn.lpstrFile = szFile;//
                                                ZeroMemory(szFile,sizeof(szFile)/sizeof(char));
                                                ofn.nMaxFile = sizeof(szFile);
                                                ofn.lpstrFilter ="mp3文件\0*.mp3\0所有文件\0*.*\0\0";//过滤器 
                                                ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
                                                GetOpenFileName(&ofn);
                                        
                                                SetDlgItemText(hwnd,IDC_EDIT1,szFile);        
                                                break;
                                        
                        case        IDC_PLAY:

                                                TCHAR play1[256];
                                                TCHAR play2[256];                
                                                TCHAR getpath[256];                        
                                                GetDlgItemText(hwnd,IDC_EDIT1,getpath,sizeof(getpath));                                //得到编辑框上面的路径名
                                                GetShortPathName(getpath,play1,sizeof(play1));                                                //得到短路径  play1保存短路径
                                                wsprintf(play2,"play %s",play1);                                                                        //在路径前面加上个play
                                                SetDlgItemText(hwnd,IDC_EDIT1,play1);                                                                //显示出来短路径
                                                mciSendString(play2,NULL,0,NULL);                                                                        //播放
                                                break;                                                                                                                                //退出 下面的跟这个同理


                    case        IDC_PAUSE:        //暂停
                                                        
                                                        TCHAR pause1[256]; 
                                                        TCHAR pause2[256];
                                                        TCHAR getpath1[256];
                                                        GetDlgItemText(hwnd,IDC_EDIT1,getpath1,sizeof(getpath1));        //="play e:/1.mp3";
                                                        GetShortPathName(getpath1,pause1,sizeof(pause1));        //短路径
                                                        wsprintf(pause2,"pause %s",pause1);
                                                        SetDlgItemText(hwnd,IDC_EDIT1,pause1);        
                                                        mciSendString(pause2,NULL,0,NULL);
                                                        break;

                        case        IDC_RESUME: //恢复
                                
                                                        TCHAR resume1[256]; 
                                                        TCHAR resume2[256];
                                                        TCHAR getpath3[256];
                                                        GetDlgItemText(hwnd,IDC_EDIT1,getpath3,sizeof(getpath3));        //="play e:/1.mp3";
                                                        GetShortPathName(getpath3,resume1,sizeof(resume1));        //短路径
                                                        wsprintf(resume2,"resume %s",resume1);
                                                        SetDlgItemText(hwnd,IDC_EDIT1,resume1);        
                                                        mciSendString(resume2,NULL,0,NULL);
                                                        break;

                        case        IDC_CLOSE: //停止
                                                        
                                                        TCHAR close1[256]; 
                                                        TCHAR close2[256];
                                                        TCHAR getpath2[256];
                                                        GetDlgItemText(hwnd,IDC_EDIT1,getpath2,sizeof(getpath2));        //="play e:/1.mp3";
                                                        GetShortPathName(getpath2,close1,sizeof(close1));        //短路径
                                                        wsprintf(close2,"close %s",close1);
                                                        SetDlgItemText(hwnd,IDC_EDIT1,close1);        
                                                        mciSendString(close2,NULL,0,NULL);
                                                        break;                
                                                        
                        }
        
        
        }
        return 0;
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
         DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,mainproc);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-9-1 21:25:23 | 显示全部楼层
wiliam 发表于 2014-7-24 21:39
用win32汇编该怎么调用呢

这个需要你自己查api了,灵活带来的是n多可配置项,慢慢查msdn吧……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-9-3 08:47:04 | 显示全部楼层
汇编不是很懂,需要学习一下!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 13:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表