媒体控制接口(MCI)的学习与使用

使用MCI(媒体控制接口)播放音频文件,MCI为程序员提供了两种方式访问MCI设备或文件:一种是基于消息的命令接口函数;另一种是使用字符串接口函数。两者的区别在于基本命令结构和发送信息到设备的原理。 

A.基于消息的MCI 

    消息命令控制接口使用消息控制MCI设备,将消息和控制信息以数据结构的形式作为函数参数发送,并接收返回的数据,MCI直接把设备消息和控制消息发送到设备。一条基于MCI的命令包含以下3个部分。 

数据结构:该结构包含可传递给MCI驱动程序的信息和从驱动程序返回的值,指定要执行的MCI命令一个常量,如MCI_OPEN、MCI_CLOSE... 

一个或一组用来指定MCI信息子选项的标志:这些标志用来确定可以得到什么类型的信息和如何执行函数。 

一个确定命令附加参数。

    Windows SDK为使用命令消息接口发送MCI消息提供了3个核心函数。 

1、mciSendCommand函数。

该函数用于向MCI设备发送一个命令消息,原型为:

MCIERROR  mciSendCommand(MCIDEVICEID IDDevice, UINT uMsg, DWORD fdwCommand, DWORD dwParam);

参数说明如下: 

IDDevice:用来表示一个MCI设备。MCI使用MCI_OPEN消息打开一个设备时自动创建一个标识号用以唯一标识要操作的设备,以后的命令操作均使用此标识。 

uMsg:表示要发出的消息,取值如下所示。 

        MCI_OPEN        打开一个设备 

        MCI_CLOSE       关闭一个设备 

        MCI_PLAY        播放全部或部分音频,从暂停状态恢复播放 

        MCI_STOP        停止播放 

        MCI_PAUSE       暂停播放 

        MCI_SEEK        改变当前位置 

        MCI_CUE         提示一个设备以最小的延迟开始播放或录制 

        MCI_RECORD      在一个设备上开始录制 

        MCI_SAVE        保存一个文件 

        MCI_INFO        查询设备信息,如产品名称等 

        MCI_GETDEVCAPS  查询产品特征,如设备类型等 

        MCI_STATUS      查询设备当前状态,如播放位置、媒体格式等 

        MCI_SET         设置设备参数,如时间格式、波形数据格式等 

    fdwCommand:消息指定标志。 

    dwParam:指定一个指向消息数据结构的指针。 

    如果mciSendCommand函数调用成功则返回0,否则返回错误代码消息。所返回的DWORD低位字是错误代码,可以将它发送到mciGetErrorString函数,已获得对错误的文本描述。若错误事设备特有的,高位包含了设备ID,否则高位为0。 

    MMSYSTEM.H头文件中还定义了MCI命令所需要的数据结构类型。以下是MCI命令常用的数据结构。

        MCI_OPEN_PARMS     MCI_OPEN命令消息参数的数据结构 

        MCI_PLAY_PARMS     MCI_PLAY命令消息参数的数据结构 

        MCI_RECORD_PARMS   MCI_RECORD命令消息参数的数据结构

2、mciGetDevicelID函数。

    当打开一个设备时,该函数用来获得此设备的ID,原型为: 

MCIDEVICEID  mciGetDevicelID(LPCTSTR lpszDevice); 

    参数lpszDevice指定要打开的MCI设备名。若函数调用成功,则返回设备的标志号,否则返回0。 

3、mciGetErrorString函数。

该函数用于返回一个错误代码的文本描述,原型为: 

BOOL  mciGetErrorString(DWORD fdwError, LPTSTR lpszErrorText, UINT cchErrorText); 

    参数说明如下: 

    fdwError:上一次mciSendCommand函数调用的返回值。 

    lpszErrorText:用来接收返回的文本描述的缓冲区指针。 

    cchErrorText:指定lpszErrorText的长度。 

B.基于字符串的MCI

    命令字符串接口使用文本命令控制MCI设备。文本串中包含执行一个命令所需要的所有信息。MCI分析文本串,并把它翻译成命令消息接口中的消息和控制信息。由于加入了翻译过程,命令字符串接口的速度要慢于命令消息接口。

    Windows也为字符串接口定义了3个核心操作函数。 

