C # создание обратных вызовов воспроизведение завершено - PullRequest
0 голосов
/ 15 июля 2009

C # 2008 SP1

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

Я использую P / Invoke, используя библиотеку 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);   
        }
    }

Ответы [ 2 ]

1 голос
/ 15 июля 2009

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

Здесь есть больше информации о WndProc здесь и 64-битной спецификации dllimport здесь .

1 голос
/ 15 июля 2009

Насколько я могу судить, единственный способ сделать это - это вызвать функцию обратного вызова самостоятельно после вызова функции PlaySound API и передачи Параметр 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...