ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1823|回复: 5

[分享] mciSendString()用法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-10-8 07:38 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
mciSendString()用法
原文地址:http://blog.sina.com.cn/s/blog_49f037d60100pi2f.html
mp3播放器,用realplay和WMP做出来的程序内存占用太大。
如果你仅仅是播放MP3,建议使用API函数mciSendString
Option Explicit
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
mciSendString是用来播放多媒体文件的API指令,可以播放MPEG,AVI,WAV,MP3,等等
使用方法:
  该函数有四个参数:
第一个参数:要发送的命令字符串。字符串结构是:[命令][设备别名][命令参数].
第二个参数:返回信息的缓冲区,为一指定了大小的字符串变量.
第三个参数:缓冲区的大小,就是字符变量的长度.
第四个参数:回调方式,一般设为零
返回值:函数执行成功返回零,否则返回错误代码

一、常用命令
        1.打开(Open)
格式:Open 设备名 [type 设备型式][alias 别名]
Dim mName as string
mName = "f:\mpeg\mpeg1.avi"
mciSendString "open mName type MPEGVideo Alias movie parent %u Style %u notify",0&, 0, 0
 其中:
open              操作命令
mName             全路径文件名
type MPEGVideo 是指打开MPEG,AVI等类型,如果不加这一句,就是打开WAV,MP3等
Alias movie       定义了该操作的别名为movie,后续操作只要指明别名即可
parent %u         源
Style %u          样式
notify            通知
   
  

打开多媒体文件步骤:
  首先在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。

        2.播放(Play)
格式:Play 设备名 [from 起点][to 终点]
mciSendString "play movie", 0&, 0, 0
mciSendString "play movie fullscreen", 0&, 0, 0 '全屏播放
  3.暂停(Pause):
mciSendString "pause movie", 0&, 0, 0
  4.继续(Resume):
mciSendString "resume movie", 0&, 0, 0
注意:暂停后发出Play命令也可以继续
  5.停止(Stop):
mciSendString "stop movie", 0&, 0, 0
  6.关闭(Colse):
mciSendString "close movie", 0&, 0, 0
  7.前进到下一个位置:
mciSendString "step movie", 0&, 0, 0
  8.后退到上一个位置:
mciSendString "step movie reverse", 0&, 0, 0
  9.前进或后退 N 個位置(其中 N<0 即表示后退)
mciSendString "step movie by " & str(N), 0&, 0, 0
  10.获取当前播放位置:
Dim ST As String*64
mciSendString "status movie position", st, len(st), 0
  11. 获取媒体的总长度:
mciSendString "status movie length", st, len(st), 0
l=val(st) 'l就是所播放文件的长度
  12.获取播放当前状态:
Dim ST As String*64
mciSendString "status movie mode", ST, Len(ST), 0
If Left(ST, 7) = "stopped" Then (处理代码) '播放完毕
  13.循环播放:
mciSendString "play movie repeat", 0&, 0, 0
    14.进度条相关
主要还是mciSendString得合理运用
wsprintf(cmd,TEXT("play %s from %d"),szShortPath,iSchedule*1000);
mciSendString(cmd,NULL,0,0);
这个是实现快进的,其中szShortPath是歌曲的短路径,iSchedule是在进度条上的位置,单位是秒,当你鼠标点击进度条,可以得到进度条当前位置,然后用上面的函数从当前位置继续播放就可以了

正常播放的话,你每一秒获取当前位置,然后将位置的数值加上1,并将加1后位置显示在进度条上,再从加1后的位置继续播放就可以了
iSchedule=SendMessage(GetDlgItem(hwnd,IDC_SLIDERSCHEDULE),TBM_GETPOS,0,0);
iSchedule=iSchedule+1;
SendDlgItemMessage(hwnd,IDC_SLIDERSCHEDULE,TBM_SETPOS,TRUE,(LPARAM)iSchedule);

然后可以每一秒判断进度条和歌曲长度是否相等,来判断歌曲是否正常播放结束(我是每播放一首歌,就将他的长度作为进度条上限值的)
跟快进一个道理,相当于你每次快进都是一秒


二、声音
(1)控制声音大小(1-1000):
Dim V As Long
mciSendString "status movie volume",&V, len(v), 0 'V是获取的音量大小值。
V = 50
mciSendString "setaudio movie volume to 数值", 0, 0, 0 'V是设置的音量值

(2)、设置是否静音