1、mciSendString函数。

该函数用于向一个MCI的设备驱动程序发送一个字符串,原型为:

MCIERROR  mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback); 

    参数说明如下: 

    lpszCommand:一个以NULL结尾的定义MCI控制命令的字符串,格式为:command device_name argument 

    lpszReturnString:一个远指针,它指向由应用程序返回的字符串缓冲区。 

    cchReturn:指定了缓冲区大小。 

    hwndCallback:用来指定接收并处理MCI向应用程序发出的MM_MCINOTIFY消息窗口的句柄。 

    函数成功调用,则返回0,否则返回错误代码。可以将错误代码传递给mciGetErrorString函数获得对错误的文本描述。

2、mciGetErrorString函数。

前面已作了介绍,这里不再叙述。

3、mciExecute函数。

实际上是mciSendString函数的简化形式,它不占用缓冲区来返回消息。如果调用失败,则显示出错信息消息框,原型为: 

BOOL  FAR  PASCAL  mciExecute(LPCTSTR lpszDevice); 

    参数lpszDevice与mciSendString函数的第一个参数含义相同。

C.使用

    使用MCI对多媒体进行操作实际上是向设备发送相应的命令。下面介绍各种常用的操作。

1、打开多媒体设备

    使用MCI_OPEN命令消息来打开设备。所有的设备对于MCI命令都需要一个指向消息命令数据结构MCI_OPEN_PARMS的指针。该结构格式如下: 

typedef struct _MCI_OPEN_PARMS 

{ 

    DWORD dwCallback;         //设置MCI_NOTIFY标志时的回调窗口句柄 

    MCIDEVICEID wDeviceID;    //打开设备成功时返回的设备标识号 

    LPCSTR lpstrDeviceType;   //指定所要打开设备类型 

    LPCSTR lpstrElementName;  //对于复合设备,指定设备元素 

    LPCSTR lpstrAlias;        //设备别名 

} MCI_OPEN_PARMS;  
The following additional flags apply to all devices supporting MCI_OPEN:

MCI_OPEN_ALIAS 别名

An alias is included in the lpstrAlias member of the structure identified by lpOpen.

MCI_OPEN_SHAREABLE 共享

The device or file should be opened as shareable.

MCI_OPEN_TYPE lpstrDeviceType已设置

A device type name or constant is included in the lpstrDeviceType member of the structure identified by lpOpen.

MCI_OPEN_TYPE_ID lpstrDeviceType已设置为设备ID

The low-order word of the lpstrDeviceType member of the structure identified by lpOpen contains a standard MCI device type identifier and the high-order word optionally contains the ordinal index for the device. Use this flag with the MCI_OPEN_TYPE flag.

 

The following additional flags apply to compound devices:

MCI_OPEN_ELEMENT lpstrElementName已设置

A filename is included in the lpstrElementName member of the structure identified by lpOpen.

MCI_OPEN_ELEMENT_ID lpstrElementName已设置为设备ID

The lpstrElementName member of the structure identified by lpOpen is interpreted as a DWORD value and has meaning internal to the device. Use this flag with the MCI_OPEN_ELEMENT flag.


The following additional flags are used with the digitalvideo device type:

MCI_DGV_OPEN_NOSTATIC

The device should reduce the number of static (system) colors in the palette. This increases the number of colors available for rendering the video stream. This flag applies only to devices that share a palette with Windows.

MCI_DGV_OPEN_PARENT

The parent window handle is specified in the hWndParent member of the structure identified by lpOpen.

MCI_DGV_OPEN_WS

A window style is specified in the dwStyle member of the structure identified by lpOpen.

MCI_DGV_OPEN_16BIT

Indicates a preference for 16-bit MCI device support.

MCI_DGV_OPEN_32BIT

Indicates a preference for 32-bit MCI device support.

For digital-video devices, the lpOpen parameter points to an MCI_DGV_OPEN_PARMS structure.

The following additional flags are used with the overlay device type:

MCI_OVLY_OPEN_PARENT

