複製鏈接
請複製以下鏈接發送給好友

mciSendString

鎖定
MCI(Media Control Interface,媒體控制接口)函數中,有些只適用於一種接口方式,有些則兩種接口都可以用。mciSendString只適用於命令串接口方式(命令串中不區分大小寫)。
中文名
mciSendString
外文名
mciSendString
頭文件
mmsystem.h
DLL 文件
winmm.dll
LIB 文件
winmm.lib
功    能
執行MCI指令, 以達到播放暫停音頻視頻等.

mciSendString頭文件

#include <mmsystem.h>

mciSendString函數原型簡介

mciSendString(發送命令串),函數原型為:
MCIERROR mciSendString( // 出錯返回非零值(錯誤代碼
// 可用mciGetErrorString獲得錯誤的文本描述
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"open sample.wav type waveaudio alias wave");

mciSendString官方文檔

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] 

mciSendString函數原型

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

mciSendString差異比較

mciSendString與mciExecute都是常用的執行MCI指令的函數, 在使用mciSendString執行時, 如若遇到異常, 僅會返回一個錯誤碼, 而mciExecute還會彈出一個窗口.
所以, mciSendString常用於程序的最終發佈版本, mciExecute由於會彈出窗口, 所以很少在發佈版本中使用, 反而在調試版本中常用, 因為彈出窗口中會包含錯誤信息, 易於調試.

mciSendString使用方法

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;
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詳細內容

參考文章: mciSendString 和 mciSendCommand 函數的簡單使用 [2] 

mciSendString程序示例

命令串
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視頻等。
參考資料