mciSendString(setaudio FileName off,(LPTSTR)NULL,0,NULL);

mciSendString(setaudio FileName on,(LPTSTR)NULL,0,NULL);


设置播放位置.(需事先设定时间格式)
格式:Seek 设备名 [to 位置 | to start | to end]

Dim P1 as Long, P2 as Long
P1 = 100: P2 = 3000
mciSendString "seek movie to ", P1, 0, 0 'P1是当前起始位置,单位:毫秒
mciSendString "seek movie to start", 0&, 0, 0 '定位到开头位置
mciSendString "play movie", 0&, 0, 0 '定位后再播放
或者:
mciSendString "play movie FROM P1 to P2",0&, 0, 0 'P1是起始位置,P2是停止位置。单位:毫秒
mciSendString "seek movie to end", 0&, 0, 0 '定位到最后位置

四、在指定控件上播放视频:
mciSendString "open AVI 文件名 parent hWnd style child", 0&, 0, 0
其中,hWnd 是控件的句柄
执行上述命令之后,影片会被放置在控件的左上角,且影片的大小不受控件大小的影响,如果想要改变
影片播放的位置及大小,可以在執行 play   指令前先执行 put 指令,格式如下:
  mcisendString "put AVI 文件名 window at X Y [Width Height]", 0&, 0, 0
其中:X、Y为影片左上角坐标,Width、Height为影片的宽高度

五、如果播放视频还可控制亮度(1-2000)
Dim B As Long
mciSendString "status movie brightness", B, 0, 0 'B是获取的亮度值。
B = 50
mciSendString "setvideo movie brightness to " & B, &0, 0, 0 'B是设置的亮度值

六、录音设置:
  录音前,用以下语句初始化
  1.设为8位:
mciSendString "set wave bitpersample 8", "", 0, 0
  2.设为11025Hz
mciSendString "set wave samplespersec 11025", "", 0, 0
  3.设为立体声:
mciSendString "set wave channels 2", "", 0, 0
  4.实现PCM格式(不一定正确):
MCISENDSTRING "set wave format tag pcm","", 0, 0
  5.开始录音:
mciSendString "close movie",0&,0,0
mciSendString "open new type WAVEAudio alias movie",0&,0,0
mciSendString "record movie",0&,0,0
  6.保存录音到c:123.wav
mciSendString "stop movie",0&,0,0
mciSendString "save movie C:\123.wav",0&,0,0
mciSendString "close movie",0&,0,0

七、开关光驱:
mciSendString "set cdaudio door open", "", 0, 0 '打开
mciSendString "set cdaudio door close", "", 0, 0 '关闭

八、其它
  1.设置设备的各种状态(Set)
Set alias_name[audio all off][audio all on][time format ms]:
  Set命令用来设置设备的各种状态.如:静音,有声音,时间格式为毫秒等.
  2.取得设备的状态(Status)
Status alias_name[length][mode][position]:
  Status命令用来取得设备的状态.如:该媒体文件的长度,该媒体文件所处状态,该媒体文件的当前位置等. 的长度,该媒体文件所处状态,该
媒体文件的当前位置等.
参考代码:
TCHAR fileName[]="D:\俺的文档\my music\爷爷泡的茶.mp3";
TCHAR shortName[MAX_PATH];
GetShortPathName(fileName,shortName,sizeof(shortName)/sizeof(TCHAR));
TCHAR cmd[MAX_PATH+10];
wsprintf(cmd,"play %s",shortName);
mciSendString(cmd,"",NULL,NULL);
(调用mciSendString第一个参数传“play 文件全路径”就可以,“文件全路径”最好传绝对路径,不建议wanghepeng10那样值传递文件名。
另外如果文件全路径中含有空格的话要使用GetShortPathName转换成短路径。)

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-8 07:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
mciSendString播放mp3文件名中有空格的处理方法
━━━━━━━━━━━━━━━━━━━━━━━━━

    调用mciSendString第一个参数传“play 文件全路径”就可以,“文件全路径”最好传绝对路径,不建议wanghepeng10那样值传递文件名。

    另外如果文件全路径中含有空格的话要使用GetShortPathName转换成短路径。


━━━━━━━━━━━━━━━━━━━━━━━━━
用GetShortPathName返回长路径和文件名的短路径名

下面的函数获取“长文件名”,返回“短文件名”,并在消息框中 显示两种名称。