The parent window handle is specified in the hWndParent member of the structure identified by lpOpen.

MCI_OVLY_OPEN_WS

A window style is specified in the dwStyle member of the structure identified by lpOpen. The dwStyle value specifies the style of the window that the driver will create and display if the application does not provide one. The style parameter takes an integer that defines the window style. These constants are the same as the standard window styles (such as WS_CHILD, WS_OVERLAPPEDWINDOW, or WS_POPUP).

For video-overlay devices, the lpOpen parameter points to an MCI_OVLY_OPEN_PARMS structure.


The following additional flag is used with the waveaudio device type:

MCI_WAVE_OPEN_BUFFER

A buffer length is specified in the dwBufferSeconds member of the structure identified by lpOpen.

For waveform-audio devices, the lpOpen parameter points to an MCI_WAVE_OPEN_PARMS structure. The MCIWAVE driver requires an asynchronous waveform-audio device.

简单设备和复合设备打开方式有所不同。打开简单设备时,不需要指定设备元素。可以用3种方法打开一个简单设备。

a、指定设备名。

下面一段代码通过指定设备名打开一个光盘设备。

WORD wDeviceID; 

MCI_OPEN_PARMS mciOpenParms; 

//为MCI_OPEN消息数据结构赋值 

mciOpenParms.lpstrDeviceType = "cdaudio"; 

//通过指定设备名打开光盘设备 

if (micSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParms)) 

    //调用失败的处理 

else 

    wDeviceID = mciOpenParms.wDeviceID; 

b、指定设备驱动程序。

下面一段代码通过指定设备的驱动程序打开一个光盘设备。 

WORD wDeviceID; 

MCI_OPEN_PARMS mciOpenParms; 

//为MCI_OPEN消息数据结构赋值 

mciOpenParms.lpstrDeviceType = "mcicd.drv"; 

//通过指定设备名打开光盘设备 

if (micSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParms)) 

    //调用失败的处理 

else 

    wDeviceID = mciOpenParms.wDeviceID; 

c、指定设备类型参数。

    各个MCI设备的设备类型常量如下所示。 

    MCI命令能够管理的音频设备类型所对应的字符串和常量 

       cdaudio            MCI_DEVTYPE_CD_AUDIO 

       waveaudio          MCI_DEVTYPE_WAVEFORM_AUDIO 

       sequencer          MCI_DEVTYPE_SEQUENCER 

       animation          MCI_DEVTYPE_ANIMATION 

       dat                MCI_DEVTYPE_DAT 

       digitalvideo       MCI_DEVTYPE_DIGITAL_VIDEO 

       other              MCI_DEVTYPE_OTHER 

       scanner            MCI_DEVTYPE_SCANNER 

       vcr                MCI_DEVTYPE_VCR 

       videodisc          MCI_DEVTYPE_VIDEODISC 

       mpegvideo          MP3播放类型(常量不清楚,只知道字符串)

    下面一段代码通过指定设备的类型参数打开一个光盘设备。 

WORD wDeviceID; 

MCI_OPEN_PARMS mciOpenParms; 

//为MCI_OPEN消息数据结构赋值 

mciOpenParms.lpstrDeviceType = (LPRSTR) MCI_DEVTYPE_CD_AUDIO; 

//通过指定设备名打开光盘设备 

if (micSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParms)) 

    //调用失败的处理 

else 

    wDeviceID = mciOpenParms.wDeviceID; 

打开复合设备需要指定设备元素,也可以用3种方法打开一个复合设备。

a、只指定设备。

该方法类似于打开简单设备,但只适合用于MCI_GETDEVCAPS命令确定设备性能。 

b、同时指定设备和设备元素。

该方法需要指出设备元素。举例如下: 

WORD wDeviceID; 

MCI_OPEN_PARMS mciOpenParms; 

//为MCI_OPEN消息数据结构赋值 

mciOpenParms.lpstrElementName = "c:\windows\media\chorcd.wav"; 

//通过指定设备元素参数打开复合设备 

if (micSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParms)) 

    //调用失败的处理 

else 

    wDeviceID = mciOpenParms.wDeviceID; 

