收藏
0有用+1
0

mciSendString

函数
mciSendString是Windows平台中MCI(媒体控制接口)提供的函数,通过不区分大小写的命令字符串操作多媒体设备且仅支持命令字符串接口方式。其函数原型包含命令字符串、返回缓冲区、缓冲区长度及回调窗口句柄等参数,需包含头文件mmsystem.h(需先包含Windows.h)并链接winmm.lib库 [1] [3]。该函数返回值0表示执行成功,非零值的低16位为错误代码,高16位为驱动标识符 [3]
典型操作包括使用命令字符串控制多媒体设备,兼容CD、WAV、MP3等多种格式 [2-3]。返回错误类型涵盖参数错误、缺失命令、设备别名冲突等错误代码 [4]。该函数支持Windows NT 3.1及后续版本,提供Unicode和ANSI双版本实现,相关函数包含MCI命令集与mciGetErrorString错误解析函数 [3]。微软建议新代码采用MediaPlayer替代MCIWnd窗口类,但仍保留对mciSendString的兼容支持 [5]
外文名
mciSendString
头文件
mmsystem.h
DLL 文件
winmm.dll
LIB 文件
winmm.lib
功    能
执行MCI指令, 以达到播放暂停音频视频等.

头文件

播报
编辑
#include <mmsystem.h>

函数原型简介

播报
编辑
mciSendString(发送命令串),函数原型端讲为:
MCIERR雄蜜档榜OR mciSendString( // 出错返回非零值(错误代码
// 可用mciGe连境拜tErrorString获得错误的文本描述
LPCTSTR lpszCommand, // 指向以null结尾的命令字符串:”命令 设备[ 参数]”
LPTSTR lpszReturnString,// 指向接收返回信息的缓冲区,为NULL时不返回信息
UINT cchReturn, // 上述缓冲区的大小
HANDLE hwndCallback // 在命令串中含notify时,它拳束炒指定一个回调窗口的句柄
// 一般为NULL
)享骗恋组舟;
如:mciSendString(L"open sample.wav type waveaudio alias wave", NULL, 0, NULL);
MCI函数中还有一个只适用于命令串接口的函数为mciExcute,mciExcute(执行)是mciSendString的简化形式:
BOOL mciExcute(LPCTSTR lpszCommand); // 成功返回TRUE
该函数罪充只有Win16支持,Win32不支持,可自写一函数实现:
BOOL mciExcute(LPCTSTR lpszCommand) {
if (mciSendString(lpszCommand, NULL, 0, NULL)) return FALSE;
return TRUE;
}
如:mciExcute(L"o汽颂料pen sample.wav type waveaudio alias wave");

官方文档

播报
编辑
The mciSendString function sends a command string to an MCI device. The device that the command is sent to is specified in the command string. (这个mciSendString函数发送一个指令字符串到一个MCI设备, 指令发送的设备在这个指令字符串中被指定.)
更多信息, 请参照微软官方文档. [1]

函数原型

播报
编辑
MCIERROR mciSendString( LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback); [1]

差异比较

播报
编辑
mciSendString与mciExecute都是常用的执行MCI指令的函数, 在使用mciSendString执行时, 如若遇到异常, 仅会返回一个错误码, 而mciExecute还会弹出一个窗口.
所以, mciSendString常用于程序的最终发布版本, mciExecute由于会弹出窗口, 所以很少在发布版本中使用, 反而在调试版本中常用, 因为弹出窗口中会包含错误信息, 易于调试.

使用方法

播报
编辑

简略概述

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;
mciSendString("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就是要到的播放位置,可以由你指定。

详细内容

参考文章: mciSendString 和 mciSendCommand 函数的简单使用 [2]

程序示例

播报
编辑
命令串
1)CD
wchar_t buf[256];
MCIERROR err = mciSendString(L"open cdaudio alias cd", NULL, 0, NULL); // 打开CD
if (err) {
if (mciGetErrorString(err, buf, 256))
MessageBox(buf, L"Error"); // 获得并显示错误串
return;
}
mciSendString(L"status cd number of tracks", buf, 256, NULL); // 获得音轨总数
m_nTracks = wcstol(buf, NULL, 10); // 这里使用了宽字符版的字符串到整数的
// 转换函数:long wcstol( const wchar_t *nptr, wchar_t **endptr, int base );
wsprintf(buf, L"play cd from %d to %d", m_nFrom, m_nTo);
mciSendString(buf, NULL, 0, NULL); // 从音轨m_nFrom头播放到音轨m_nTo–1尾
其他常用命令:
mciSendString(L"set cd time format tmsf", NULL,0,NULL); // 设置时间格式为
// 轨(<100):分(<100):秒(<60):帧(<75),一秒=75块,一块=98帧
mciSendString(L"set cd door open", NULL, 0, NULL); // 打开光驱
mciSendString(L"set cd door closed", NULL, 0, NULL); // 关闭光驱
mciSendString(L"pause cd", NULL, 0, NULL); // 暂停播放
mciSendString(L"resume cd", NULL, 0, NULL); // 恢复播放
mciSendString(L"stop cd", NULL, 0, NULL); // 停止播放
mciSendString(L"close cd", NULL, 0, NULL); // 关闭CD设备
mciSendString(L"status cd length", buf, 256, NULL); // 获得整个CD的音轨总长度
mciSendString(L"status cd length track 5", buf, 256, NULL); // 获得第5个音轨的长度
mciSendString(L"status cd current track", buf, 256, NULL); // 获得当前音轨号
注意:
"play cd from m_nFrom to m_nTo"是完整形式,它还有其他形式:
"play cd from m_nFrom"从m_nFrom播放到盘尾
"play cd to m_nTo"从当前位置播放到指定音轨
"play cd" 从当前位置播放到盘尾
例如播放最后一首歌:"play cd from m_nLast"
2)WAV
wchar_t buf[256];
wsprintf(buf, L"open \"%s\" alias sound type waveaudio", pDoc->strFilePath);
MCIERROR err = mciSendString(buf, NULL, 0, NULL);
if (err) {
if (mciGetErrorString(err, buf, 256)) MessageBox(buf, L“Error”);
return;
}
// t1和t2为用户指定的起止时间(单位为秒,浮点变量)
DWORD start = (DWORD)(t1 * 1000 + 0.5), end = (DWORD)(t2 * 1000 + 0.5);
wsprintf(buf, L"play sound from %ld to %ld", start, end);
mciSendString(buf, NULL, 0, NULL);
其他常用命令:
mciSendString(L"status sound length", buf, 256, NULL);
mciSendString(L"pause sound", NULL, 0, NULL);
mciSendString(L"play sound", NULL, 0, NULL); // 从当前位置播放到文件尾
mciSendString(L"stop sound", NULL, 0, NULL);
mciSendString(L"close sound", NULL, 0, NULL);
3).MP3
下面看一个播放mp3音乐的简单示例:
#include<Windows.h> #include<mmsystem.h> #pragma comment(lib,"WINMM.LIB") int main(int argc,char*argv[]) {     mciSendString(TEXT("open 难忘的一天.mp3 alias mysong"),NULL,0,NULL);     mciSendString(TEXT("play MySong"),NULL,0,NULL);     Sleep(50000);     return0; }
该函数还可以播放avi视频等。