说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

VB用MCI指令进行多媒体编程

HTML文档下载 WORD文档下载 PDF文档下载
VB用MCI指令进行多媒体编程



   我们有时会希望为自己的程序增加音效,例如警告声等,这就需要播放WAV文件。较简单的做法,我们可以使用多媒体控件(VB和Delphi都提供了MCI控件)来完成,但这样做无疑会增加系统负担和使程序体积增大(使用OCX的话尤其明显)。如果我们的程序并非一个多媒体程序而仅仅是用来播放音效的话,就更不划算了。有没有更理想的方法呢?答案是肯定的,Windows已经为我们提供了一个关于多媒体处理的动态连接库WINMM.DLL(旧版本为MMSYSTEM.DLL),通过调用它所提供的API函数,我们就可以使用MCI指令进行多媒体方面的操作了。
  让我们先来了解一下什么是MCI指令,MCI的全称是Media Control Interface(媒体控制接口)。实际上MCI是一个高级的函数调用接口,我们可以把它看作是一个解释器,通过它,我们就可以直接和外部音频或视频设备打交道了。
  接下来,就需要了解一下需要用到的API和MCI指令。有三个与MCI有关的API,它们是:mciSendString(),mciExecute()和mciGetErrorString()。mciSendString函数的功能是传送指令字符串给MCI,mciExecute的功能和mciSendString一样,不同的是当发生错误时mciExecute会弹出对话框显示错误信息。mciGetErrorString的功能是将MCI错误代码转换为字符串。现在假设我们的编程环境是VB或Delphi,下面就在这两种环境的情况中介绍其使用方法。
  在VB中,调用API函数必须先进行声明,它们的格式分别为:
  Declare Function mciExecute Lib “winmm.dll" Alias “mciExecute" (ByVal lpstrCommand As String) As Long
  Declare Function mciSendString Lib “winmm.dll“Alias“mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwnd Callback As Long) As Long
  Declare Function mciGet Error String Lib “winmm.dll" Alias “mciGetError String A" (ByVal dwError As Long, ByVal lpstrBuffer As String, ByVal uLength As Long) As Long
  在Delphi中相对较简单,由于Delphi已经将多媒体相关的API声明预编译在MMSYSTEM.DCU文件中,所以我们只需要在单元的Uses语句后加上 mmsystem即可在本单元中使用上述三个API函数了。
  接着再介绍一些常用的MCI指令。
   MCI指令一般格式为:MCI指令 设备名 [参数]
  打开多媒体设备:open,如:open CDAudio、open c:\windows\chimes.wav type waveaudio。
  播放多媒体设备:play,如:play CDAudio from 5000 to 20000(播放CD的第5秒到第20秒)、play c:\windows\chimes.wav。
  关闭多媒体设备:close,如:close all(关闭所有多媒体设备)。
  得到设备状态信息:status,如:status cdaudio number of track(得到CD的曲目总数)
  有了这些预备知识,就可以将MCI和API结合起来进行多媒体编程了。
  例如,要在程序中使用音效(播放WAV文件),要求如果WAV文件不存在的话要求忽略错误(即不弹出出错信息),则程序如下(以VB为例,Delphi中类似):
  Dim Result as Integer
  Dim ReturnStr As String * 1024 '注意,必须指定String的长度
  Result=mciSendString(“play c:\windows\chimes.wav",ReturnStr,1024,0) '其中ReturnStr为某些MCI指令执行后传送给程序的文字信息
  以上这段程序可以播放指定的WAV文件,如果成功执行,则Result的值为0,如果文件不存在或出现其他错误,错误代码会传送给Result,但程序不会中断。若要根据错误代码自行处理错误信息,可以使用mciGetErrorString函数处理:
  Dim ErrStr As String * 1024
  if Result=0 then
  msgbox “播放成功"
  Else
  i%=GetErrorString(ReturnStr,ErrStr,1024)
  msgbox ErrStr
  End If
  下面,我们举一个完整的程序作为例子(还是以VB为例),我们可以用API写一个CD播放器来代替使用多媒体控件。这样做的好处很明显,当你把程序编译成为EXE文件后复制给朋友的时候,你再也不必附加其他OCX文件(如果是Delphi的话,EXE文件体积也可以减小)。
  在VB中新建一个工程,在Form1中添加6个按钮和一个Timer控件,属性如下(效果如图):
  名称:Command1,Caption:弹出
  名称:Command2,Caption:播放
  名称:Command3,Caption:暂停
  名称:Command4,Caption:下一首
  名称:Command5,Caption:上一首
  名称:Command6,Caption:退出
  名称:Timer1,Interval:1000
  接着,我们就可以编写代码了,如下:
  '函数声明
  Private Declare Function mciExecute Lib “winmm.dll" (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
  Dim Cur As Integer '保存当前正在播放的曲目号
  Dim Total As Integer '保存CD曲目总数
  '弹出CD-ROM
  Private Sub Command1_Click()
  i% = mciExecute(“set cdaudio door open")
  End Sub
  '播放
  Private Sub Command2_Click()
  i% = mciExecute("play cdaudio")
  End Sub
  '暂停
  Private Sub Command3_Click()
  i% = mciExecute(“pause cdaudio")
  End Sub
  '播放下一首
  Private Sub Command4_Click()
  Dim ReturnStr As String * 128
  i% = mciExecute(“set cdaudio time format tmsf") '设置from后的时间格式
  If Cur < Total Then i% = mciExecute(“play cdaudio from" + Str(Cur + 1))
  End Sub
  '播放上一首
  Private Sub Command5_Click()
  Dim ReturnStr As String * 128
  i% = mciExecute(“set cdaudio time format tmsf")
  If Cur > 1 Then i% = mciExecute(“play cdaudio from" + Str(Cur - 1))
  End Sub
  '中止CD的播放并退出
  Private Sub Command6_Click()
  i% = mciExecute(“stop cdaudio")
  i% = mciExecute(“close cdaudio")
  End
   End Sub
  '程序启动时打开CDAudio设备并得到曲目总数
  Private Sub Form_Load()
  Dim ReturnStr As String * 128
  i% = mciSendString(“open cdaudio", ReturnStr, 128, 0)
  i% = mciSendString(“status cdaudio number of tracks", ReturnStr, 128, 0)
   Total = Val(ReturnStr)
  End Sub
  '退出时中止CD的播放
  Private Sub Form_Unload(Cancel As Integer)
  i% = mciExecute(“stop cdaudio")
  i% = mciExecute(“close cdaudio")
  End Sub
  '每隔一秒监测当前播放的曲目号
  Private Sub Timer1_Timer()
  On Error Resume Next
  Dim ReturnStr As String * 128
  i% = mciSendString(“status cdaudio current track", ReturnStr, 128, 0)
  Cur = Val(ReturnStr)
  End Sub
  好了,现在这个CD播放器已经可以工作了,如果你再为它扩充一些有趣的功能的话,就是一个完整的小软件了。(上海 申 )


VB对低层硬件访问控制 HitTest的妙用 -VB资料 ListBox项的控制-VB资料 VB 6.0中类聚集关系的实现 VB6编程中如何获取硬盘分区信息 VB的坐标系统综述 VB调用C程序动态链接库的方法 VB对低层硬件的访问控制 VB软件开发中的错误捕获及处理技术 VB中Combo的一种输入检查制约方法的实现 VB中Winsock控制的UDP协议的使用 VB中的时间处理问题 Windows操作平台下CGI的实现 -VB资料 按下某组键(HotKey)便执行某程式-VB资料 把所有的字体名称放到 ComboBox -VB资料 把文件置入到Text或RichText中-VB资料 捕捉 MouseExit 事件 -VB资料 操作过程动态显示 -VB资料 查找月份的最后一天-VB资料 程序启动时,如何自动判断 MDB文件是否损坏并自动修复?-VB资料 读取和修改Windows注册表 -VB资料 对VB的IDE环境的扩展 防止文本控件中的部分滚动-VB资料 关闭正在运行的程序 -VB资料 关机消息的拦截 -VB资料 VB获得、设置鼠标双击间隔时间 VB获取当前系统平台 记载Windows使用的时间-VB资料 加速Visual Basic For Application(VBA) 监视程序的运行情况 -VB资料 交换鼠标按钮 -VB资料 各位:在哪能下DVDdivx格式,当然要免费的,谢谢 Image报错,急切 老外常用到的一个词 : Project ,在中文里我们该如何理解这个词? ■■■■■■■■马甲的最后20分!■■■■■■■■ 非常急地问一下:installshield的问题!100分!不够加!!! 重庆考区,全国计算机3级什么时候可以拿证书呢???? 一个jsp页面里面是不是不能同时有两个scope分别为application和session的Bean??? 给个简单的例子好吗?treeView----------asp.net------VB 我的facade session bean中老是lookup 其他的EJBs 不成功? 这两句什么意思啊? 结识ASP高手,将来会有项目介绍!:) exchange server 2000 能装在xp上吗? 怎样使自己的程序被安装的时候安装上自己制作的字体?? 求助:帮小妹找份工作 有高手在吗?帮帮忙! 一个在ASP中很简单的问题 很想很想很想散分 预报天气如“叫床” 湖南性感女主持惹争议 Websnap中TEnduserSessionAdapter组件的TadapterField问题~~~~~~~~~~~~~~~~~~~~~~~~~~ 急!!帮我看段代码! 为何对话框程序加入RichEdit控件后不能运行? 想知道word.application的朋友请进: InstallShield Express Custom Editon for Delphi那里有下载? 请问vb.net和vc#能不能创建数组控件??? 请问vb.net和vc#能不能创建数组控件 请问一下,vc 写的 dll,使用postmessage给出一个消息到窗口,在 vb 中应该怎么样响应? 我想开发一个数据中间层但不知哪用.net ATL MFC 开发好,能给个建议吗? 寻求cs CD-key 文件名(很有些困惑!) 高手近来拿分,请教一个算法问题,共开三帖,每帖一百分。 在windows2000+delphi6+ado+access2000做的程序可以在windows98中用吗? 我想学门语言,现在哪种最有前途啊 一个免费的电影网站,不需要手机不需要花钱就能看电影 数据库存储一些记录后不能写入,数据库文件异样(BDE) 急问:这样的文件怎样导入数据库? 一个免费的电影网站,不需要手机不需要花钱就能看电影 IIS下配置php-4.3.2-Win总是不行??? 很多书上都有说jsp:useBean的scope属性的application,是指任何使用相同的application,这个相同是什么意思? 关于统计的问题 马甲识别诸法之我论(转贴) 弱弱地问一个问题。 如何用键盘弹钢琴? ASL是什么? how to 高考 装了win2003之后调试asp.net还要不要再装其它软件? 学c++出路 我把数据库的连接池作到Bean中,麻烦就此产生,请高手帮我解决??? 成熟OA系统,B/S模式,三十几个模块,四十几个功能,超底价出售原代码,包你满意,有意者留个油箱,我把部分文档给你发过去,如果你离南 怎样装微软官方论坛? 成熟OA系统,B/S模式,三十几个模块,四十几个功能,超底价出售原代码,包你满意,有意者留个油箱,我把部分文档给你发过去,如果你离南 如何简单记的English我总是记不住 请判断下这句英语是否正确I like the owner of the house (that is nice)括号内的是定语从句吧?它修饰的是the owner 还是 the house或许说我的句子有歧义 . 形容恐龙充满神秘感的成语 在三角形ABC中,abc成等差数列,求证2(cos(A+C)/2)=cos((A-C)/2)RT 我给词语找朋友( )的树苗 ( )的柏树 ( )的杨树( )的小手 ( )的水花 ( )的眼睛闪闪的( ) 静悄悄的( ) 英文最牛的骂人怎么骂? 三角形abc中,角abc成等差数列且a-c=60度,求cos的平方a+cos的平方b+cos的平方c的 值 填动物名:意欲捕鸣( ) 感恩的心手语舞完后要加什么 east.是什么牌 衣欲捕鸣( ),填动物名这是古诗中的诗句 感恩的心手语舞谁有给我? 《闻王昌龄左迁龙标遥有此寄》中渲染凄凉气氛的诗句是? 全等三角形AB=CD,AE=DF,CE=BF,求AE//DF 请各位老师描述一下下,当 a>1 时,函数 y=a的负x次图像是怎样的? 求数学集合的答案如题:集合A={x1,x2,x3,x4,x5},计算A中的二元子集两元素之和组成的集合B={3,4,5,6,7,8,9,10,11,13},求集合A. 如图 AB//CD,AB=CD,AE=DF,则图中全等三角形共有( )对、 It is a glass.(复数句)可以写在纸上发过来也可以,直接发过来. 锻炼的近义词是什么 如图,点A,B,C,D在一条直线上,三角形ACE全等三角形BDF⑴AE//BF⑵AB=CD 闻王昌龄左迁龙标遥有此寄的写作目的 填空题(按以下要求完成)log以2为底的0.7,log以3为底的10,log以0.2为底的1,log以0.4为底的0.4,用小于号连接 英语单词中还有英语句子中什么时候单词里有些字母要大写什么时候要小写?尽量写具体些, 1.已知a、b均为正实数,a+b=1,求证 ax^2+by^2>=(ax+by)^22.已知三角形ABC三边a,b,c,且m为正实数,求证:a b c-------- + ------- > -------a+m b+m c+m上面a,b,c分别对应分母 认知英文怎么翻 磨砺的近义词 eve高安pos制造t2 物品怎么样 比空间站快? 《钱塘江春行》中的名句能不能确定,一定,肯定,以及坚定的告诉我是那一句 具有两对相对性状的两株植物杂交,产生的子代植物基因型为AaBb,则下列有关叙述错误的是 A.如果子代植物自交,后代有两种表现型,说明该植物A和a、B和b这两对等位基 因的遗传不遵循 如果a=4cm,b=9cm,则线段a,b的比例中项是什么? 家里长蘑菇代表什么 请问某种植物的基因型为AABb是什么意思? 已知线段a=4cm,c=9cm,求线段a和c得比例中项b 四、完成下面的填空题 闻王昌龄左迁龙标遥有此寄后两句运用的修辞和表达的感情闻王昌龄左迁龙标遥有此寄的后两句运用了——的修辞手法,表现了作者——的思想感情.填空题,修辞究竟是拟人还是夸张? 已知线段a=4cm,b=9cm.则a,b的比例中项c=多少, 家里长蘑菇什么寓意 闻王昌龄左迁龙标遥有此寄中的前两句抒发了作者什么样的感情 已知线段a=4cm,b=9cm,求a,b的比例中项. 家里木桩上长了好多这种蘑菇 这是什么蘑菇 叫什么? 关于默默无闻的诗句就是我们开运动会,默默拣垃圾的人,赞美他们的诗句 想做却不敢做的事作文 “思路”这个词的英文如题 用力是动词还是形容词 (a+b)的函数图像是1/4圆吗 请完成下列填空题,一定要保证正确:一排电线杆,原来每2根之间的距离是30米,现在要改为45米,如果第1根不动,至少再隔( )米又有1根电线杆不用移动. 多变算形容词吗. 写同学作文 同桌做什么事都很慢 可以取什么题目 555 EAST怎么样 求判断一个英语句子是否正确it is the journey of life that makes us from a kid who takes it for granted that we depend on our parents into an independent adult. 我做什么事都比人家慢好多,怎么改?领导批评我了,我要改. EAST是什么产品 判断英语句子是否正确There is a place where we live.这个句字对么?如果不对错在那里〉? 已知y=ax平方+bx+c当x=1时y有最大值为5 且它的图像经过(2,3)求这个函数的关系式(要过程) EAST MANOR怎么样 判断这个英语句子是否正确I think it isn't difficult to do well in this subject.But study math in a good way is very important错误了请帮忙改正 前面一个绣花针,后面一个恐龙,猜一成语 怎么记英语比较简单我英语老是记不住,怎么办 英语,判断句子是否正确.我想用非谓语说:被人类抓住,他失去了自由. Caught by human beings,he lost freedom.对?还是Been caught by human beings,……………对?为什么 关于白鹅小草杏花恐龙沙漠桂花圆明园桂林成语 国际奥委会主席称赞索契为冬奥会准备工美国一男子被误判坐牢20余年后被释放法媒称索马里“青年党”一头目被美国无新加坡突查检查起重机安全 90家公司美气象学家发现预知高热天气方法 可提英国夫妇靠生孩子领社会福利 已生9名安倍访问土耳其 称日援建地铁象征日土美一父亲因将1岁幼儿独自留在家中遭到调查称法国火葬增加致扫墓鲜花减少影响分析称纽约需50亿美元修复因飓风毁坏莫斯科警方检查移民聚集区 约千人被送俄媒:叙已提供可用于生产化武1300泰国代孕黑市剥削孕母 酬劳低至5.8德国农场主检查马厩时发现自家马匹驮回俄圣彼得堡将遭强飓风袭击 涅瓦河水位阿富汗一男子被疑制造炸弹袭击事件 遭日本两男子涉嫌介绍未成年少女夜总会打日本一办公室里种大麻盈利逾千万日元 朱国林:转基因是“欺骗的种子,失窃的王湘穗:建议国家成立“转基因安全国家顾秀林:坚决不同意标注出售转基因食品散户必看:如何控制仓位 才能让收益最万万没想到,原来你是这样的布里斯班!来自美国的呼唤:11年前对中国经济的明日股市预测4月26日股市行情大盘走599元的魅蓝3发布:3GB内存的塑中国向日本递交巨额地震赈灾捐款:日方中美若爆发核战争, 世界将由谁来主宰黑产揭秘:利用伪基站钓鱼一共分几步?全国九大最难喝的饮料,看看就好,想不互金整治取缔第三方支付直连银行 “支要盈利 看这里!原油沥青价格走势分析奥飞娱乐主力暗中吸筹,近期有望超级反如何在旅途中优雅的发朋友圈?台中市旗被公认全台湾地区最丑 市长叹河南一女子美容致残 法院调解获赔23我国拟修法对重点保护野生动物食品说“花东黄牛火车票 台铁:已成立项目调查杭州海关运用大数据查获互联网跨境渠道习近平:要真情关心和爱护政法干警我国拟修法对一些重点保护野生动物人工北京大货车与公交相撞画面曝光:直插车
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