MCI mciSendCommand
非常齐全的MCI命令简介
注:下面是我编程时看资料(主要是MSDN)的随手笔记,不全,随着日后的学习再进一步扩充吧。
只是为了日后查找方便,可以很快回想起各种命令的用法。
俗话说好记性不如烂笔头嘛:)MciSendCommand 命令格式:MCIERROR mciSendCommand(MCIDEVICEID IDDevice, //接受命令的设备ID,由 MCI_OPEN 命令的wDeviceID变量返回UINT uMsg, //MCI 命令DWORD fdwCommand, //flags 列表区,一般都与 DWORD dwParam 中的相关成员配合使用(DWORD)(相应MCI命令的参数区类型) dwParam);返回的值:返回 0 表示成功,否则为出错代码.MCI 命令列表:MCI_BREAK 设置中断键,缺省是”CTRL+BREAK"。
下面是MCI_BREAK 命令第四个参数dwParam的结构:(其它各命令用相同格式说明)typedef struct { DWORD dwCallback; //低字指定一个窗口句柄,与MCI_NOTIFY 有关(处理命令完成后的相应动作)int nVirtKey; //键码(相关flag:MCI_BREAK_KEY )HWND hwndBreak; //窗口句柄(相关flag:MCI_BREAK_HWND )} MCI_BREAK_PARMS;flags:MCI_BREAK_OFF 关闭中断键MCI_CAPTURE 抓取当前帧并存入指定文件,仅用于数字视频typedef struct {DWORD dwCallback;LPSTR lpstrFileName; //存入指定文件的全路径RECT rc; //抓取的矩形区域}MCI_DGV_CAPTURE_PARMS;[注] typedef struct _RECT {LONG left;LONG top;LONG right;LONG bottom;} RECT;MCI_CLOSE 关闭设备用于所有设备,没有什么要特别说明的typedef struct {DWORD dwCallback;} MCI_GENERIC_PARMS;MCI_CONFIGURE 弹出配置对话框,仅用于数字视频(Digital-video)MCI_COPY 拷贝数据至剪贴板仅用于数字视频typedef struct {DWORD dwCallback;DWORD dwFrom; //复制起点DWORD dwTo; //复制终点RECT rc; //(相关flag:MCI_DGV_COPY_AT )DWORD dwAudioStream;DWORD dwVideoStream;} MCI_DGV_COPY_PARMS;MCI_FROMMCI_TOMCI_DGV_COPY_AT 不使用此flag,将复制完整帧MCI_DGV_COPY_AUDIO_STREAM(缺省是这两个STRAM都不指定)MCI_DGV_COPY_VIDEO_STREAM(但如果你使用一般只用其中一个)MCI_CUE 延时播放或录音用于Digital-video, VCR, 和waveform-audio MCI_CUT 删除数据,并将数据复制到剪贴板用于Digital-videoMCI_DELETE 将文件中的数据删除用于Digital-video 和waveform-audio MCI_ESCAPE 直接向设备发送一个串仅用于激光视频MCI_FREEZE 将显示定格Digital-video, video-overlay, and VCR devicesMCI_GETDEVCAPS 获取设备信息用于所有设备typedef struct {DWORD dwCallback; DWORD dwReturn;DWORD dwItem;} MCI_GETDEVCAPS_PARMS;MCI_INDEX 当前屏幕显示与否,仅用于VCR设备MCI_INFO 获取设备字符串信息typedef struct {DWORD dwCallback;LPSTR lpstrReturn; //根据相应的flags返回信息串DWORD dwRetSize; //返回信息串大小(bytes)} MCI_INFO_PARMS;MCI_INFO_PRODUCT 设备的硬件信息用于所有设备用于cdaudio的flags :MCI_INFO_MEDIA_IDENTITYMCI_INFO_MEDIA_UPC产品通用代码(UPC) ,不一定使用于所有CD 。
mciSendString用法
mciSendString⽤法使⽤MCI API,源⽂件中需要包含头⽂件 Mmsystem.h,在Project->Settings->Link->Object/libray module中加⼊库 Winmm.lib。
VS2008在源⽂件加上#include "mmsystem.h" #pragma comment(lib,"winmm.lib")mciSendString是⽤来播放多媒体⽂件的API指令,可以播放MPEG,AVI,WAV,MP3,等等,下⾯介绍⼀下它的使⽤⽅法: 该函数有四个参数:第⼀个参数:要发送的命令字符串。
字符串结构是:[命令][设备别名][命令参数].第⼆个参数:返回信息的缓冲区,为⼀指定了⼤⼩的字符串变量.第三个参数:缓冲区的⼤⼩,就是字符变量的长度.第四个参数:回调⽅式,⼀般设为零返回值:函数执⾏成功返回零,否则返回错误代码MCIERROR mciSendString( LPCTSTR lpszCommand, //MCI命令字符串 LPTSTR lpszReturnString, //存放反馈信息的缓冲区 UINT cchReturn, //缓冲区的长度 HANDLE hwndCallback //回调窗⼝的句柄,⼀般为NULL ); //若成功则返回0,否则返回错误码。
该函数返回的错误码可以⽤mciGetErrorString函数进⾏分析,该函数的声明为: BOOL mciGetErrorString( DWORD fdwError, //函数mciSendString返回的错误码 LPTSTR lpszErrorText, //接收描述错误的字符串的缓冲区 UINT cchErrorText //缓冲区的长度 );⼀,打开多媒体⽂件。
⾸先在Dialog上⾯放⼀个Picture控件,MCISendString就在这个Picture控件的平⾯上播放多媒体⽂件,设Picture控件的ID为IDC_STATIC1:CStatic *pStatic=(CStatic*)GetDlgItem(IDC_STATIC1);HWND h=pStatic->GetSafeHwnd();CString open1;char buf[256];open1.Format("open f:""mpeg""mpeg1.avi type MPEGVideo Alias movie parent %u Style %u notify", h,WS_CHILD); mciSendString(open1.GetBuffer(open1.GetLength()),buf,sizeof(buf),NULL);这样F盘下⾯的mpeg⽬录下的mpeg1.avi就打开了,其中的type MPEGVideo是指打开MPEG,AVI等类型,如果不加type MPEGVideo这⼀句,就是打开WAV,MP3等,Alias movie定义了mpeg1.avi的别名为movie,以后可以通过操做movie就可以操作mpeg1.avi。
多媒体接口
一、MCI 多媒体编程导引
MCI (Media Control Interfaec,多媒体控制接口)是一种软件接口。 其特点为:
为程序员提供了调用系统的多媒体设备播放影音的统一接口。 系统的多媒体设备是指:
Wave(波形音频)设备、 MIDI(乐器数字接口)设备、 CD(数字音频)设备、 AVI(数字视频)设备等。 上述设备的驱动程序中含有播放、暂停、播放状态查询等导出函数。
);
功能:向指定的设备发送一个命令。共有34中命令,例如:
MCI_OPEN: 打开一个MCI设备。此时: dwParam 为指向一个MCI_OPEN_PARMS型结构的指针; fdwCommand 的值说明了要使用dwParam结构中的那些成员。
MCI_PLAY: 使用打开的设备播放。此时: dwParam为指向一个MCI_PLAY_PARMS型结构的指针; fdwCommand 的值说明了要使用dwParam结构中的那些成员。
未定义的设备
MCIERROR mciSendCommand(
MCIDEVICEID IDDevice, // MCI设备的标识符
UINT uMsg,
//命令标识符,如MCI_OPEN、MCI_PLAY等
DWORD fdwCommand, //辅助标志,说明如何使用下面的结构
DWORD dwParam //指向一个结构,以说明如何执行或执行结果
1、 常用MCI函数
MCI提供了7个接口函数,其中最基本的有:
MCIDEVICEID mciGetDeviceID( LPCTSTR lpszDevice );
功能:由设备的名称或别名获得MCI设备的标识符(用于打开设备)。 参数:
lpszDevice :字符串,设备的名称。标准设备名称如下表所示。
c语言mcisendstring用法
c语言mcisendstring用法C语言中,mcisendstring函数是用于向MCI设备发送字符串命令的函数。
它可以通过发送指定的字符串来控制MCI设备的行为。
在本文中,我们将分步骤阐述如何使用mcisendstring函数。
第一步:准备好MCI设备。
在使用mcisendstring函数之前,我们需要准备好MCI设备。
通常,MCI设备可以是音频设备、视频设备、CD-ROM驱动器等。
我们需要先打开设备,为其分配一个设备ID号。
我们可以使用mciSendCommand函数来打开设备并获取其ID号。
以下是示例代码:```DWORD dwDeviceID;MCI_OPEN_PARMS mciOpenParms;ZeroMemory(&mciOpenParms, sizeof(mciOpenParms)); mciOpenParms.lpstrDeviceType = L"cdaudio";if (mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE |MCI_OPEN_TYPE_ID, (DWORD)(LPVOID)&mciOpenParms)){printf("打开设备失败!");return;}dwDeviceID = mciOpenParms.wDeviceID;```以上代码使用MCI_OPEN命令打开一个cdaudio类型的设备,并将其设备ID号保存在dwDeviceID变量中。
第二步:发送字符串命令。
准备好设备之后,我们可以使用mcisendstring函数向设备发送字符串命令。
以下是发送字符串命令的示例代码:```char szCommand[256];sprintf(szCommand, "set cdaudio door %s", "open"); mciSendString(szCommand, NULL, 0, NULL);```以上代码使用sprintf函数创建一个字符串命令,并将其保存在szCommand变量中。
MCI详解
(1)首先,要在USES里加上Mmsystem函数声明如下:functionmciSendStringA(lpstrCommand,lpstrReturnString:PAnsiChar;uReturnLength:UINT;hWndCallback;HWND);MCIERROR;stdcall; functionmciSendStringW(lpstrCommand,lpstrReturnString:PWideChar;uReturnLength:UINT;hWndCallback:HWND);MCIERROR;stdcall;functionmciSendString(lpstrCommand,lpstrReturnString:Pchar;uReturnLength:UINT;hWndCallback:HWND);MCIERROR;stdcall;具体请参考帮助MCI命令消息接口函数:mciSendCommand发送命令消息函数mciGetDeviceID返回打开设备的IDmciGetErrorString返回mciSendCommand错误代码对应的字符串向MCI设备发送命令消息时使用mciSendCommand(mciID:MCIDEVICEID;uMessage:UINT;dwParam1,dwParam2:DWORD);MCIERR OR;stdcall;mciID:接受命令消息的MCI设备的IDuMessage:命令消息dwParam1:命令消息标志dwParam2:指向接收命令消息参数块地址MCIERROR:返回值,如果为0,表示调用成功,否则失败.获得错误代码后通过function mciGetErrorString(mcierr:MCIERROR;pszT ext;Pchar;uLength:UINT):BOOL;stdcall;来获得相应的错误字符串.该函数参数说明如下:mcierr:由mciSendCommand返回的错误代码pszText:存放与mcierr相对应的字符串的地址uLength:指定pszText指向的缓冲区大小,MCI返回的字符串长度最大为128个字符BOOL:返回值,为true则成功,否则,就没有此错误代码下面这个函数,是获取MCI设备ID的functionmciGetDeviceID(pszDevice:Pchar):MCIDEVICEID;stdcall;pszDevice:指定已经打开的MCI设备名称MCIDEVICEID:返回值,为返回的ID.关于设备名称,请打开system.ini文件在[mci]段例如:cdaudio=mcicda.drvsequencer=mciseq.drvwaveaudio=mciwave.drvavivideo=mciavi.drvvideodisc=mcipionr.drvvcr=mcivisca.drvMPEGVideo=mciqtz.drvcdaudio和sequencer等就是设备名MCI详解[连载二]什么是MCI,MCI是多媒体控制接口(Media Control Interface)的缩写.它包括基于命令字符串,消息方式与设备驱动程序进行通讯的可扩充接口和MCI设备驱动程序.支持MCI指令的设备有ANIMATION(动画播放设备)CDAUDIO(CD音频设备)WAVEAUDIO(波形音频设备)OVERPLAY(视频叠加设备,如Video Blaster)DIGITALVIDEO(窗体数字视频,如回放*.avi文件)VIDEODISC(激光视频设备)VCR(可程控录像机)SEQUENCER(MIDI序列发生器)打开WINDOWS子目录下的SYSTEM.INI文件,在[MCI]段就能看到以上设备的安装信息,格式为:DeviceType = Driver设备名= 驱动程序名打开WIN.INI文件,打开[mci extensions],找到如下段[mci extensions]mid=Sequencerrmi=Sequencerwav=waveaudioavi=AVIVideocda=CDAudioaif=MPEGVideoaiff=MPEGVideoaifc=MPEGVideoau=MPEGVideom1v=MPEGVideomov=MPEGVideomp2=MPEGVideompa=MPEGVideompe=MPEGVideompeg=MPEGVideompg=MPEGVideoqt=MPEGVideosnd=MPEGVideodat=MPEGVideo其格式为: 文件扩展名= 设备名在程序设计中,指定一个mci设备,就是指定设备名,当然,还可以指定相对应的设备类型常数:MCI设备与设备类型常数设备类型设备类型常数cdaudio MCI_DEVTYPE_ANIMATIONanimation MCI_DEVTYPE_CD_AUDIOdat MCI_DEVTYPE_DATdigitalvideo MCI_DEVTYPE_DIGITAL_VIDEOother MCI_DEVTYPE_OTHERoverlay MCI_DEVTYPE_OVERLAYscanner MCI_DEVTYPE_SCANNERsequencer MCI_DEVTYPE_SEQUENCERvcr MCI_DEVTYPE_VCRvideodisc MCI_DEVTYPE_VIDEODISCwaveaudio MCI_DEVTYPE_WAVEFORM_AUDIOMCI设备还有简单型(Simple)和复合型(Compound)之分,MCI将不需要文件的设备称作简单型设备(Simple Device),如CDAudio等,将需要文件的设备称作复合型设备(Compound Device),如Sequencer,Waveaudio等.MCI详解[连载三]在连载一里,我解释了几个MCI的函数(请参考连载一)WINDOWS中的多媒体扩展部分的消息由两类:一是发送到窗体,有窗体函数处理的消息均以MM开头.二是用于回调函数和基于消息的API消息,由应用程序发送,实现与MCI设备的通讯.DELPHI中有32种命令消息,按用途分为:1,系统命令消息:由MCI直接解释,不依耐设备性能.2,必须命令消息:所有MCI设备都支持,用于打开,关闭设备并获得有关信息.3,基本命令消息:所有的MCI设备都支持,但并非完全支持,遇到不支持的某一个消息时,返回MCIERR_UNSUPPORTED_FUNCTION.4,扩展命令消息,用于特定设备.扩展命令消息分三种:(1)使用MCI元素文件扩展命令消息(FAQ A:何谓元素?Q:复合型设备在打开时既要指定设备名,又要指定文件名,而文件名就被称为元素.A:何谓复合型设备?Q:参考连载二)(2)设备操作与定位扩展命令消息(3)窗口式视频设备扩展命令消息此外,MCI还使用MCI_MCINOTIFY告诉应用程序一条MCI消息已经发送,它是窗口通知消息,要得到此消息,应用程序要指定一个窗体处理该消息.消息分类:系统命令消息MCI_BREAK 设置指定设备的中止键MCI_SOUND 播放WINDOWS声音MCI_SYSINFO 获取信息必须命令消息MCI_CLOSE 关闭设备MCI_GETDEVCAPS 获取设备性能信息MCI_INFO 获得设备信息MCI_OPEN 打开设备并获得IDMCI_STATUS 获得状态信息基本命令消息MCI_LOAD 载入文件MCI_PAUSE 暂停设备MCI_PLAY 播放MCI_RECORD 录制MCI_RESUME 恢复暂停MCI_SAVE 保存文件MCI_SEEK 在元素内定位MCI_SET 设置设备参数MCI_STOP 停止扩展命令消息[使用元素文件扩展命令消息]MCI_COPY 拷贝数据MCI_CUT 剪切MCI_DELETE 删除MCI_PASTE 粘贴[设备操作与定位扩展命令消息]MCI_CUE 为播放或录制操作插入一个设备MCI_ESCAPE 把一串命令发送到命令处理器MCI_SPIN 开始或中止旋转可转动设备MCI_STEP 步进帧[窗口式视频设备扩展命令消息]MCI_FREEZE 冻结画面MCI_PUT 定义源或目的裁剪矩形区MCI_REALIZE 实现图形设备的调色板MCI_UNFREEZE 与FREEZE相反MCI_UPDATE 刷新MCI_WHERE 确定剪裁区域MCI_WINDOW 为一个图形设备及它的显示方式指定一个窗口和窗口风格MCI连载四发送MCI命令消息有的需要花很长时间才能完成,如播放AVI文件,是否在播放完成前就将控制权返回到APPLICATION,是由命令消息标志确定的.命令消息标志分专用标志和通用标志,专用消息与命令消息配套使用,通用消息适用于所有命令消息:MCI_NOTIFY和MCI_WAITMCI_NOTIFY:通知标志,表示规定动作完成后,给随同发送命令消息的数据结构dwCallBack字段指定的窗口发送MM_MCINOTIFY消息,这个消息由dwCallBack字段指定的回调函数处理]MCI_WAIT:等待标志,表示在规定操作完成后,再将控制权转交APPLICATION,比如播放AVI文件完成后,APPLICATION才能获得控制权,但可以用MCI_BREAK来中断.再说一遍mciSendCommand函数结构:mciSendCommand(mciID:MCIDEVICEID;uMessage:UINT;dwParam1,dwParam2:DWORD);MCIERR OR;stdcall;mciID:接受命令消息的MCI设备的IDuMessage:命令消息dwParam1:命令消息标志dwParam2:指向接收命令消息参数块地址MCIERROR:返回值,如果为0,表示调用成功,否则失败.获得错误代码后通过function mciGetErrorString(mcierr:MCIERROR;pszT ext;Pchar;uLength:UINT):BOOL;stdcall;其中dwParam1是消息指定标志,dwParam2是消息数据结构以MCI_OPEN为例,打开Mmsystem.pas文件,找到如下:typePMCI_Open_ParmsA = ^TMCI_Open_ParmsA;PMCI_Open_ParmsW = ^TMCI_Open_ParmsW;PMCI_Open_Parms = PMCI_Open_ParmsA;{$EXTERNALSYM tagMCI_OPEN_PARMSA}tagMCI_OPEN_PARMSA = record*********dwCallback: DWORD;wDeviceID: MCIDEVICEID;lpstrDeviceType: PAnsiChar;lpstrElementName: PAnsiChar;lpstrAlias: PAnsiChar;end;{$EXTERNALSYM tagMCI_OPEN_PARMSW}tagMCI_OPEN_PARMSW = record*********dwCallback: DWORD;wDeviceID: MCIDEVICEID;lpstrDeviceType: PWideChar;lpstrElementName: PWideChar;lpstrAlias: PWideChar;end;其中可以看出(注意有*的语句),参数是一个记录类型,也就是说dwParam1和dwParam2是两个记录类型的数据,在使用时赋值要注意类型.再以MCI_OPEN命令为例,其语法为:dwReturn:=mciSendCommand(wDeviceID,MCI_OPEN,dwFlags,DWORD(mciOpenParam));-----------------------------------------------------------在var段申明:varwDeviceID:MCIDEVICEID; //存放设备IDdwReturn:MCIERROR; //存放返回值mciOpenParam:PMCI_OPEN_PARMS; //MCI_OPEN命令消息的数据结构-----------------------------------------------------------在适当位置为mciOpenParam申请空间new(mciOpenParam);最后还要释放空间dispose(mciOpenParam);-----------------------------------------------------------为需要在命令消息数据结构中需要的字段赋值,mciOpenParam^.lpstrDeviceType:='cdaudio';-----------------------------------------------------------最后,调用发送函数dwReturn:=mciSendCommand(0,//打开设备前ID为0MCI_OPEN, //命令消息MCI_OPEN_TYPE, //消息标志,表示字段lpstrDeviceType有值DWORD(mciOpenParam)); //数据结构dwReturn若为0,表示调用成功.MCI详解[连载五]MCI命令字符串接口函数与命令消息方式相似,MCI为发送命令字符串提供了两个函数:](1) mciSendString(2) mciExecute函数(2)是(1)的简化形式,函数(1)返回的错误代码和相应的错误信息与命令消息函数相同.函数(2)如果出现错误,则以消息框形式提示.functionmciSendString(lpstrCommand,lpstrReturnString:Pchar;uReturnLength:UINT;hWndCallback:HWND):MCIERROR;stdcall;lpstrCommand:指向以nil结尾的mci命令字符串lpstrReturnString:返回信息的缓冲区,可以设置成nil,则不返回信息hWndCallback:接收MM_MCINOTIFY消息的窗口句柄,如果命令包含Notify标志,则此参数必须要MCIERROR:返回值,为0表示调用成功.错误代码要用函数mciGetErrorString获得错误信息functionmciExecute(pszCommand:LPCSTR):BOOL;stdcall;这是函数(1)的简化形式pszCommand:MCI命令字符串返回值:返回true,表示调用成功;返回false,则用messagebox显示错误信息命令字符串语法格式:commanddevice_name argumentcommand:MCI命令字符串device_name:设备名或设备元素argument:命令的标志和参数标志:由MCI命令支持的关键字组成参数:标志所带参数注:argument可以是字符串,带符号的长整数和矩形等数据类型,参数之间用空格隔开.例1:播放cd,从当前位置播放到10 000ms处停止playcdaudio to 10000例2:以别名形式对cdaudio操作opencdaudio alias cdplay cdstop cdclose cd使用别名的好处:当设备名或元素名较长时,操作起来不方便,就为它指定一个别名, 例如本例就是将设备cdaudio指定一个别名cd,后面就对cd进行操作.MCI详解[连载六]命令字符串分类:用mciSendString和mciExecute函数发送的字符串命令分为四大类:系统命令:由MCI直接解释,不发送给设备.必需命令:所有设备都支持.基本命令:设备对这些命令可选.扩充命令:仅适用于某些设备.字符串命令表类别命令名功能系统命令break 中止,放弃waitsound 播放windows声音(win.ini文件中[Sound]段) sysinfo获取MCI系统信息必需命令capability 获取设备性能信息close 关闭设备info 获取设备型号,厂家等信息open 初始化status 状态信息基本命令load 载入设备元素pause 暂停play 播放record 录制resume 恢复暂停save 存盘seek 在媒体内定位set 设置status 获取设备状态信息stop 停止播放或录制命令字符串举例:(用于mciSendString发送)capabilitymysound device type//返回"mysound"的设备类型closemysound//关闭"mysound"设备configureavi//打开AVI播放设备对话框cuemysound input//为录制准备设备"mysound"deletemysound from 1 to 900//删除波形音频1到900ms之间的数据infomysound product//取回与"mysound"相关的硬件描述open new type waveaudio alias mysound buffer 6//打开"mysound"设备,mysound是别名,缓冲区为6秒pausemysound//暂停"mysound"设备playmysound from 1 to 500 notify(wait)//播放"mysound"从位置1到500,播放后发送通知消息(notify)或播放时等待(wait) realizemyvideo normal//告诉"myvideo"设备实现它的调色板recordmysound//从当前位置开始录制resumemysound//恢复暂停savevboard c:\v1.tga//将视频缓冲区的内容存入v1.tga中seekmysound to start//定位到"mysound"相关文件的开始statusmysound mode//返回"mysound"当前模式step movie by 5//从当前帧开始播放5帧stopmysound//停止播放或录制。
C语言实现Mini-Cooledit音频播放器
GetDlgItem(IDC_play)->SetWindowText("播放");
mciSendCommand(m_DeviceID, MCI_STOP, NULL, NULL);
mciSendCommand(m_DeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
//获得文件播放的当前位置
MCI_STATUS_PARMS mcistatusparms;
mcistatusparms.dwItem = MCI_STATUS_POSITION;
mcistatusparms.dwReturn = 0;
mciSendCommand(m_DeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPMCI_STATUS_PARMS)&mcistatusparms);
m_playslider.SetRange(0,mciStatusParam.dwReturn);
m_playslider.SetPos(0);
m_volumeslider.SetRange(0,100);
m_volumeslider.SetPos(100);
}
wav文件的播放与停止
void CMiniDlg::Onplay()
mciSendCommand(m_DeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
str.Format("%d",mciStatusParam.dwReturn);
c语言mcisendstring循环播放语句 -回复
c语言mcisendstring循环播放语句-回复C语言是一种广泛应用于嵌入式系统开发和底层编程的高级编程语言。
它以其简洁、高效和灵活的特点而被广泛接受。
mcisendstring是C语言中的一个函数,它可以用于循环播放字符串。
在这篇文章中,我将逐步解释如何使用mcisendstring函数在C语言中实现循环播放字符串。
首先,我们需要了解mcisendstring函数的基本用法。
mcisendstring 函数是Windows平台上的一个功能强大的音频播放函数,它可以发送一个播放命令字符串给Windows多媒体控制器。
通过发送不同的命令字符串,我们可以控制音频的播放、停止、暂停和循环等操作。
接下来,我们需要确保我们的程序可以访问mcisendstring函数。
为了使用该函数,我们需要引入Windows多媒体控制器的API库。
在C语言中,我们可以通过include语句来引入相关的库文件。
一般来说,我们需要引入Windows.h头文件和Winmm.lib库文件。
include <Windows.h>include <mmsystem.h>pragma comment(lib, "Winmm.lib")然后,我们需要定义一个字符串变量,并初始化它。
这个字符串变量将包含我们要播放的音频文件的路径名。
在实际的应用中,你可以根据需要修改这个路径名。
char* audioFilePath = "C:\\music\\song.wav";现在,我们可以使用mcisendstring函数来播放我们的音频文件了。
我们可以通过发送一个带有播放命令的字符串给多媒体控制器来实现。
命令字符串可以使用"MCI_OPEN"、"MCI_PLAY"和"MCI_CLOSE"等指令。
char commandString[256];sprintf(commandString, "open s alias music", audioFilePath);mciSendString(commandString, NULL, 0, NULL);mciSendString("play music", NULL, 0, NULL);在上面的代码中,我们首先使用sprintf函数将音频文件的路径名和"open"指令组合成一个完整的命令字符串。
VC 多媒体技术 MCI使用
MCI 命令列表 命令说明 命令类型
返回有关 MCI 设备的信息 为一个指定的 MCI 设备设置一个终止键 播放 Windows 指定的系统声音 关闭一个 MCI 设备 获得一个 MCI 设备的性能参数 从一个 MCI 设备得到有关的信息 初始化一个 MCI 设备 从 MCI 设备返回有关的状态 从一个磁盘文件中加载数据 暂停播放 开始播放 开始记录数据 重新开始播放或录音 将数据存储到磁盘文件中 向前或向后检索 设置设备信息 停止播放或记录 常用的 MCI 函数 类型 向 MCI 发送命令消息函数 可选命令 通用命令 系统命令
说 明: (1)mail.wav 是一个 WAV 声音文件,第 4 步时已经复制到此项目文件中。程序首先打开了 MCI 设 备,并把设备标识赋给了类的成员变量 m_MCIDeviceID。注意声音文件名不要带扩展名.wav。
6、播放声音文件 用 ClassWizard 为播放按钮(IDC_PLAY) ,在 CMyDlg 类添加鼠标单击的消息映射函 数,并加如下代码: void CMyDlg::OnPlay() { //添加控件通知消息处理代码 MCI_PLAY_PARMS mciPlayParms; mciPlayParms.dwFrom=0; //从文件开始处开始播放 mciSendCommand(m_MCIDeviceID,MCI_PLAY,MCI_FROM, (DWORD)(LPVOID)&mciPlayParms); } 7、在程序退出时停止播放并关闭 MCI 设备 用 ClassWizard 为 CMyDlg 类添加 WM_DESTROY 消息, 该消息映射函数能使程序 退出时停止声音文件的播放并关闭 MCI 设备。 void CMyDlg::OnDestroy() { CDialog::OnDestroy(); mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL); //停止播放 mciSendCommand(m_MCIDeviceID,MCI_CLOSE,MCI_WAIT,NULL); //关闭 MCI 设备 } (8)编译并运行程序,在单击“播放”按钮时,程序将播放声音;当单击“退出”按 钮或单击窗口的关闭按钮时,声音播放会立即停止。 7.2 MCI(媒体控制接口) 媒体控制接口(Media Control Interface)为 Windows 程序提供了在高层次上控制媒 体设备接口的能力。程序不必关心具体设备,就可以对激光唱机(CD) 、视盘机、波形 音频设备、视频播放设备和 MIDI 设备等媒体设备进行控制。对于程序员来说,可以把 MCI 理解为设备面板上的一排按钮,通过选择不同的按键(发送不同的 MCI 命令)就可以 让设备完成各种功能,而不必关心设备内部实现。例如,对于 play 按键,视盘机和 CD
MCI详解
(1)首先,要在USES里加上Mmsystem函数声明如下:functionmciSendStringA(lpstrCommand,lpstrReturnString:PAnsiChar;uReturnLength:UINT;hWndCallback;HWND);MCIERROR;stdcall; functionmciSendStringW(lpstrCommand,lpstrReturnString:PWideChar;uReturnLength:UINT;hWndCallback:HWND);MCIERROR;stdcall;functionmciSendString(lpstrCommand,lpstrReturnString:Pchar;uReturnLength:UINT;hWndCallback:HWND);MCIERROR;stdcall;具体请参考帮助MCI命令消息接口函数:mciSendCommand发送命令消息函数mciGetDeviceID返回打开设备的IDmciGetErrorString返回mciSendCommand错误代码对应的字符串向MCI设备发送命令消息时使用mciSendCommand(mciID:MCIDEVICEID;uMessage:UINT;dwParam1,dwParam2:DWORD);MCIERR OR;stdcall;mciID:接受命令消息的MCI设备的IDuMessage:命令消息dwParam1:命令消息标志dwParam2:指向接收命令消息参数块地址MCIERROR:返回值,如果为0,表示调用成功,否则失败.获得错误代码后通过function mciGetErrorString(mcierr:MCIERROR;pszT ext;Pchar;uLength:UINT):BOOL;stdcall;来获得相应的错误字符串.该函数参数说明如下:mcierr:由mciSendCommand返回的错误代码pszText:存放与mcierr相对应的字符串的地址uLength:指定pszText指向的缓冲区大小,MCI返回的字符串长度最大为128个字符BOOL:返回值,为true则成功,否则,就没有此错误代码下面这个函数,是获取MCI设备ID的functionmciGetDeviceID(pszDevice:Pchar):MCIDEVICEID;stdcall;pszDevice:指定已经打开的MCI设备名称MCIDEVICEID:返回值,为返回的ID.关于设备名称,请打开system.ini文件在[mci]段例如:cdaudio=mcicda.drvsequencer=mciseq.drvwaveaudio=mciwave.drvavivideo=mciavi.drvvideodisc=mcipionr.drvvcr=mcivisca.drvMPEGVideo=mciqtz.drvcdaudio和sequencer等就是设备名MCI详解[连载二]什么是MCI,MCI是多媒体控制接口(Media Control Interface)的缩写.它包括基于命令字符串,消息方式与设备驱动程序进行通讯的可扩充接口和MCI设备驱动程序.支持MCI指令的设备有ANIMATION(动画播放设备)CDAUDIO(CD音频设备)WAVEAUDIO(波形音频设备)OVERPLAY(视频叠加设备,如Video Blaster)DIGITALVIDEO(窗体数字视频,如回放*.avi文件)VIDEODISC(激光视频设备)VCR(可程控录像机)SEQUENCER(MIDI序列发生器)打开WINDOWS子目录下的SYSTEM.INI文件,在[MCI]段就能看到以上设备的安装信息,格式为:DeviceType = Driver设备名= 驱动程序名打开WIN.INI文件,打开[mci extensions],找到如下段[mci extensions]mid=Sequencerrmi=Sequencerwav=waveaudioavi=AVIVideocda=CDAudioaif=MPEGVideoaiff=MPEGVideoaifc=MPEGVideoau=MPEGVideom1v=MPEGVideomov=MPEGVideomp2=MPEGVideompa=MPEGVideompe=MPEGVideompeg=MPEGVideompg=MPEGVideoqt=MPEGVideosnd=MPEGVideodat=MPEGVideo其格式为: 文件扩展名= 设备名在程序设计中,指定一个mci设备,就是指定设备名,当然,还可以指定相对应的设备类型常数:MCI设备与设备类型常数设备类型设备类型常数cdaudio MCI_DEVTYPE_ANIMATIONanimation MCI_DEVTYPE_CD_AUDIOdat MCI_DEVTYPE_DATdigitalvideo MCI_DEVTYPE_DIGITAL_VIDEOother MCI_DEVTYPE_OTHERoverlay MCI_DEVTYPE_OVERLAYscanner MCI_DEVTYPE_SCANNERsequencer MCI_DEVTYPE_SEQUENCERvcr MCI_DEVTYPE_VCRvideodisc MCI_DEVTYPE_VIDEODISCwaveaudio MCI_DEVTYPE_WAVEFORM_AUDIOMCI设备还有简单型(Simple)和复合型(Compound)之分,MCI将不需要文件的设备称作简单型设备(Simple Device),如CDAudio等,将需要文件的设备称作复合型设备(Compound Device),如Sequencer,Waveaudio等.MCI详解[连载三]在连载一里,我解释了几个MCI的函数(请参考连载一)WINDOWS中的多媒体扩展部分的消息由两类:一是发送到窗体,有窗体函数处理的消息均以MM开头.二是用于回调函数和基于消息的API消息,由应用程序发送,实现与MCI设备的通讯.DELPHI中有32种命令消息,按用途分为:1,系统命令消息:由MCI直接解释,不依耐设备性能.2,必须命令消息:所有MCI设备都支持,用于打开,关闭设备并获得有关信息.3,基本命令消息:所有的MCI设备都支持,但并非完全支持,遇到不支持的某一个消息时,返回MCIERR_UNSUPPORTED_FUNCTION.4,扩展命令消息,用于特定设备.扩展命令消息分三种:(1)使用MCI元素文件扩展命令消息(FAQ A:何谓元素?Q:复合型设备在打开时既要指定设备名,又要指定文件名,而文件名就被称为元素.A:何谓复合型设备?Q:参考连载二)(2)设备操作与定位扩展命令消息(3)窗口式视频设备扩展命令消息此外,MCI还使用MCI_MCINOTIFY告诉应用程序一条MCI消息已经发送,它是窗口通知消息,要得到此消息,应用程序要指定一个窗体处理该消息.消息分类:系统命令消息MCI_BREAK 设置指定设备的中止键MCI_SOUND 播放WINDOWS声音MCI_SYSINFO 获取信息必须命令消息MCI_CLOSE 关闭设备MCI_GETDEVCAPS 获取设备性能信息MCI_INFO 获得设备信息MCI_OPEN 打开设备并获得IDMCI_STATUS 获得状态信息基本命令消息MCI_LOAD 载入文件MCI_PAUSE 暂停设备MCI_PLAY 播放MCI_RECORD 录制MCI_RESUME 恢复暂停MCI_SAVE 保存文件MCI_SEEK 在元素内定位MCI_SET 设置设备参数MCI_STOP 停止扩展命令消息[使用元素文件扩展命令消息]MCI_COPY 拷贝数据MCI_CUT 剪切MCI_DELETE 删除MCI_PASTE 粘贴[设备操作与定位扩展命令消息]MCI_CUE 为播放或录制操作插入一个设备MCI_ESCAPE 把一串命令发送到命令处理器MCI_SPIN 开始或中止旋转可转动设备MCI_STEP 步进帧[窗口式视频设备扩展命令消息]MCI_FREEZE 冻结画面MCI_PUT 定义源或目的裁剪矩形区MCI_REALIZE 实现图形设备的调色板MCI_UNFREEZE 与FREEZE相反MCI_UPDATE 刷新MCI_WHERE 确定剪裁区域MCI_WINDOW 为一个图形设备及它的显示方式指定一个窗口和窗口风格MCI连载四发送MCI命令消息有的需要花很长时间才能完成,如播放AVI文件,是否在播放完成前就将控制权返回到APPLICATION,是由命令消息标志确定的.命令消息标志分专用标志和通用标志,专用消息与命令消息配套使用,通用消息适用于所有命令消息:MCI_NOTIFY和MCI_WAITMCI_NOTIFY:通知标志,表示规定动作完成后,给随同发送命令消息的数据结构dwCallBack字段指定的窗口发送MM_MCINOTIFY消息,这个消息由dwCallBack字段指定的回调函数处理]MCI_WAIT:等待标志,表示在规定操作完成后,再将控制权转交APPLICATION,比如播放AVI文件完成后,APPLICATION才能获得控制权,但可以用MCI_BREAK来中断.再说一遍mciSendCommand函数结构:mciSendCommand(mciID:MCIDEVICEID;uMessage:UINT;dwParam1,dwParam2:DWORD);MCIERR OR;stdcall;mciID:接受命令消息的MCI设备的IDuMessage:命令消息dwParam1:命令消息标志dwParam2:指向接收命令消息参数块地址MCIERROR:返回值,如果为0,表示调用成功,否则失败.获得错误代码后通过function mciGetErrorString(mcierr:MCIERROR;pszT ext;Pchar;uLength:UINT):BOOL;stdcall;其中dwParam1是消息指定标志,dwParam2是消息数据结构以MCI_OPEN为例,打开Mmsystem.pas文件,找到如下:typePMCI_Open_ParmsA = ^TMCI_Open_ParmsA;PMCI_Open_ParmsW = ^TMCI_Open_ParmsW;PMCI_Open_Parms = PMCI_Open_ParmsA;{$EXTERNALSYM tagMCI_OPEN_PARMSA}tagMCI_OPEN_PARMSA = record*********dwCallback: DWORD;wDeviceID: MCIDEVICEID;lpstrDeviceType: PAnsiChar;lpstrElementName: PAnsiChar;lpstrAlias: PAnsiChar;end;{$EXTERNALSYM tagMCI_OPEN_PARMSW}tagMCI_OPEN_PARMSW = record*********dwCallback: DWORD;wDeviceID: MCIDEVICEID;lpstrDeviceType: PWideChar;lpstrElementName: PWideChar;lpstrAlias: PWideChar;end;其中可以看出(注意有*的语句),参数是一个记录类型,也就是说dwParam1和dwParam2是两个记录类型的数据,在使用时赋值要注意类型.再以MCI_OPEN命令为例,其语法为:dwReturn:=mciSendCommand(wDeviceID,MCI_OPEN,dwFlags,DWORD(mciOpenParam));-----------------------------------------------------------在var段申明:varwDeviceID:MCIDEVICEID; //存放设备IDdwReturn:MCIERROR; //存放返回值mciOpenParam:PMCI_OPEN_PARMS; //MCI_OPEN命令消息的数据结构-----------------------------------------------------------在适当位置为mciOpenParam申请空间new(mciOpenParam);最后还要释放空间dispose(mciOpenParam);-----------------------------------------------------------为需要在命令消息数据结构中需要的字段赋值,mciOpenParam^.lpstrDeviceType:='cdaudio';-----------------------------------------------------------最后,调用发送函数dwReturn:=mciSendCommand(0,//打开设备前ID为0MCI_OPEN, //命令消息MCI_OPEN_TYPE, //消息标志,表示字段lpstrDeviceType有值DWORD(mciOpenParam)); //数据结构dwReturn若为0,表示调用成功.MCI详解[连载五]MCI命令字符串接口函数与命令消息方式相似,MCI为发送命令字符串提供了两个函数:](1) mciSendString(2) mciExecute函数(2)是(1)的简化形式,函数(1)返回的错误代码和相应的错误信息与命令消息函数相同.函数(2)如果出现错误,则以消息框形式提示.functionmciSendString(lpstrCommand,lpstrReturnString:Pchar;uReturnLength:UINT;hWndCallback:HWND):MCIERROR;stdcall;lpstrCommand:指向以nil结尾的mci命令字符串lpstrReturnString:返回信息的缓冲区,可以设置成nil,则不返回信息hWndCallback:接收MM_MCINOTIFY消息的窗口句柄,如果命令包含Notify标志,则此参数必须要MCIERROR:返回值,为0表示调用成功.错误代码要用函数mciGetErrorString获得错误信息functionmciExecute(pszCommand:LPCSTR):BOOL;stdcall;这是函数(1)的简化形式pszCommand:MCI命令字符串返回值:返回true,表示调用成功;返回false,则用messagebox显示错误信息命令字符串语法格式:commanddevice_name argumentcommand:MCI命令字符串device_name:设备名或设备元素argument:命令的标志和参数标志:由MCI命令支持的关键字组成参数:标志所带参数注:argument可以是字符串,带符号的长整数和矩形等数据类型,参数之间用空格隔开.例1:播放cd,从当前位置播放到10 000ms处停止playcdaudio to 10000例2:以别名形式对cdaudio操作opencdaudio alias cdplay cdstop cdclose cd使用别名的好处:当设备名或元素名较长时,操作起来不方便,就为它指定一个别名, 例如本例就是将设备cdaudio指定一个别名cd,后面就对cd进行操作.MCI详解[连载六]命令字符串分类:用mciSendString和mciExecute函数发送的字符串命令分为四大类:系统命令:由MCI直接解释,不发送给设备.必需命令:所有设备都支持.基本命令:设备对这些命令可选.扩充命令:仅适用于某些设备.字符串命令表类别命令名功能系统命令break 中止,放弃waitsound 播放windows声音(win.ini文件中[Sound]段) sysinfo获取MCI系统信息必需命令capability 获取设备性能信息close 关闭设备info 获取设备型号,厂家等信息open 初始化status 状态信息基本命令load 载入设备元素pause 暂停play 播放record 录制resume 恢复暂停save 存盘seek 在媒体内定位set 设置status 获取设备状态信息stop 停止播放或录制命令字符串举例:(用于mciSendString发送)capabilitymysound device type//返回"mysound"的设备类型closemysound//关闭"mysound"设备configureavi//打开AVI播放设备对话框cuemysound input//为录制准备设备"mysound"deletemysound from 1 to 900//删除波形音频1到900ms之间的数据infomysound product//取回与"mysound"相关的硬件描述open new type waveaudio alias mysound buffer 6//打开"mysound"设备,mysound是别名,缓冲区为6秒pausemysound//暂停"mysound"设备playmysound from 1 to 500 notify(wait)//播放"mysound"从位置1到500,播放后发送通知消息(notify)或播放时等待(wait) realizemyvideo normal//告诉"myvideo"设备实现它的调色板recordmysound//从当前位置开始录制resumemysound//恢复暂停savevboard c:\v1.tga//将视频缓冲区的内容存入v1.tga中seekmysound to start//定位到"mysound"相关文件的开始statusmysound mode//返回"mysound"当前模式step movie by 5//从当前帧开始播放5帧stopmysound//停止播放或录制。
MCI_windows编程实现实例
MCI接口编程实验一、实验目的熟悉Windows下声卡编程的基本过程及原理,掌握Windows下MCI编程的基本知识。
二、预备知识VC5编程方法、MCI编程方法。
三、实验原理设计多媒体程序,关键是对多种媒体设备的控制和使用,在Window s和Windows95系XP统中,对多媒体设备进行控制主要有三种方法:第一种方法是使用微软公司窗口系统中对多媒体支持的MCI,即媒体控制接口,MCI是多媒体设备和多媒体应用软件之间进行设备无关的沟通的桥梁。
在VB和VC中,MCI都得到了很好的支持。
第二种方法,通过调用Windows 的API(应用程序接口)多媒体相关函数实现媒体控制。
第三种方法是使用OLE(Object Linking & Embedding),即对象链接与嵌入技术,它为不同软件之间共享数据和资源提供了有力的手段。
我们在本实验中用最简单的方法来实现声音的播放和录制—媒体控制接口编程。
有关知识请阅读附录中“VC多媒体”部分。
四、实验要求本实验非常简单和基础,请已经熟悉VC和MCI这些内容的同学耐心地再做一遍。
请同学们参照示例中的程序代码,编制自己的声卡程序并应用各种声音播放的方法。
具体要求如下:1. 学会使用PlaySound()、SndPlaySound()来播放WAV文件;2. 学会使用mciSendCommand()或mciSendString()来播放WAV文件;3. 学会使用mciSendCommand()或mciSendString()来录制WAV文件;4. 实验完成以后,需要实验室老师检查通过。
5. 在意思清楚、完整的前提下,思考题的回答越精炼越好。
6. 在以上基本要求完成的前提下,有能力的同学可以试一下用MCI接口播放其他格式的文件;制作一个媒体播放器。
五、使用示例1. sndPlaySound("ding.wav",SND_SYNC);2. PlaySound("chord.wav",NULL,SND_SYNC );3. 使用两个高级MCI 函数a. 播放MIDI 文件示例{HWND hwnd;MCI_OPEN_PARMS mciopen;MCI_OPEN_PARMS mciplay;DWORD rtrn;char b[80];hwnd =GetActiveWindow()->m_hWnd;mciopen.lpstrElementName = "e:\\test\\test.rmi";mciopen.lpstrDeviceType = "sequencer" ;rtrn = mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT, (DWORD)(LPVOID)&mciopen); if(rtrn != 0){mciGetErrorString(rtrn,(LPSTR)b,80);::MessageBox(hwnd,b,"MCI ERROR!",MB_OK);}wDeviceID = mciopen.wDeviceID;mciplay.dwCallback = (DWORD)hwnd;rtrn = mciSendCommand(wDeviceID,MCI_PLAY ,MCI_NOTIFY ,(DWORD)(LPVOID)&mciplay); if (rtrn != 0L){ mciGetErrorString(rtrn,(LPSTR)b,80);::MessageBox(hwnd,b,"MCI Error",MB_OK);mciSendCommand(wDeviceID,MCI_CLOSE,0,NULL);}}//停止播放{HWND hwnd;MCI_GENERIC_PARMS mcistop;hwnd =GetActiveWindow()->m_hWnd;mcistop.dwCallback = (DWORD)hwnd; mciSendCommand(MCI_DEVTYPE_SEQUENCER,MCI_STOP,0,(DWORD)(LPVOID)&mcistop);}b.录音示例 { HWND hwnd;MCI_OPEN_PARMS mciopen;MCI_RECORD_PARMS mci1;MCI_SA VE_PARMS mcisave;DWORD rtrn;char b[80];hwnd =GetActiveWindow()->m_hWnd;mciopen.lpstrElementName = "e:\\ding.wav";mcisave.lpfilename = "e:\\ding.wav";mciopen.lpstrDeviceType = "waveaudio";rtrn = mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT, (DWORD)(LPVOID)&mciopen); if(rtrn != 0){mciGetErrorString(rtrn,(LPSTR)b,80);::MessageBox(hwnd,b,"MCI ERROR!",MB_OK);} wDeviceID = mciopen.wDeviceID;mci1.dwCallback = (DWORD)hwnd;rtrn = mciSendCommand(wDeviceID,MCI_RECORD,MCI_NOTIFY ,(DWORD)(LPVOID)&mci1); if (rtrn != 0L){ mciGetErrorString(rtrn,(LPSTR)b,80);::MessageBox(hwnd,b,"MCI Error",MB_OK);mciSendCommand(wDeviceID,MCI_CLOSE,0,NULL);}}//保存到文件并停止录音{HWND hwnd;MCI_SA VE_PARMS mcisave;MCI_OPEN_PARMS mciopen;DWORD rtrn;char b[80];hwnd =GetActiveWindow()->m_hWnd;mciopen.lpstrElementName = "e:\\ding.wav";mcisave.lpfilename = "e:\\ding.wav";mciopen.lpstrDeviceType = "waveaudio";mcisave.dwCallback = (DWORD)hwnd;rtrn = mciSendCommand(wDeviceID,MCI_SA VE,MCI_NOTIFY,(DWORD)(LPVOID)&mcisave);if (rtrn != 0L){mciGetErrorString(rtrn,(LPSTR)b,80);save",MB_OK);::MessageBox(hwnd,b,"MCIErrormciSendCommand(wDeviceID,MCI_CLOSE,0,NULL);}}c. 实验示例现给出VC5下的声卡编程样本程序test.exe及其源代码。
如何打开关闭光驱门
如何打开关闭光驱门使用MS提供的多媒体控制API可以非常容易地实现此功能。
有两种方法,分别使用mciSendCommand, mciSendString1. 使用mciSendCommandMCIDEVICEID mciID;MCI_OPEN_PARMS OpenParms;//光驱的设备名OpenParms.lpstrDeviceType = "cdaudio";//打开此设备mciSendCommand (NULL, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE, (DWORD)LPVOID) &OpenParms);//得到设备IDmciID = mciGetDeviceID(OpenParms.lpstrDeviceType);//打开光驱门//将下句中的MCI_SET_DOOR_OPEN更改为MCI_SET_DOOR_CLOSED即为关闭光驱门mciSendCommand(mciID, MCI_SET, MCI_WAIT | MCI_SET_DOOR_OPEN, NULL);2. 使用mciSendString,这种方法更为简便//打开光驱门//将此语句中的open更改为close即为关闭光驱的门mciSendString( "set cdaudio door open", NULL, 0, NULL);如何顶端显示CStatic类文字?我正写一个小的应用程序,我想显示一串文本(CStatic)并且无论别的应用程序运行时是否覆盖,这些文字总会在最上面显示.1)用CreateEx来建立一个WS_POPUP窗口,使这个窗口总在最上面(always on top)然后在该窗口中实现文字显示.2)建立窗口时用SetWindowPos()函数,用&wndTopMost作为第一个参数,这样就可以完成你想做的了.。
MFC音乐播放器(MCI)
MCI的命令消息接口,所有MCI命令消息都是通过mciSendCommand函数发送的,函数声明为:MCIERROR mciSendCommand(MCIDEVICEID wIDDevice,//设备的ID,在打开设备时不用该参数UINT uMsg,//命令消息DWORD fdwCommand,//命令消息的标志DWORD dwParam//指向包含命令消息参数的结构);//若成功则返回0,否则返回错误码编辑本段MCI简介对于程序员来说,可以把MCI理解为设备面板上的一排按键,通过选择不同的按键(发送不同的MCI命令)可以让设备完成各种功能,而不必关心设备内部实现。
比如,对于play,视盘机和CD机有不同的反应(一个是播放视频,一个播放音频),而对用户来说却只需要按同一按钮。
应用程序通过向MCI发送命令来控制媒体设备。
MCI命令接口分命令字符串和命令消息两种,两者具有相同的功能。
命令字符串具有使用简单的特点,但是它的执行效率不如命令消息。
编辑本段mciSendCommand详细MCI的命令消息接口提供了C语言接口,它速度更快,并且更能符合C/C++程序员的需要。
所有MCI命令消息都是通过mciSendCommand函数发送的,函数声明为:MCIERROR mciSendCommand(MCIDEVICEID wIDDevice,//设备的ID,在打开设备时不用该参数UINT uMsg,//命令消息DWORD fdwCommand,//命令消息的标志DWORD dwParam//指向包含命令消息参数的结构);//若成功则返回0,否则返回错误码变量wDeviceID用来保存设备的ID,系统用ID来标识不同的设备,以保证命令发给正确的对象。
void CTttView::OnMyMenu(){MCI_OPEN_PARMS mciOpen;UINT wDeviceID;mciOpen.lpstrDeviceType="avivideo";mciOpen.lpstrElementName="myfolder\\clock.avi";mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD)&mciOpen);wDeviceID=mciOpen.wDeviceID;MCI_PLAY_PARMS mciPlay;mciSendCommand(wDeviceID,MCI_PLAY,MCI_WAIT,(DWORD)&mciPlay););----MCI可以通过mciSendCommand()和mciSendString()来完成,本文仅使用mciSendCommand()函数。
Mci的使用方法
wDeviceID=mciOpen.wDeviceID;
MCI_PLAY_PARMS mciPlay;
mciSendCommand(wDeviceID, MCI_PLAY, MCI_WAIT, (DWORD)&mciPlay);
LPTSTR lpszErrorText, //接收描述错误的字符串的缓冲区
UINTcchErrorText//缓冲区的长度
);
下面是使用mciSendString函数的一个简单例子:
char buf[50];
MCIERROR mciError;
mciError=mciSendString("open cdaudio",buf,strlen(buf),NULL);
void CTttView::OnMyMenu()
{
MCI_OPEN_PARMS mciOpen;
UINT wDeviceID;
mciOpen.lpstrDeviceType = "avivideo";
mciOpen.lpstrElementName = "myfolder\\clock.avi";
MCI命令的使用是很随意的,只要先打开,最后关闭,中间可以随意调用各种命令。
(1) open打开设备
MCI设备使用前必须先打开,当然,使用后也必须要关闭,以免影响他人的使用。
open device_name type device_type alias device_alias
device_name要使用的设备名,通常是文件名。
MFC做音乐播放器——你懂的
前言:音乐播放器其实我在大一的时候就用非常生硬的语法写出过一个非常简陋的播放器。
这次写的这个是以前那个的加强版。
虽然说还是有很多bug,而且我至今不知道那些BUG是什么地方的问题。
先给个截图吧,播放器的界面:其实看着还是有那么回事的。
恩,其实除了波形和在线下载的话,功能和酷狗,以及千千静听等播放器的功能是一样的。
音乐播放器的关键是播放音乐,所以第一步是要设计一个类,这个类拥有各种各样的播放音乐的能力。
我设计的类名字叫Playerclass Player{public:Player();virtual ~Player();void Play();//播放函数void Pause();//暂停函数void Stop();//停止函数void Jump(DWORD pos);//这个函数是用来通过直接拖动进度条,然后播放从歌曲的相应位置播放的函数void Read(CString str);//这个函数必须在所有函数的前面调用,他有一个传入参数,是指MP3文件的路径void SetVolume(DWORD vol);//音量大小的设定。
这个不难MCI_STATUS_PARMS GetMode();//这个比较关键,是获得当前的播放状态(一首歌是否播放完了就是靠他)MCI_STATUS_PARMS GetNow();//当前是播放的歌曲第几分第几秒?可以用来改变时间栏和进度条MCI_STATUS_PARMS GetLenth();//获得歌曲的长度。
(时间)private:MCI_PLAY_PARMS m_play;MCI_OPEN_PARMS m_open;MCIDEVICEID m_dID;HWND m_parent;MCI_STATUS_PARMS m_status;MCI_SEEK_PARMS m_seek;MCI_STATUS_PARMS m_mode;};各个函数(可以作为以后MCI函数的查阅手册)实现方法是:void Player::Read(CString str){m_dID=NULL;m_open.lpstrElementName=str;mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&m_o pen);//MCI打开文件m_dID=m_open.wDeviceID;}void Player::Play(){m_play.dwCallback=(DWORD)m_parent;mciSendCommand(m_dID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&m_play);//播放.....下面就不写注释了}void Player::Pause(){mciSendCommand(m_dID,MCI_PAUSE,NULL,NULL);void Player::Stop(){mciSendCommand(m_dID,MCI_CLOSE,NULL,NULL);m_status.dwReturn=0;}MCI_STATUS_PARMS Player::GetLenth(){m_status.dwItem=MCI_STATUS_LENGTH;mciSendCommand(m_dID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)(LPVOID)&m_s tatus);return m_status;}MCI_STATUS_PARMS Player::GetNow(){m_status.dwItem=MCI_STATUS_POSITION;mciSendCommand(m_dID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)(LPVOID)&m_s tatus);return m_status;}MCI_STATUS_PARMS Player::GetMode(){m_mode.dwItem=MCI_STATUS_MODE;mciSendCommand(m_dID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)(LPVOID)&m_ mode);return m_mode;}void Player::Jump(DWORD pos){m_seek.dwTo=pos;mciSendCommand(m_dID,MCI_SEEK,MCI_TO|MCI_WAIT,(DWORD)(LPVOID)&m_seekmciSendCommand(m_dID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&m_play);}void Player::SetVolume(DWORD vol){MCI_DGV_SETAUDIO_PARMS mcivol;mcivol.dwCallback=(DWORD)m_parent;mcivol.dwItem=MCI_DGV_SETAUDIO_VOLUME;mcivol.dwValue=vol;mciSendCommand(m_dID,MCI_SETAUDIO,MCI_DGV_SETAUDIO_VALUE|MCI_DGV_ SETAUDIO_ITEM,(DWORD)(LPVOID)&mcivol);}基本上都是运用mciSendCommand这个函数,传入不同的参数,就可以达到不同的效果。
mcisendstring用法seek -回复
mcisendstring用法seek -回复mcisendstring是Windows操作系统提供的一个功能强大的函数,用于发送命令字符串到指定的设备。
在本文中,我们将详细讨论mcisendstring 函数的用法,并提供一步一步的指导来解释如何使用该函数。
首先,让我们先了解一下mcisendstring函数的基本概念和用途。
该函数是多媒体控制接口(MCI)的一部分,用于控制多媒体设备(如音频和视频设备)。
通过发送命令字符串到指定的设备,我们可以实现对设备的控制和操作。
接下来,我们将详细介绍mcisendstring函数的语法和参数。
mcisendstring函数的完整语法如下:c++MCIERROR mciSendString(LPCTSTR lpszCommand,LPTSTR lpszReturnString,UINT cchReturn,HANDLE hWndCallback);参数说明如下:- lpszCommand:命令字符串,用于指定需要执行的设备控制命令。
- lpszReturnString:用于接收函数执行结果的字符串缓冲区。
- cchReturn:接收缓冲区的大小,以字符数量为单位。
如果lpszReturnString的大小超出了cchReturn的值,则函数会截断字符串。
- hWndCallback:回调窗口的句柄。
该参数通常设置为NULL,以使用默认的回调机制。
在使用mcisendstring函数之前,我们需要了解将要发送的命令字符串的语法。
命令字符串通常由命令关键字和参数组成,它们之间以空格分隔。
下面是一个示例命令字符串:c++"open C:\music\song.mp3"上述命令字符串包含了一个命令关键字“open”和一个参数“C:\music\song.mp3”。
该命令的作用是打开一个名为“song.mp3”的音乐文件。
在准备好命令字符串后,我们可以开始使用mcisendstring函数来实现相应的设备控制。
C#调用mciSendString播放音频文件
C#调⽤mciSendString播放⾳频⽂件mciSendString函数是⼀个WinAPI,主要⽤来向MCI(Media Control Interface)设备发送字符串命令。
⼀、函数的声明如下:private static extern long mciSendString(string command, //MCI命令字符串string returnString, //存放反馈信息的缓冲区int returnSize, //缓冲区的长度IntPtr hwndCallback //回调窗⼝的句柄,⼀般为NULL);⼆、完整的代码如下,其中的细节都有注释说明。
需要注意两点:1、⽂件路径要⽤""包含起来;2、线程需要指定为STA。
using System;using System.Runtime.InteropServices;using System.Threading;namespace Zhy.MCI{/** 调⽤API函数mciSendString播放⾳频⽂件* 主要包括按指定次数播放以及循环播放* 作者:Zhy* 时间:2015-7-21*/public class MCI{[DllImport("winmm.dll")]private static extern long mciSendString(string command, //MCI命令字符串string returnString, //存放反馈信息的缓冲区int returnSize, //缓冲区的长度IntPtr hwndCallback //回调窗⼝的句柄,⼀般为NULL); //若成功则返回0,否则返回错误码。
///<summary>///按指定次数播放///</summary>///<param name="file"></param>private void PlayWait(string file){/** open device_name type device_type alias device_alias 打开设备* device_name 要使⽤的设备名,通常是⽂件名。
mciSendString用法
mciSendString用法使用MCI API,源文件中需要包含头文件Mmsystem.h,在Project->Settings->Link->Object/libray module中加入库Winmm.lib。
VS2008在源文件加上#include "mmsystem.h" #pragmacomment(lib,"winmm.lib")1、MCI简介MCI(Media Control Interface,媒体控制接口)向Windows程序提供了在高层次上控制媒体设备接口的能力。
程序不必关心具体设备,就可以对激光唱机(CD)、视盘机、波形音频设备、视频播放设备和MIDI设备等媒体设备进行控制。
对于程序员来说,可以把MCI理解为设备面板上的一排按键,通过选择不同的按键(发送不同的MCI命令)可以让设备完成各种功能,而不必关心设备内部实现。
比如,对于play,视盘机和CD机有不同的反应(一个是播放视频,一个播放音频),而对用户来说却只需要按同一按钮。
应用程序通过向MCI发送命令来控制媒体设备。
MCI命令接口分命令字符串和命令消息两种,两者具有相同的功能。
命令字符串具有使用简单的特点,但是它的执行效率不如命令消息。
所有的MCI命令字符串都是通过多媒体API函数mciSendString传递给MCI的,该函数的声明为:MCIERROR mciSendString(LPCTSTR lpszCommand, //MCI命令字符串LPTSTR lpszReturnString,//存放反馈信息的缓冲区UINT cchReturn, //缓冲区的长度HANDLE hwndCallback //回调窗口的句柄,一般为NULL); //若成功则返回0,否则返回错误码。
该函数返回的错误码可以用mciGetErrorString函数进行分析,该函数的声明为:BOOL mciGetErrorString(DWORD fdwError,//函数mciSendString返回的错误码LPTSTR lpszErrorT ext, //接收描述错误的字符串的缓冲区UINT cchErrorT ext//缓冲区的长度);下面是使用mciSendString函数的一个简单例子:char buf[50];MCIERROR mciError;mciError=mciSendString("opencdaudio",buf,strlen(buf),NULL);if(mciError){mciGetErrorString(mciError,buf,strlen(buf));AfxMessageBox(buf);return;}open cdaudio命令打开CD播放器,如果出错(如驱动器内没有CD)则返回错误码,此时可以用mciGetErrorString函数取得错误信息字符串。
mciSendString和mciSendCommand函数的简单使用
mciSendString和mciSendCommand函数的简单使用使用函数前必须应该包含头文件:#include<mmsystem.h>并导入库:#pragma comment<lib."winmm.lib">mciSendString是用来播放多媒体文件的API指令,可以播放MPEG,AVI,WAV,MP3,等等函数原型如下:MCIERROR mciSendString(LPCTSTR lpszCommand, //命令字符串:如open、play 、close等LPTSTR lpszReturnString, //接受返回信息的字符串一般为NULLUINT cchReturn, //返回字符串的大小HANDLE hwndCallback //回调窗口句柄);该函数返回的错误码可以用mciGetErrorString函数进行分析,该函数的声明为:BOOL mciGetErrorString(DWORD fdwError, //错误代码LPTSTR lpszErrorText, //接收错误描述信息UINT cchErrorT ext //第二参数的大小);1、mciSendString函数播放mp3文件其步骤为:打开----->>使用(播放、停止等)----->>关闭(不使用应该关闭)例如打开当前工程下res文件中的mp3文件:mciSendString(_T("open res\\和兰花在一起.mp3 alias music"),NULL,0,NULL);//打开文件需要用到打开命令:open device_name type device_type alias device_aliasdevice_name:设备名,一般使用文件名字type device_type:设备类型,可省略alias device_alias:设备别名,在以后操作时可以使用此名字,方便mciSendString(_T("play music repeat"),NULL,0,NULL);//重复播放需要用到的播放参数:play device_alias from pos1 to pos2 wait repeatdevic_alias:含义同上from pos1 to pos2:从指定的磁道播放到另一磁道,如果省略form pos1则从当前开始磁道播放;若省略to pos2 则播放至结束wait:如果指定这关键,则函数只有等到播放完才返回repea:决定是否重复播放mciSendString(_T("close music"),NULL,0,NULL);//关闭音乐2、mciSendCommand播放mp3文件该函数与mciSendString函数不同,该函数是基于命令消息(定义的常量)的,而mciSendString函数的命令是基于字符串的函数原型如下:MCIERROR mciSendCommand(MCIDEVICEID IDDevice, //设备的ID,打开是不用此参数UINT uMsg, //命令消息,如:MIC_OPEN(与上述open字符串是等价的)DWORD fdwCommand, //额外的命令标记,如:指定MCI_OPEN_ALIAS 则表明dwParam参数所指结构体中的lpOpen参数指向的为别名;若为MCI_OPEN_ELEMENT则表明lpOpen参数指向的为文件名DWORD_PTR dwParam //为一结构指针,如:MCI_OPEN_PARMS(打开是所需的结构体)、MCI_PLAY_PARMS (播放是所需的结构体)、MCI_GENERIC_PARMS(结束时所需的结构体));MCI_OPEN_PARMS open;//定义打开结构体变量open.lpstrElementName = _T("res\\和兰花在一起.mp3");//填充参数mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT,DWO RD_PTR(&open));//打开MCI_PLAY_PARMS play;//定义播放结构题变量mciSendCommand(open.wDeviceID,MCI_PLAY,MCI_WAIT,D WORD_PTR(&play));//播放,此处是阻塞模式,播放完后才返回。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MCI mciSendCommandMCI mciSendCommand使用MCI API,源文件中需要包含头文件Mmsystem.h,在Project->Settings->Link->Object/libray module中加入库Winmm.lib。
VS2008在源文件加上#include "mmsystem.h" #pragma comment(lib,"winmm.lib")1、MCI简介MCI(Media Control Interface,媒体控制接口)向Windows 程序提供了在高层次上控制媒体设备接口的能力。
程序不必关心具体设备,就可以对激光唱机(CD)、视盘机、波形音频设备、视频播放设备和MIDI设备等媒体设备进行控制。
对于程序员来说,可以把MCI理解为设备面板上的一排按键,通过选择不同的按键(发送不同的MCI命令)可以让设备完成各种功能,而不必关心设备内部实现。
比如,对于play,视盘机和CD机有不同的反应(一个是播放视频,一个播放音频),而对用户来说却只需要按同一按钮。
应用程序通过向MCI发送命令来控制媒体设备。
MCI 命令接口分命令字符串和命令消息两种,两者具有相同的功能。
命令字符串具有使用简单的特点,但是它的执行效率不如命令消息。
所有的MCI命令字符串都是通过多媒体API函数mciSendString传递给MCI的,该函数的声明为:MCIERROR mciSendString(LPCTSTR lpszCommand, //MCI命令字符串LPTSTR lpszReturnString,//存放反馈信息的缓冲区UINT cchReturn, //缓冲区的长度HANDLE hwndCallback //回调窗口的句柄,一般为NULL); //若成功则返回0,否则返回错误码。
该函数返回的错误码可以用mciGetErrorString函数进行分析,该函数的声明为:BOOL mciGetErrorString(DWORD fdwError,//函数mciSendString返回的错误码LPTSTR lpszErrorText, //接收描述错误的字符串的缓冲区UINT cchErrorText//缓冲区的长度);下面是使用mciSendString函数的一个简单例子:char buf[50];MCIERROR mciError;mciError=mciSendString("opencdaudio",buf,strlen(buf),NULL);if(mciError){mciGetErrorString(mciError,buf,strlen(buf));AfxMessageBox(buf);return;}open cdaudio命令打开CD播放器,如果出错(如驱动器内没有CD)则返回错误码,此时可以用mciGetErrorString 函数取得错误信息字符串。
2、MCI设备open是MCI打开设备的命令,cdaudio是MCI设备名。
MCI的设备类型如下:animation动画设备cdaudio CD播放器dat数字音频磁带机digitalvideo 某一窗口中的数字视频(不基于GDI)other未定义的MCI设备overlay重叠设备(窗口中的模拟视频)scanner图象扫描仪sequencer MIDI序列器videodisc视盘机waveaudio播放数字波形文件的音频设备设备名是在注册表或SYSTEM.INI的[mci]部分定义的,典型的[mci]段如下:[mci]cdaudio=mcicda.drvsequencer=mciseq.drvwaveaudio=mciwave.drvavivideo=mciavi.drvvideodisc=mcipionr.drv等号的左边是设备名,右边是对应的MCI驱动程序。
当安装了新的MCI驱动程序时,系统要用不同的设备名来区分。
3、MCI命令使用MCI设备一般包括打开、使用和关闭三个过程,常用的MCI命令有:open打开设备close关闭设备play开始设备播放stop停止设备的播放或记录record开始记录save保存设备内容pause暂停设备的播放或记录resume恢复暂停播放或记录的设备seek改变媒体的当前位置capacility查询设备能力info查询设备的信息status查询设备状态信息MCI的大部分命令可以控制不同的媒体设备,但其中record和save命令并不是所有MCI设备都可以使用。
MCI命令的使用是很随意的,只要先打开,最后关闭,中间可以随意调用各种命令。
(1) open打开设备MCI设备使用前必须先打开,当然,使用后也必须要关闭,以免影响他人的使用。
open device_name type device_type alias device_alias device_name要使用的设备名,通常是文件名。
type device_type设备类型,例如waveaudio或sequencer,可省略。
alias device_alias设备别名,指定后可在其他命令中代替设备名。
(2) play开始设备播放MCI设备打开后即可以播放,可使用设备名或别名。
play device_alias from pos1 to pos2 wait repeat若省略from则从当前磁道开始播放,若省略to则播放到结束。
若指明wait则等到播放完毕命令才返回。
若指明repeat则会不停的重复播放。
若同时指明wait和repeat则命令不会返回,本线程产生堵塞,通常会引起程序失去响应。
(3) 播放CDvoid CTttView::OnOpenCD(){mciSendString("open cdaudio",NULL,0,NULL);mciSendString("play cdaudio",NULL,0,NULL););void CTttView::OnStopCD(){mciSendString("stop cdaudio",NULL,0,NULL);mciSendString("close cdaudio",NULL,0,NULL););还可以:pause cdaudio 暂停播放。
resume cdaudio继续被暂停的播放。
seek cdaudio to <位置>移动到指定磁道。
set cdaudio door open/closed弹出或缩进CD盘。
(4) 播放多媒体文件void CTttView::OnMyMenu(){mciSendString("open myfolder\\tada.wav alias aa",NULL,0,NULL);或mciSendString("open myfolder\\flourish.mid alias aa",NULL,0,NULL);或mciSendString("open myfolder\\clock.avi alias aa",NULL,0,NULL);mciSendString("play aa wait",NULL,0,NULL);mciSendString("close aa",NULL,0,m_hWnd););(5) 录制声音void CTttView::OnStartRecord(){mciSendString("open new type waveaudio alias aa",NULL,0,NULL);mciSendString("record aa",NULL,0,NULL););void CTttView::OnStopRecord(){mciSendString("save aa c:\\aaa.wavwait",NULL,0,NULL);mciSendString("close aa",NULL,0,NULL););4、MCI命令消息到目前为止,我们使用的都是MCI命令字符串。
可以发现,命令字符串具有简单易学的优点,但这种接口与C/C++的风格相去甚远,如果程序要查询和设置大量数据,那么用字符串的形式将很不方便。
MCI的命令消息接口提供了C语言接口,它速度更快,并且更能符合C/C++程序员的需要。
所有MCI命令消息都是通过mciSendCommand函数发送的,函数声明为:MCIERROR mciSendCommand(MCIDEVICEID wIDDevice, //设备的ID,在打开设备时不用该参数UINT uMsg, //命令消息DWORD fdwCommand, //命令消息的标志DWORD dwParam //指向包含命令消息参数的结构); //若成功则返回0,否则返回错误码命令消息uMsg与命令字符串是对应的,例如,open与MCI_OPEN完成的是一样的功能。
变量wDeviceID用来保存设备的ID,系统用ID来标识不同的设备,以保证命令发给正确的对象。
void CTttView::OnMyMenu(){MCI_OPEN_PARMS mciOpen;UINT wDeviceID;mciOpen.lpstrDeviceType = "avivideo";mciOpen.lpstrElementName = "myfolder\\clock.avi";mciSendCommand(0, MCI_OPEN,MCI_OPEN_ELEMENT, (DWORD)&mciOpen);wDeviceID=mciOpen.wDeviceID;MCI_PLAY_PARMS mciPlay;mciSendCommand(wDeviceID, MCI_PLAY,MCI_WAIT, (DWORD)&mciPlay););可以看出,用命令消息比用命令字符串要复杂的多,但它的执行效率高。
===============================================midi第二篇mci (2007-02-01 04:28)所属分类: 默认分类文章标签: 无标签武汉石化设计院电算室周红汉 ---- 加入音乐是增强应用程序功能的所有方法中最简单的一个。