Private Declare Function GetShortPathName Lib "KERNEL32.DLL" Alias "GetShortPathNameA" _ (ByVal lpctstrLongName As String, _ ByVal lptstrShortName As String, _ ByVal bufLen As Long) As Long

示例 代码
'转到 Get_Short_Name

Sub Get_Short_Name()
    Dim LongStr As String, ShortStr As String
    Dim lStrLen As Long, lRet As Long
    '变量“LongStr”为指向某一文件的任意长度文件名或变量
    LongStr = ThisWorkbook.FullName
    lRet = GetShortPathName(LongStr, ShortStr, lStrLen)
    '可以创建一个与返回的字符串长度相同的缓冲区,这样将不必再截去缓冲区左侧即可获取字符串
    ShortStr = String(lRet, " ")
    lRet = GetShortPathName(LongStr, ShortStr, lRet)
    MsgBox LongStr & " 被转换为 " & ShortStr
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-8 07:45 | 显示全部楼层
多媒体播放模块源码
程序集名        保留        保留        备注
_接口程序集                          在本程序集中定义的子程序可被模块外部程序访问,注意如果不存在本程序集就不能作为易模块编译。
变量名        类型        数组        备注
lRet        整数型                
设备名        文本型                
第几曲        整数型                
子程序名        返回值类型        公开        备注
设备名称                         欲设置设备名称
参数名        类型        参考        可空        数组        备注
设备名称        文本型                                   播放设备,如:CD
设备名 = 设备名称
子程序名        返回值类型        公开        备注
光驱开关        整数型                
参数名        类型        参考        可空        数组        备注
开关        逻辑型                                   打开光驱为真,关闭光驱为假
如果 (开关 = 真)
    lRet = mciSendString (“set CDAudio door open”, “”, 0, 0)
否则
    lRet = mciSendString (“set CDAudio door closed”, “”, 0, 0)
如果结束
返回 (lRet)
子程序名        返回值类型        公开        备注
初始化设备        整数型                 设置设备为使用状态,并设置时间格式
参数名        类型        参考        可空        数组        备注
时间格式        文本型                                   时间格式,请设为“毫秒”
如果真 (设备名 = “CD” 或 设备名 = “cd”)
    lRet = mciSendString (“open cdaudio alias cd wait”, “”, 0, 0)
如果真结束
如果真 (设备名 = “MP3” 或 设备名 = “mp3”)
    lRet = mciSendString (“open mp3file Alias sonido”, “”, 0, 0)
如果真结束
如果真 (时间格式 = “毫秒”)
    lRet = mciSendString (“set cd time format tmsf wait”, “”, 0, 0)
如果真结束
返回 (lRet)
子程序名        返回值类型        公开        备注
显示时间        文本型                 返回当前时间位置
变量名        类型        静态        数组        备注
播放位置        文本型                        
秒        文本型                        
分        文本型                        
毫秒        文本型                        
g        整数型                        
播放位置 = 取空白文本 (129)
如果真 (设备名 = “CD” 或 设备名 = “cd”)
    mciSendString (“status cd position”, 播放位置, 128, 0)
如果真结束
如果真 (设备名 = “MP3” 或 设备名 = “mp3”)
    mciSendString (“status MM position”, 播放位置, 128, 0)
    g = 取整 (到数值 (播放位置) ÷ 10)
    秒 = 到文本 (取整 ((g % 6000) ÷ 100))
    分 = 到文本 (取整 (g ÷ 6000))
    毫秒 = 到文本 (g % 6000 % 100)
    如果真 (取文本长度 (毫秒) = 1)
        毫秒 = “0” + 毫秒
    如果真结束
    如果真 (取文本长度 (秒) = 1)
        秒 = “0” + 秒
    如果真结束
    如果真 (取文本长度 (分) = 1)
        分 = “0” + 分
    如果真结束
    播放位置 = 分 + “:” + 秒 + “:” + 毫秒
如果真结束
第几曲 = 到数值 (取文本左边 (播放位置, 2))
返回 (播放位置)
子程序名        返回值类型        公开        备注
播放        整数型                 播放设备命令
参数名        类型        参考        可空        数组        备注
文件名        文本型                               
lRet = mciSendString (“close all”, 0, 0, 0)  '  首先关闭所有的MCI设备,避免播放多个音乐文件时声音会重叠
如果真 (设备名 = “CD” 或 设备名 = “cd”)
    lRet = mciSendString (“play cd”, “”, 0, 0)  '  播放命令
