1

私は、ユーザーがプログラムで再生する WAV サウンドを選択できるようにするこの機能を備えたプログラムに取り組んできました。

この機能はオプション ダイアログに配置されているため、次のようにしたかったのです。

1) ボタンをクリックします

2) ボタンで画像が A から B に変わり、音声が再生されます

a) ユーザーが音が気に入らず、停止したい - もう一度クリックして 3) に進む

3) 音声が終わり、映像が A に戻る。

私の主な目的は、ユーザーがいつでもサウンドを中断できるようにすることです (ステップ 2 a)。

私は2つの方法を試しました:

Dim p as New Media.SoundPlayer

p.SoundLocation = fn 'Where fn is the FileName, the WAV location
p.Play

p.Stream.Length と p.Stream.Position を使用しようとしても、実際には null であったため、エラーが返されます。 't (Stream で表される WAV で My.Computer.Audio.Play を試しました) これらのプロパティは、サウンドが停止する前でも同じ値でした。

この後、私は試しました:

My.Computer.Audio.Play(fn,AudioPlayMode.WaitToComplete)

しかし、私が推測したように、サウンドが終了するまでプログラムがフリーズし、ユーザーがそれを中断したり、何もすることができなくなります。

幸いなことに、System.Media.SoundPlayer では、次のようにイベントで宣言できます。

Private WithEvents p as System.Media.SoundPlayer

とはいえ、これらのイベントはどれも、必要なことを行うのに役立ちません。

助言がありますか?前もって感謝します

4

1 に答える 1

0

WAV ファイルの再生が完了したことを通知しながら、WAV ファイルの再生キャンセルを可能にする mciSendString() API を使用したソリューションを次に示します。

Imports System.Runtime.InteropServices
Public Class Form1

    Private PlayingWav As Boolean = False
    Private Const MM_MCINOTIFY As Integer = 953

    <DllImport("winmm.dll")> _
    Private Shared Function mciSendString( _
        ByVal command As String, _
        ByVal buffer As System.Text.StringBuilder, _
        ByVal bufferSize As Integer, _
        ByVal hwndCallback As IntPtr _
        ) As Integer
    End Function

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        If Not PlayingWav Then
            PlayWavFile(TextBox1.Text)
        Else
            StopWavFile()
        End If
    End Sub

    Public Sub PlayWavFile(ByVal WavFilePath As String)
        Dim cmd As String = "open " & Chr(34) & WavFilePath & Chr(34) & " type waveaudio alias wav"
        If mciSendString(cmd, Nothing, 0, IntPtr.Zero) = 0 Then
            PlayingWav = True
            Button1.Text = "Stop"
            mciSendString("play wav notify", Nothing, 0, Me.Handle)
        Else
            MessageBox.Show(WavFilePath, "Error Loading Wav", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If
    End Sub

    Public Sub StopWavFile()
        mciSendString("close wav", Nothing, 0, IntPtr.Zero)
    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
            Case MM_MCINOTIFY
                WavStopped()

        End Select
        MyBase.WndProc(m)
    End Sub

    Private Sub WavStopped()
        PlayingWav = False
        Button1.Text = "Play"
    End Sub

End Class
于 2013-07-02T21:22:20.220 に答える