2009-07-15 1 views
0

C# 2008 SP1C# создание обратных вызовов завершено

Я использую следующий код для записи, воспроизведения и остановки записи. Все работает нормально. Тем не менее, я хотел бы добавить обратный вызов, который будет срабатывать при завершении воспроизведения.

Я P/Вызываю, используя библиотеку winmm.dll.

Большое спасибо за любой совет.

public partial class SoundTest : Form 
    { 
     const uint SND_ASYNC = 0x0001; 
     const uint SND_FILENAME = 0x00020000; 
     const uint SND_NODEFAULT = 0x0002; 

     [DllImport("winmm.dll")] 
     private static extern int mciSendString(string lpstrCommand, string lpstrReturnString, 
               int returnLength, int hwndCallBack); 

     [DllImport("winmm.dll")] 
     private static extern bool PlaySound(string pszsound, UIntPtr hmod, uint fdwSound); 

     public SoundTest() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      // Disable stop button 
      this.btnSaveStop.Enabled = false; 
     } 

     private void btnRecord_Click(object sender, EventArgs e) 
     { 
      // Disable play and record button 
      this.btnRecord.Enabled = false; 
      this.btnPlay.Enabled = false; 
      // Enable stop button 
      this.btnSaveStop.Enabled = true; 

      // Record from microphone 
      mciSendString("Open new Type waveaudio Alias recsound", "", 0, 0); 
      mciSendString("record recsound", "", 0, 0);  
     } 

     private void btnSaveStop_Click(object sender, EventArgs e) 
     { 
      // Enable play and record 
      this.btnRecord.Enabled = true; 
      this.btnPlay.Enabled = true; 
      // Disable Stop button 
      this.btnSaveStop.Enabled = false; 
      mciSendString("save recsound c:\\record.wav", "", 0, 0); 
      mciSendString("close recsound ", "", 0, 0); 
     } 

     private void btnPlay_Click(object sender, EventArgs e) 
     { 
      //// Diable record button while playing back 
      //this.btnRecord.Enabled = false; 
      PlaySound("c:\\record.wav", UIntPtr.Zero, SND_ASYNC | SND_FILENAME | SND_NODEFAULT); 
     } 
    } 

ответ

1

Насколько я могу сказать, единственный способ, которым Вы будете в состоянии сделать это, позвонив callbackfunction себя сразу же после вызова функции API PlaySound и передавая параметр SND_SYNC вместо SND_ASYNC.

private void btnPlay_Click(object sender, EventArgs e) 
{ 
    //// Disable record button while playing back 
    //this.btnRecord.Enabled = false; 
    PlaySound("c:\\record.wav", UIntPtr.Zero, SND_SYNC | SND_FILENAME | SND_NODEFAULT); 

    //write your callback code here 
} 
1

«Обратный вызов» из MCI на самом деле является сообщением Windows. Если вы передадите дескриптор вашей формы в качестве hwndcallback и переопределите WndProc, вы сможете обработать сообщение.

Дополнительная информация о WndProc here и 64-разрядная дружественная спецификация dllimport here.

 Смежные вопросы

  • Нет связанных вопросов^_^