c、只指定设备元素。

在此方式下,MCI根据WIN.INI文件中的[mci extension]字段,从设备的扩展名确定设备。例如: 

#define wPtnLength 255;           //缓冲区大小 

char lpstrRtnString[wPtnLength];   //指向缓冲区指针 

WORD result; 

result = mciSendString("open cdaudio", lpstrRtnString, wPtnLength, NULL); 

//打开CD设备 

if (result != 0) 

    mciGetErrorString(result, lpstrRtnString, wPtnLength) 

    //事件处理 

else 

    //设备成功打开后事件处理 

    下面一段代码用来打开一个多媒体复合设备。 

#define wPtnLength 255;           //缓冲区大小 

char lpstrRtnString[wPtnLength];   //指向缓冲区指针 

WORD result; 

result = mciSendString("c:\windows\media\chorcd.wav", lpstrRtnString, wPtnLength, NULL); 

//打开CD设备 

if (result != 0) 

    mciGetErrorString(result, lpstrRtnString, wPtnLength) 

    //事件处理 

else 

    //设备成功打开后事件处理 

2、播放多媒体设备

    在成功打开设备后,应用程序就可以通过向MCI发送MCI_PLAY或play字符串命令来播放多媒体设备。MCI_PLAY的数据结构MCI_PLAY_PARMS的格式如下: 

typedef struc{ 

    DWORD dwCallback;    //设置MCI_NOTIFY标志时回调窗口句柄 

    DWORD dwFrom;        //播放的起始位置 

    DWORD dwTo;          //播放的结束位置 

} MCI_PLAY_PARMS; 

    下面一段代码用来播放已打开的MCI设备。 

WORD wDeviceID; 

MCI_PLAY_PARMS mciPlayParams; 

//为MCI_PLAY消息数据结构赋值 

mciSendCommand(wDeviceID, MCI_PLAY, 0, (DWORD)(LPVOID)&mciPlayParams); 

    若不给MCI_PLAY_PARMS数据结构中的dwFrom和dwTo字段赋值,播放从头至尾进行。 

    而在使用play字符串命令时,如果play命令不加任何参数,则多媒体设备会从目前的位置播放到媒体或文件的结束。play命令支持From和To两个参数,它们分别指向起始和终止位置。实例如下: 

#define wPtnLength 255;           //缓冲区大小 

char lpstrRtnString[wPtnLength];   //指向缓冲区指针 

//播放CD从第10秒到第15秒位置 

mciSendString("play cdaudio from 10000 to 15000", lpstrRtnString, wPtnLength, NULL); 

3、关闭媒体设备

    应用程序在使用完一个打开的多媒体设备后,必须向MCI发送一个MCI_CLOSE消息来关闭设备。应该注意的是,在应用程序退出之前,应关闭所有的MCI设备。这时可以使用MCI_ALL_DEVICE_ID常量,只需一条命令就关闭所有的多媒体设备。下面一段代码演示了关闭所有设备。 

mciSendCommand(MCI_ALL_DEVICE_ID, MCI_CLOSE, 0, NULL); 

    也可以使用close字符串命令关闭使用完的MCI设备。例如: 

#define wPtnLength 255;           //缓冲区大小 

char lpstrRtnString[wPtnLength];   //指向缓冲区指针 

mciSendString("close cdaudio", lpstrRtnString, wPtnLength, NULL); 

    与基于消息的命令一样,在退出应用程序之前,应关闭所有的设备,这时可以使用all参数,实例如下: 

#define wPtnLength 255;           //缓冲区大小 

char lpstrRtnString[wPtnLength];   //指向缓冲区指针 

mciSendString("close all", lpstrRtnString, wPtnLength, NULL); 

4、暂停多媒体播放

    暂停多媒体播放可以通过向MCI发送MCI_PAUSE命令实现,实例如下: 

WORD wDeviceID; 

MCI_PLAY_PARMS mciPlayParam; 

mciSendCommand(wDeviceID, MCI_PAUSE, NULL, (DWORD)(LPVOID)&mciPlayParam); 

