哥们,要学会用google啊,搜搜就有答案了嘛。
mciSendString的文档见:http://msdn.microsoft.com/en-us/library/dd757161(v=vs.85).aspx
头文件:windows.h
链接库:Winmm.lib
VS 2010添加链接库的方法:打开工程属性,左边的树形菜单选Linker->Input(如果是中文版,可能会翻译为链接-》输入),然后在右边面板里的Additional Dependencies(中文版里可能是 额外的依赖项)里输入:winmm.lib。
Header: Declared in Mmsystem.h. mmsystem.h
Library: Use Winmm.lib.
MCI Command String总览—完全参数篇
(注:本文以2000年七月的MSDN解释为准)
(由于小弟在MCI指令方面的认识有限,本文误解、疏漏甚至错误之处在所难免,请朋友们不吝指正。小弟的信箱是gangaro@163.com)
MCI Command String是多媒体设备的程序接口。通过它,我们可以打开一个多媒体文件,例如mp3,VCD,Mpeg4格式的文件等等,并对它进行播放,暂停,关闭等操作。现在小弟有幸给大家介绍一下MCI Command String的使用方法。
MCI Command String是通过mciExecute或mciSendString两个函数执行的。这两个函数的声明如下:
Private Declare Function mciExecute Lib "winmm.dll " Alias "mciExecute " (ByVal lpstrCommand As String) As Long
Private Declare Function mciSendString Lib "winmm.dll " Alias "mciSendStringA " (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
这两个函数都有一个叫lpstrCommand的参数, 这个参数就是我们今天要介绍的MCI Command String。其中函数mciSendString还有三个参数,lpstrReturnString是一个字符串,它用来接收mciSendString函数返回的信息(例如,我们在lpstrCommand中的命令是让函数返回打开的文件的设备类型,那么函数就把设备类型的信息保存在lpstrReturnString参数中。);uReturnLength参数用来指定参数lpstrReturnString的长度;hwndCallback是接收“wait”、“notify”消息的窗口句柄,在Visual Basic中调用时该参数设为0即可。
如果命令执行出错,函数mciExecute会直接弹出一个对话框,提示出错的原因。而mciSendString函数会返回一个ErrorCode (错误代码),该代码的具体含义您可以参考MSDN中的目录“Platform SDK\Graphics and Multimedia Services\Windows Multimedia\Multimedia Reference\Multimedia Constants\MCIERR Return Values”。您可以根据具体情况选择到底使用哪一个函数来执行MCI命令。例如,在调试的时候使用mciExecute,以便快速地获得错误原因,而在将要发布的程序中使用mciSendString函数,让程序中已设置的错误陷阱去处理错误,以避免频繁的错误提示而使用户觉得厌烦。(对于有返回值的MCI命令,必须使用mciSendString函数。)
在熟悉了这两个函数后,我们就可以进入正题――MCI Command String了。
MCI Command String的命令格式是这样的:lpszCommand lpszDevice lpszCommandFlag lpazFlag
lpszCommand是mci命令,例如open,play,stop,close等等。
lpszDevice是设备名(或文件名)。例如,我们用以下的程序打开了我的文档中的Music01.dat文件,并用“alias”参数将其别名设为OpenFile:
dim lReturn as long (1)
lReturn=mciExecute(“open C:\Mydocu~1\Music01.dat alias OpenFile type MPEGVideo”) (2)
那么,在以后的MCI Command String中lpszDevice参数必须指定为OpenFile。例如,关闭该文件的代码如下:
lReturn=mciExecute(“close OpenFile”) (3)
如果我们没有为打开的文件设定别名,则以后调用的MCI Command String中lpszDevice参数为DOS路径名加文件名。例子如下:
dim lReturn as long (4)
lReturn=mciExecute(“open C:\Mydocu~1\Music01.dat type MPEGVideo”) (5)
lReturn=mciExecute(“close C:\Mydocu~1\Music01.dat type MPEGVideo”) (6)
从这里可以看出,设定别名的好处是减少了代码的输入。
LpszCommandFlag是mci命令的参数。如上代码(2),“alias OpenFile”以及“type MPEGVideo”就是命令“open”的参数。通常一个mci命令的参数少则几个多则几十个。
LpazFlag可以为指定为“wait”或“notity”。如果为“wait”,那么mci命令执行完毕后会向父窗体发送MCI_WAIT消息,“notity”则发送MCI_NOTIFY消息。此参数在Visual Basic中无甚用处。
在此先声明一下,微软提供的winmm.dll函数库支持的多媒体设备的类型共有cdaudio,dat,digitalvideo,other,overlay,scanner,sequencer,vcr,videodisc,waveaudio十种(注意:winmm.dll函数库不支持RealPlay格式的文件。您可以用以下代码获得已打开的文件的类型:lReturn=mciSendString(“capability lpszDevice device type”,sReturn,32,0) )。至于哪一类设备支持哪些参数,您可以在MSDN中查找关键字“MCI Command Strings”,选中所列出的命令,在其中的HTML帮助文档中通常会有一个表格告诉你哪些设备支持哪些参数或者在第一段中有信息告诉您哪些设备支持该命令。
好了,现在让我们对又繁索,又该死,又强大的mci命令参数作一个系统的介绍。(限于篇幅,本文仅介绍大部份主要命令的参数。)
open:
该命令用来打开一个多媒体文件。所有的设备都支持这个命令。在任何mci命令执行前,都必须先使用该命令打开多媒体文件,以初始化设备。
该命令的几个参数意义如下:alias device_alias――指定欲打开文件的别名;shareable――是否以共享方式打开,如果不指定该参数,则以不共享的方式打开,也就是说,打开某一个多媒体文件后,其它程序不能再打开它,如果指定该参数,则以共享方式打开;type device_type――指定该文件在Windows中注册的多媒体文件名(注:Windows中注册的多媒体文件名与设备类型名并不相同,设备类型只有以上所说的十种类型。RealPlay格式的音视频流是第三方公司开发的媒体类型,不属于Microsoft Windows支持的设备。而Windows中注册的多媒体文件名请查看C:\Windows\win.ini文件的[mci extensions]小节。),如MPEGVideo,AVIVideo,waveaudio等,MPEGVideo、AVIVideo类型的文件其实都属于设备digitalvideo。
对于open命令,有几个须注意的方面。首先,用open命令打开一个文件时,文件的路径必须是DOS格式的短路径。您可以用API函数GetShortPathName返回某路径的该格式。对于参数type device_type,复合型设备的文件(如:MPEGVideo)mci设备会自动根据其在Windows中注册的扩展名 (要想获得某扩展名的文件在Windows中注册的类型名,请查看C:\Windows\win.ini文件的[mci extensions]小节。)设置该参数(所以对于C:\Windows\win.ini文件的[mci extensions]小节中已列的扩展名,不必指定该参数),但如果设备无法根据其扩展名获得文件的类型的话,就必须指定该参数,如果不指定则会提示:“这不是已注册的mci设备“,而简单型设备(如CD音轨设备,可编程控制的录放像机,可编程控制的镭射影碟机)则不必指定该参数。
如果该命令被成功执行,那么返回值为0。至此,您就可以用alias指定的别名执行各种各样的mci命令了。
(注意:以下命令所能实现的功能虽然很令人激动,但是通常您打开的文件支持的命令没有几个。)
(限于篇幅,每个命令具体的参数与MCI设备的支持情况请参照MSDN。在此恕不列出。)
(参数中的黑体字表示这是一个MCI命令,斜体字表示该单词所表示的是MCI参数的变量,必须由开发者指定。)
Break:指定一个键来退出使用wait参数的当前mci命令。这是一个MCI系统命令,所有MCI设备都支持这个命令。
on virtual_ key_ code: 指定一个键用来退出含有wait参数的命令
off: 使当前break键无效
Capability:获得已打开的设备的功能,比如能否播放,能否退出,能否记录等等。所有MCI设备都支持这个命令。
can detect length:如果设备能侦测长度则返回TRUE
can eject:如果设备能弹出则返回TRUE
can freeze:如果设备支持冻结数据则返回TRUE
can lock:如果设备支持锁定数据则返回TRUE
can monitor sources:如果设备能将一个输入源输出到指定的输出源则返回TRUE,与当前的输入源无关
can play:如果设备能播放则返回TRUE
can preroll:如果设备在cue命令中支持preroll参数则返回TRUE
can preview:如果设备能向前快放则返回TRUE
can record:如果设备支持记录则返回TRUE
can reverse:如果设备能后退则返回TRUE
can save:如果设备能保存数据则返回TRUE
can stretch:如果设备能缩放输出的图像则返回TRUE
can stretch input:如果设备能在数据流解压到帧缓冲的同时能缩放输出的图像则返回TRUE
can test:如果设备能识别“test“关键字则返回TRUE
cav:当与其它项组合使用时,该参数返回申请CAV格式时,videodiscs设备的返回信息,如果没有插入任何videodiscs该参数为默认值
clock increment rate:返回外部时钟将每秒钟分为几个单位,如millisecond返回1000,0表示没有支持的外部时钟
clv:当与其它项组合使用时,该参数返回申请CLV格式时,videodiscs设备的返回信息
compound device:设备支持文件名时返回TRUE
device type:返回设备类型名,其值可以如下:
cdaudio
dat
digitalvideo
other
overlay
scanner
sequencer
vcr
videodisc
waveaudio
fast play rate:返回每秒快放的帧数,如果为0则不支持快放
has audio:如果设备支持音频则返回TRUE
has clock:如果设备支持时钟则返回TRUE
has still:如果设备将文件视为一静态图像比动态视频文件更快则返回TRUE
has timecode:如果设备支持timecode则返回TRUE
has video:如果设备支持视频则返回TRUE
inputs:返回输入设备的总数
maximum play rate:返回最快的播放速度,单位为帧每秒
minimum play rate:返回最慢的播放速度,单位为帧每秒
normal play rate:返回
#include
Winmm.lib
在工程-》项目设置-》有个linker (连接)-》input-》然后有个Additional dependences