mcisendstring相关知识

来源:互联网 发布:ajax循环遍历json数组 编辑:程序博客网 时间:2024/05/16 09:29
1 mciSendString的使用 
    
 mciSendString是用来播放多媒体文件的API指令,可以播放MPEG,AVI,WAV,MP3,等等,下面我们来介绍一
下它的使用方法:
    一,打开多媒体文件。
    首先在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。
    二,播放多媒体文件。
    上面我们已经打开了f:\mpeg\mpeg1.avi,现在我们来播放它:
mciSendString("play movie",buf,sizeof(buf),NULL);
    如果想全屏播放:
mciSendString("play movie fullscreen",buf,sizeof(buf),NULL);
    三,暂停播放。
mciSendString("pause movie",buf,sizeof(buf),NULL);
    四,停止播放。
mciSendString("close movie",buf,sizeof(buf),NULL);
    五,得到所播放文件的长度。
char sPosition[256];long lLength;
ciSendString("Status movie length", sPosition, 255,0);lLength=strtol(sPosition, NULL, 10);
其中lLength就是所播放文件的长度。
    六,得到所播放文件的声音大小。
char chVolume[256];long lVolume;mciSendString("status movie volume",chVolume,255,0);lVolume=strtol(chVolume,NULL,10);其中lVolume就是所播放文件的声音大小。
    七,到你指定的位置播放。
CString step1;long lPosition;
lPosition=100;
step1.Format("seek movie to %ld",lPosition);
mciSendString(step1.GetBuffer(step1.GetLength()),buf,sizeof(buf),0);
其中lPosition就是要到的播放位置,可以由你指定。
 八,释放音频文件资源
你第一播放完毕后,是否已经stop或者说已经释放了mpeg1.avi的文件资源。如果没有stop或者不释放的话。你是应该播放不了的。因为那个文件正在占用。
 九,打开与关闭光驱门
mciSendString("Set cdAudio door open wait",NULL,0,NULL)就可以打开光驱门,把其中的open改为closed便可关闭门了!

 

例子:

Private Sub Command1_Click()
Dim back
back = mciSendString&("CLOSE NN", 0, 0, 0)
End Sub

Private Sub Command2_Click()
Dim back
back = mciSendString&("OPEN " + App.Path + "TEST.mid" + " TYPE SEQUENCER ALIAS NN", 0&, 0, 0)
back = mciSendString&("PLAY NN FROM 0", 0&, 0, 0)
R% = mciSendString&("CLOSE ANIMATION", 0&, 0, 0)
End Sub

Private Sub Form_Load()
Dim back
back = mciSendString&("OPEN " + App.Path + "TEST.mid" + " TYPE WaveAudio ALIAS NN", 0&, 0, 0)
back = mciSendString&("PLAY NN FROM 0", 0&, 0, 0)
R% = mciSendString&("CLOSE ANIMATION", 0&, 0, 0)
End Sub

-----------------------------------------------

思路:在TIMER控件中检测当前文件的播放状态,如果为stopped,那么就重复播放

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
Private Sub Command1_Click()
Timer1.Enabled = True
Timer1.Interval = 100
Call mciSendString("close all", 0, 0, 0) '首先关闭所有的MCI设备,避免播放多个音乐文件时声音会重叠
Call mciSendString("open " + "c:\winnt\media\ringin.wav", 0, 0, 0) '打开MCI设备
Call mciSendString("play " + "c:\winnt\media\ringin.wav", 0, 0, 0) '播放MCI设备
End Sub
Private Sub Timer1_Timer()

Dim buffer As String * 128
Dim pos As Integer
   mciSendString "status c:\winnt\media\ringin.wav mode", buffer, 128, 0&

    pos = InStr(buffer, Chr(0))
   If Left(buffer, pos - 1) = "stopped" Then
     Call mciSendString("close all", 0, 0, 0)
Call mciSendString("open " + "c:\winnt\media\ringin.wav", 0, 0, 0)
Call mciSendString("play " + "c:\winnt\media\ringin.wav", 0, 0, 0)
End If
End Sub
---------------------------------------------------------------------

    光驱多了,开关都显得很费事,于是编了个程序来控制。
    如果只有一个光驱,非常简单,用mciSendString("Set cdAudio door open wait",NUL,0,NUL)就可以打开光驱门,把其中的open改为closed便可关闭门了。
    对于多个光驱,可先用GetLogicalDriveStrings和GetDriveType函数找出所有的光驱(具体用法请参考MSDN),放到列表框中。

    当要弹出或关闭某光驱的门时,先用mciSendCommand发送MCI_OPEN命令得到该光驱的DeviceID(保存在MCI_OPEN_PARMS结构中),然后再发送MCI_SET命令打开门或关闭门。(在微软的MCI接口中,mciSendString和mciSendCommand是两套同等的函数,都能实现相同的功能)。

    代码如下(其中,anystr中存放的是要操作的光驱的路径):

    anystr=anystr.Left(1);//在网上找到的代码中光驱用“盘符:”的方式表示,经本人试验,只需第一个字母就行了,如F盘则用字母F就可以了。
    MCI_OPEN_PARMS receivedeviceid;//MCI_OPEN命令要用到的结构,用来设置命令参数,并接收返回的设备ID。
    receivedeviceid.lpstrDeviceType="CDAUDIO";//这里指定了设备类型,网上搜索到的代码中,这里使用的是设备标识符,较为麻烦,用类型就行了。
    receivedeviceid.lpstrElementName=anystr;//指定设备路径
   mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT|MCI_OPEN_SHAREABLE,(DWORD_PTR)&receivedeviceid);//中间用到的flags可参考MSDN中MCI_OPEN命令的说明。
    if(drivestatus==1)
    {
         mciSendCommand(receivedeviceid.wDeviceID,MCI_SET,MCI_SET_DOOR_OPEN,0);
     drivestatus=0;
    }
    else
    {
         mciSendCommand(receivedeviceid.wDeviceID,MCI_SET,MCI_SET_DOOR_CLOSED,0);
     drivestatus=1;
    }
    mciSendCommand(receivedeviceid.wDeviceID,MCI_CLOSE,MCI_WAIT,0);//最后关闭设备
   上面的代码中,drivestatus是自定义的全局变量,用来存放当前光驱门的状态。本来光驱门的状态应该用函数实时得到,
 
 
 
原创粉丝点击