5、获取和设置播放信息

    在播放媒体时,很多时候需要获取播放信息,如波形音频的采样率、通道数和量化位数、CD音频文件总长度等。这时,可以通过向MCI发送MCI_STATUS命令实现。下面一段代码可以用来获取波形音频的采样率和通道数。 

WORD wDeviceID; 

MCI_STATUS_PARAM StatusParam; 

StatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC; 

mciSendCommand(wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITTEM, &StatusParam); 

DWORD samplerate = StatusParam.dwReturn;    //该参数返回采样率 

StatusParam.dwItem = MCI_WAVE_STATUS_CHANNLES; 

mciSendCommand(wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITTEM, &StatusParam); 

DWORD channelnumber = StatusParam.dwReturn;    //该参数返回通道数 

    也可以采用字符串命令的方式获得播放信息,实例如下: 

MCIERROR mciError; 

mciError = mciSendString("open waveaudio", buf, strlen(buf), NULL); 

    同样,在进行编程时,有时也需要对媒体设备的一些播放信息进行设置。这可以通过向已经打开的媒体设备发送MCI_SET命令实现。例如下面一段代码用来设置音频的播放格式为毫秒方式。 

WORD wDeviceID; 

MCI_SET_PARMS SetParam; 

SetParam.dwFormat = MCI_FORMAT_MILLISECONDS; 

DWORD OpenFlag = mciSendCommand(wDeviceID, MCI_SET, MCI_TIME_FORMT, &SetParam); 

    采用字符串命令设置媒体播放格式的代码如下: 

MCIERROR mciError; 

mciError = mciSendString("Set file format milliseconds", buf, strlen(buf), NULL); 

6、播放的跳转

    在媒体播放过程中进行跳转首先需要声明一个MCI_SEEK_PARMS结构,并使用该结构的dwTo字段设定需要播放的位置,该位置以毫秒为单位。然后通过mciSendCommand函数向指定设备以MCI_TO为标志发送MCI_SEEK命令,如果只需要跳转到文件的开始或结束位置,可以直接使用MCI_SEEK_TO_START和MCI_SEEK_TO_END为标识发送MCI_SEEK命令。例如: 

WORD wDeviceID; 

int nMinute;      //欲跳转的时间,以分钟为单位 

MCI_SEEK_PARMS SeekParam; 

SeekParam.dwTo = (nNinute*60+nSecond)*1000;    //跳转的目标时间,以毫秒为单位 

mciSendCommand(wDeviceID, MCI_SEEK, MCI_SEEK_TO | MCI_WAIT, (DWORD)(LPVOID)&SetParam); 

    下段代码通过MCI_SEEK命令使CD音频在nTrack轨道,第nMinute分钟,第nSecond秒的nFrame帧进行播放。 

int nTrack, nMinute, nSecond; 

WORD wDeviceID; 

MCI_SEEK_PARMS SeekParam; 

SeekParam.dwTo = MCI_MAKE_TWSF(nTrack, nMinute, nSecond, nFrame); 

mciSendCommand(wDevice, MCI_SEEK, MCI_SEEK_TO | MCI_WAIT, (DWORD)(LPVOID)&SetParam); 

7、波形音频的录制和保存 

    在进行波形音频编程时,记录音频设备输入的音频信息也能实现录音功能。可以通过向打开的音频设备发送MCI_RECORD命令实现该功能。例如: 

WORD wDeviceID; 

MCI_RECORD_PARMS RecordParam; 

RecFlag = mciSendCommand(wDeviceID, MCI_RECORD, NULL, &RecordParam); 

8、此外,保存音频设备的声音数据wav文件可以通过向设备发送MCI_SAVE命令实现。例如: 

WORD wDeviceID; 

MCI_SAVE_PARMS SaveParam; 

SaveParam.lpfilename = (LPCSTR) FileName; 

DWORD SaveFlag = mciSendCommand(wDeviceID, MCI_SAVE, MCI_SAVE_FILE | MCI_WAIT, &SaveParam); 

9、常用字符串命令

1.打开:

      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           通知


2.播放:

      mciSendString "play movie", 0&, 0, 0 

      mciSendString "play movie fullscreen", 0&, 0, 0 '全屏播放
 

