C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

MM_MCINOTIFY発生時のステータス


(過去ログ 55 を表示中)

[トピック内 1 記事 (1 - 1 表示)]  << 0 >>

■30831 / inTopicNo.1)  MM_MCINOTIFY発生時のステータス
  
□投稿者/ たる (1回)-(2009/01/07(Wed) 15:31:04)

分類:[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);
}

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -