mciSendString

mciSendString是Windows平台中MCI(媒體控制接口)提供的函式,通過不區分大小寫的命令字元串操作多媒體設備且僅支持命令字元串接口方式。其函式原型包含命令字元串、返回緩衝區、緩衝區長度及回調視窗句柄等參數,需包含頭檔案mmsystem.h(需先包含Windows.h)並連結winmm.lib庫。該函式返回值0表示執行成功,非零值的低16位為錯誤代碼,高16位為驅動標識符。

典型操作包括使用命令字元串控制多媒體設備,兼容CD、WAV、MP3等多種格式。返回錯誤類型涵蓋參數錯誤、缺失命令、設備別名衝突等錯誤代碼。該函式支持Windows NT 3.1及後續版本,提供Unicode和ANSI雙版本實現,相關函式包含MCI命令集與mciGetErrorString錯誤解析函式。微軟建議新代碼採用MediaPlayer替代MCIWnd視窗類,但仍保留對mciSendString的兼容支持。

基本介紹

  • 外文名:mciSendString
  • 頭檔案:mmsystem.h
  • DLL 檔案:winmm.dll
  • LIB 檔案:winmm.lib
  • 功能:執行MCI指令, 以達到播放暫停音頻視頻等.
頭檔案,函式原型簡介,官方文檔,函式原型,差異比較,使用方法,簡略概述,詳細內容,程式示例,

頭檔案

#include <mmsystem.h>

函式原型簡介

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");

官方文檔

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設備, 指令傳送的設備在這個指令字元串中被指定.)
更多信息, 請參照微軟官方文檔.

函式原型

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

差異比較

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 函式的簡單使用

程式示例

命令串
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視頻等。

相關詞條

熱門詞條

聯絡我們