3.暂停:

      mciSendString "pause movie", 0&, 0, 0 
 

4.继续:

      mciSendString "resume movie", 0&, 0, 0 


5.停止:

      mciSendString "stop movie", 0&, 0, 0 


6.关闭:

      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.控制声音大小:

      Dim V As Long

      mciSendString "status movie volume", V, 0, 0 'V是获取的音量大小值。

      V = 50

      mciSendString "setaudio movie volume to " & V, &0, 0, 0 'V是设置的音量值

 
15.控制亮度(如果是播放视频)

      Dim B As Long

      mciSendString "status movie brightness", B, 0, 0 'B是获取的亮度值。

      B = 50

      mciSendString "setvideo movie brightness to " & B, &0, 0, 0 'B是设置的亮度值

 
16.到指定的位置播放。

      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 '定位到最后位置

 
17.在指定控件上播放视频:

      mciSendString "open AVI 文件名 parent hWnd style child", 0&, 0, 0

      其中,hWnd 是控件的句柄

      执行上述命令之后,影片会被放置在控件的左上角,且影片的大小不受控件大小的影响,如果想要改变

      影片播放的位置及大小,可以在執行 play 指令前先执行 put 指令,格式如下:

      mciendString "put AVI 文件名 window at X Y [Width Height]", 0&, 0, 0

      其中 X 及 Y 参数须填入位置,而 Width 及 Height 参数则填入影片显示出來的宽度及高度

 
18.录音设置:

        录音前,用以下语句初始化

        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

 
19.开关光驱:

      mciSendString "set cdaudio door open", "", 0, 0 '打开

      mciSendString "set cdaudio door close", "", 0, 0 '关闭

最后:附上一个简单的应用例子http://download.csdn.net/detail/gongluck93/9683352

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python中文社区

最新实用Python异步爬虫代理池(开源)

异步爬虫代理池,以 Python asyncio 为基础,旨在充分利用 Python 的异步性能。

941
来自专栏代码GG之家

android native内存检测方案(二)

android native 代码内存泄露 定位方案(一) 什么是 AddressSanitizer clang 是一个 C、C++、Objective-C 编...

37110
来自专栏Jerry的SAP技术分享

SAP Fiori里两种锁机制(lock)的实现

SAP CRM Fiori采用了这种机制。

1819
来自专栏Java3y

纳税服务系统四(角色模块)【角色与权限、角色与用户】

需求分析 我们直接来看看原型图,看看需求是怎么样的: ? 这里写图片描述 ? 这里写图片描述 我们看到上图,就会发现角色模块主要还是CRUD,唯一不同的就是它不...

4688
来自专栏杨建荣的学习笔记

ORACLE 10g 升级 11g问题汇总(31天)

按照计划开始了生产库的升级,环境基于linux 64位. uname: Linux 2.6.18-308.el5 #1 SMP Fri Jan 27 17:1...

4139
来自专栏逸鹏说道

REDIS操作命令小结

缘由: 最初学过一段时间的Redis的使用,但是后来长时间没有接触,就又忘了,往复这么弄了几次,感觉比较浪费时间,所以今天决定整理一下Redis的常见操作命令,...

3355
来自专栏微信公众号:Java团长

Java Web现代化开发:Spring Boot + Mybatis + Redis二级缓存

Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一。Mybatis是一个十分轻量好用的ORM框架。Red...

932
来自专栏杨建荣的学习笔记

PostgreSQL里面的一些命令小结

近两天总结了下PostgreSQL的基本操作命令,对PostgreSQL也有了一个基本的认识。 PostgreSQL的功能还是很丰富的,有序列,支持db lin...

3887
来自专栏岑玉海

hbase源码系列(十四)Compact和Split

先上一张图讲一下Compaction和Split的关系,这样会比较直观一些。 ? Compaction把多个MemStore flush出来的StoreFile...

2958
来自专栏Jerry的SAP技术分享

ABAP function group和Tomcat library重复加载问题

ABAP help文档里对**LOAD-OF-PROGRAM"的关键字是这样描述的:

1472

扫码关注云+社区