|
分類:[C#]
開発環境
Microsoft Visual C# 2005
.NET Ver2 SP1
mciSendStringコマンドを使用してwavファイルを再生し、
再生が終了したらそのファイルを自動的に閉じようと思っているのですが上手く動きません。
流れとしては
@openコマンドでwavファイルを開く
Aplayコマンドにnotifyオプションを付けて再生開始
BWndProc関数内でステータスを取得し、stopped状態ならファイルを閉じる
としたいのですがMM_MCINOTIFYが発生した時点でステータスを調べてもplaying状態のままで
stop状態にはなりません。
※MM_MCINOTIFYが発生してから100ms程度のウェイトをいれた後にステータスを調べると
一応stopped状態にはなりますが、100msといういい加減な値は信用出来ないので・・・。
なぜわざわざステータスを取得しているかというとwavファイルがリストに複数登録されていて
その中のどのwavファイルの再生が終了したのかを調べるために取得しています。
MM_MCINOTIFYが発生した時点で確実にstopped状態を取得する方法はないのでしょうか?
[DllImport("winmm.dll")]
internal extern static int mciSendString(string s1, StringBuilder s2, int i1, int i2);
string filename = "";
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
if (dlg.ShowDialog() == DialogResult.OK)
{
filename = dlg.FileName;
mciSendString("open \"" + filename + "\" alias " + filename, null, 0, 0);
mciSendString("play " + filename + " from 0 notify", null, 0, (int)this.Handle);
};
}
protected override void WndProc(ref Message m)
{
const int MM_MCINOTIFY=0x3B9;
const int MCI_NOTIFY_SUCCESSFUL = 1;
if (m.Msg == MM_MCINOTIFY && (int)m.WParam == MCI_NOTIFY_SUCCESSFUL)
{
StringBuilder sb = new StringBuilder(32);
mciSendString("status " + filename + " mode", sb, sb.Capacity, 0);
label2.Text = sb.ToString();
}
base.WndProc(ref m);
}
|