如果真结束
如果真 (设备名 = “MP3” 或 设备名 = “mp3”)
    lRet = mciSendString (“Open ” + 文件名 + “ Alias MM”, “”, 0, 0)  '  播放命令
    lRet = mciSendString (“play MM”, “”, 0, 0)  '  播放命令
如果真结束
返回 (lRet)
子程序名        返回值类型        公开        备注
停止        整数型                 设备停止或暂停
参数名        类型        参考        可空        数组        备注
停止        逻辑型                                   停止为真,暂停为假
如果真 (设备名 = “CD” 或 设备名 = “cd”)
    lRet = mciSendString (“stop cd wait”, “”, 0, 0)  '  暂停命令
    如果真 (停止 = 真)
        lRet = mciSendString (“close cd”, “”, 0, 0)  '  停止命令
    如果真结束
如果真结束
如果真 (设备名 = “MP3” 或 设备名 = “mp3” 或 设备名 = “WAV” 或 设备名 = “wav”)
    如果 (停止 = 真)
        lRet = mciSendString (“Stop MM”, “”, 0, 0)  '  播放命令
        lRet = mciSendString (“close MM”, “”, 0, 0)  '  播放命令
    否则
        lRet = mciSendString (“Pause MM”, “”, 0, 0)  '  播放命令
    如果结束
如果真结束
返回 (lRet)
子程序名        返回值类型        公开        备注
快进快退                       
参数名        类型        参考        可空        数组        备注
毫秒1        整数型                                   一般取500,快进为500
定义位置        整数型                                   设置当前播放位置,一般与滑块条配合使用
变量名        类型        静态        数组        备注
秒        文本型                        
分        文本型                        
毫秒        文本型                        
播放位置        文本型                        
g        整数型                        
如果真 (设备名 = “CD” 或 设备名 = “cd”)
    播放位置 = 取空白文本 (129)
    mciSendString (“status cd position”, 播放位置, 128, 0)  '  获取已播放时间
    g = 到数值 (取文本右边 (播放位置, 2)) + 到数值 (取文本左边 (取文本右边 (播放位置, 5), 2)) × 100 + 到数值 (取文本左边 (取文本右边 (播放位置, 8), 2)) × 6000 + 毫秒1
    如果真 (定义位置 ≠ 0)
        g = 定义位置
    如果真结束
    秒 = 到文本 (取整 ((g % 6000) ÷ 100))
    分 = 到文本 (取整 (g ÷ 6000))
    毫秒 = 到文本 (g % 6000 % 100)
    如果真 (取文本长度 (毫秒) = 1)
        毫秒 = “0” + 毫秒
    如果真结束
    如果真 (取文本长度 (秒) = 1)
        秒 = “0” + 秒
    如果真结束
    如果真 (取文本长度 (分) = 1)
        分 = “0” + 分
    如果真结束
    lRet = mciSendString (“play cd from ” + 取文本左边 (播放位置, 2) + “:” + 分 + “:” + 秒 + “:” + 毫秒, “”, 0, 0)  '  置播放位置
如果真结束
如果真 (设备名 = “mp3” 或 设备名 = “MP3”)
    播放位置 = 取空白文本 (129)
    mciSendString (“status MM position”, 播放位置, 128, 0)  '  获取已播放时间
    g = 到数值 (播放位置) + 毫秒1 × 10
    如果真 (定义位置 ≠ 0)
        g = 定义位置 × 10
    如果真结束
    lRet = mciSendString (“play MM from ” + 到文本 (g), “”, 0, 0)  '  置播放位置
如果真结束
子程序名        返回值类型        公开        备注
跳过曲目                       
参数名        类型        参考        可空        数组        备注
跳过几曲        整数型                                   为1时,向前跳一曲;为-1时,向后跳一曲
播放        逻辑型                                   为真时,跳到下一曲目,并播放该曲,为假时,只跳到下一曲目,但不播放
如果真 (设备名 = “CD” 或 设备名 = “cd”)
    如果 (播放 = 假)
        lRet = mciSendString (“seek cd to ” + 到文本 (第几曲 + 跳过几曲), “”, 0, 0)  '  跳过曲目,但不播放
    否则
        lRet = mciSendString (“play cd from ” + 到文本 (第几曲 + 跳过几曲), “”, 0, 0)  '  跳过曲目,并播放
    如果结束
