MCI文字列
MCIとの対話
MCI コマンドを用いれば、より柔軟にマルチメディアを扱うことができますが
MCI コマンドの代わりに、文字列を用いて MCI を制御することもできます
MCI 文字列は、メッセージと異なり高水準な、対話的な処理を行えます
これは、例えばスクリプト言語のようなものからでも
直接 MCI を制御することができることを意味します
MCI 文字列はインタプリンタの形で MCI を制御するため、非常に便利に思えますが
当然、文字列を解析する作業が出てくるため、実行速度は激減します
そのため、C言語の様にコンパイルされる場合は MCI コマンドを使うべきと考えられます
あくまで、MCI 文字列はスクリプト言語などから制御する時に使うと考えてください
文字列を MCI に送信するには mciSendString() 関数を使います
MCIERROR mciSendString(
LPCTSTR lpszCommand ,
LPTSTR lpszReturnString , UINT cchReturn ,
HANDLE hwndCallback
);
lpszCommand には、MCI コマンド文字列を指定します
lpszReturnString は、指定した MCI コマンドの結果を格納するバッファのポインタです
ただし、全ての MCI コマンド文字列がこれを設定するわけではありません
情報が不用であれば、この引数には NULL を指定することができます
cchReturn は、lpszReturnString で指定したバッファサイズを指定します
hwndCallback は、notify フラグを指定した時の、コールバックウィンドウのハンドルを指定します
これは、MCI コマンドの構造体の dwCallback メンバと同じ意味の引数です
関数が成功すれば 0 が、失敗すれば 0 以外の値が返ります
失敗した時、下位ワードにはエラーコードが格納されています
上位ワードは、エラーコードがデバイス固有の場合に、ドライバの ID が格納されます
MCI 文字列も、明確に仕様が定められています
基本的に、MCI コマンド文字列は次のような形で指定します
mci-command lpszDevice lpszOpenFlags lpszFlags
mci-command には、コマンドを文字列で表したキーワードを指定します
例えば、MCI_OPEN コマンドは open という文字列で指定することができます
lpszDevice には、MCI デバイスの識別子を指定します
MCI コマンド文字列では open コマンドを指定した時に alias フラグで識別子を決めます
これによって、指定したデバイスに対して適当なエイリアス(別名)を与えられます
lpszOpenFlags には、初期化子など、コマンドに対するフラグを指定します
例えば、open コマンドであれば、ここに alias フラグを指定することができます
lpszFlags には、wait か notify フラグのいずれか、または両方を指定できます
これは、MCI コマンドのフラグにおける MCI_NOTIFY、MCI_WAIT に等しいです
MCI コマンド文字列の個々の仕様については、MSDN を参照してください
一般的なプログラムでは MCI コマンドを用いるべきであり、文字列を使う必要はありません
#include <windows.h>
#define TITLE TEXT("Kitty on your lap")
#define OPEN TEXT("open test.avi type avivideo alias kitty")
#define PLAY TEXT("play kitty fullscreen")
#define CLOSE TEXT("close kitty")
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
switch (msg) {
case WM_DESTROY:
mciSendString(CLOSE , NULL , 0 , hWnd);
PostQuitMessage(0);
return 0;
case WM_CREATE:
mciSendString(OPEN , NULL , 0 , hWnd);
mciSendString(PLAY , NULL , 0 , hWnd);
}
return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow) {
HWND hWnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = TEXT("KITTY");
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return 1;
hWnd = CreateWindow(
TEXT("KITTY") , TITLE ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL , hInstance , NULL
);
if (hWnd == NULL) return 1;
while (GetMessage(&msg , NULL , 0 , 0 )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
このプログラムは、実行ファイルと同じフォルダに存在する
test.avi というメディアファイルをフルスクリーンで再生するというものです
プログラムを実行する前に、あらかじめ再生する AVI ファイルを用意してください
"open test.avi type avivideo alias kitty"
この MCI 文字列は、WM_OPEN コマンドを実行するコマンド文字列です
test.avi という avivideo タイプのメディアを開き、kitty という名前の別名を与えます
"play kitty fullscreen"
この MCI 文字列は、WM_PLAY コマンドを実行するコマンド文字列です
fullscreen フラグは、フルスクリーンモードで再生することを意味します
このフラグの代わりに window を指定すれば、ウィンドウを生成して再生します
"close kitty"
アプリケーション終了時に呼び出しているこのコマンド文字列は
WM_CLOSE コマンドに代わる、デバイスを閉じるためのものです
必ず、オープンした MCI デバイスは閉じる必要があります
mciSendString()
MCIERROR mciSendString(
LPCTSTR lpszCommand ,
LPTSTR lpszReturnString , UINT cchReturn ,
HANDLE hwndCallback
);
NCI デバイスにコマンド文字列を送信します
lpszCommand - MCI コマンド文字列を指定します
lpszReturnString - コマンドの結果を格納するバッファのポインタを指定します
cchReturn - lpszReturnString で指定したバッファサイズを指定します
hwndCallback - コールバックウィンドウのハンドルを指定します
戻り値 - 成功すれば 0 、失敗すれば 0 以外