如果真结束
子程序名        返回值类型        公开        备注
CD状态        文本型                 返回当前CD处于播放状态或停止状态
变量名        类型        静态        数组        备注
播放位置        文本型                        
播放位置 = 取空白文本 (129)
如果真 (设备名 = “CD” 或 设备名 = “cd”)
    mciSendString (“status cd mode”, 播放位置, 128, 0)  '  CD状态
如果真结束
返回 (播放位置)
子程序名        返回值类型        公开        备注
有无CD        文本型                 判断光驱里是否有CD
变量名        类型        静态        数组        备注
播放位置        文本型                        
播放位置 = 取空白文本 (129)
如果真 (设备名 = “CD” 或 设备名 = “cd”)
    mciSendString (“status cd media present”, 播放位置, 128, 0)  '  有无CD
如果真结束
返回 (播放位置)
子程序名        返回值类型        公开        备注
总曲目        文本型                 返回CD的总曲目数
变量名        类型        静态        数组        备注
播放位置        文本型                        
播放位置 = 取空白文本 (129)
如果真 (设备名 = “CD” 或 设备名 = “cd”)
    mciSendString (“status cd number of tracks wait”, 播放位置, 128, 0)  '  检查轨道
如果真结束
返回 (播放位置)
子程序名        返回值类型        公开        备注
CD总长度        文本型                 返回CD的总时间长度
变量名        类型        静态        数组        备注
播放位置        文本型                        
秒        文本型                        
分        文本型                        
毫秒        文本型                        
g        整数型                        
播放位置 = 取空白文本 (129)
如果真 (设备名 = “CD” 或 设备名 = “cd”)
    mciSendString (“status cd length wait”, 播放位置, 128, 0)  '  CD长度
如果真结束
如果真 (设备名 = “MP3” 或 设备名 = “mp3”)
    mciSendString (“status MM length wait”, 播放位置, 128, 0)  '  CD长度
    g = 取整 (到数值 (播放位置) ÷ 10)
    秒 = 到文本 (取整 ((g % 6000) ÷ 100))
    分 = 到文本 (取整 (g ÷ 6000))
    毫秒 = 到文本 (g % 6000 % 100)
    如果真 (取文本长度 (毫秒) = 1)
        毫秒 = “0” + 毫秒
    如果真结束
    如果真 (取文本长度 (秒) = 1)
        秒 = “0” + 秒
    如果真结束
    如果真 (取文本长度 (分) = 1)
        分 = “0” + 分
    如果真结束
    播放位置 = 分 + “:” + 秒 + “:” + 毫秒
如果真结束
返回 (播放位置)
子程序名        返回值类型        公开        备注
当曲长度        文本型                 返回当前曲目的时间长度
变量名        类型        静态        数组        备注
播放位置        文本型                        
播放位置 = 取空白文本 (129)
如果真 (设备名 = “CD” 或 设备名 = “cd”)
    mciSendString (“status cd length track ” + 到文本 (第几曲), 播放位置, 128, 0)  '  CD单曲长度
如果真结束
如果真 (设备名 = “MP3” 或 设备名 = “mp3”)
如果真结束
返回 (播放位置)
子程序名        返回值类型        公开        备注
当前曲目        整数型                 返回当前播放的曲目
变量名        类型        静态        数组        备注
播放位置        文本型                        
播放位置 = 取空白文本 (129)
如果真 (设备名 = “CD” 或 设备名 = “cd”)
    mciSendString (“status cd position”, 播放位置, 128, 0)
    第几曲 = 到数值 (取文本左边 (播放位置, 2))
如果真结束
返回 (第几曲)
DLL命令名        返回值数据类型        公开        备注
mciSendString        整数型                
DLL库文件名
winmm.dll
在DLL库中对应命令名
mciSendStringA
参数名        类型        传址        数组        备注
lpstrCommand        文本型                         
lpstrReturnString        文本型                         
uRetutnlength        整数型                         
hwndCallback        整数型                         
分享:

TA的精华主题

TA的得分主题

发表于 2020-7-30 15:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
weiyingde 发表于 2019-10-8 07:45
多媒体播放模块源码
程序集名        保留        保留        备注
_接口程序集                          在本程序集中定义的子程序可被模块外部程 ...

大神您好,我想请问一下mcisendstring可以设定异步播放吗?
就是一个单词还没读完的情况下,点击另一个单词就停止上一个单词的念读,读下一个

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-31 06:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不能,只能同步。

TA的精华主题

TA的得分主题

发表于 2021-4-2 10:38 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-24 19:00 , Processed in 0.039721 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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