0

ここに私のコードがあります:

        MediaPlayer player = new System.Windows.Media.MediaPlayer();

       bool playing = false;

        bool _bKeyIsDown = false;

        protected override void OnKeyDown(KeyEventArgs e)
        {
            if (_bKeyIsDown) return;
            _bKeyIsDown = true;
            // play sound;
            base.OnKeyDown(e);
        } 
        protected override void OnKeyUp(KeyEventArgs e) 
        { 
            base.OnKeyUp(e);
            _bKeyIsDown = false;
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.D1)
            {
                if (label5.Text == "Waiting 01.wav")
                {
                    MessageBox.Show("No beat loaded");
                    return;
                }
                    pictureBox6.Image = Form1.Properties.Resources.white_square_button;
                    try
                    {
                        playing = true;
                        player.Open(new Uri(label37.Text));
                        player.Volume = (double)trackBar4.Value / 100;
                        player.Play();
                    }
                    catch (FileNotFoundException)
                    {
                        MessageBox.Show("File has been moved." + "\n" + "Please relocate it now!");
                    }
            }
}

        private void Window_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.D1)
            {
                pictureBox6.Image = Form1.Properties.Resources.black_square_button;
                player1.Stop();
                player1.Close();
                playing = false;
            }

これにより、キーを押している間に音を鳴らすことができますが、問題は、そのキーを離して別のキーを押すと音が遅れ、2 つのキーを同時に押すと最初に押したキーしか再生されないことです。

削除する(_bKeyIsDown) return;とうまくいきますが、サウンドは完全に再生されません。

この問題を解決する方法はありますか? ありがとう!

4

1 に答える 1

0

1 つのサウンドを再生して停止するだけの場合は、KeyDown イベントを実行し、bool を使用して切り替えます。

        bool playing = false;
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.D1)
            {
                if (!playing)
                {

                    player.Open(new Uri(yourURI));
                    player.Play();
                    playing = true;
                }
                else
                {
                    player.Stop();
                    playing = false;
                }
            }
        }

編集:

次に、必要なすべての音を含む辞書を次のように作成することをお勧めします。

        Dictionary<Keys, Uri> sounds = new Dictionary<Keys, Uri>()
        {
            {Keys.A,new Uri(@"C:\..\..\youraudiofile.mp3")},
            {Keys.B,new Uri(@"C:\..\yourotheraudiofile.wma")}
        };

メディアプレーヤーへの参照を保持するリストを作成します。

List<MediaPlayer> myplayers = new List<MediaPlayer>();

次に、KeyDown イベントでのみ (onKeyDown を削除し、keyup も削除します):

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
               foreach (MediaPlayer m in myplayers)
               {
                  m.Stop();
               }
               return;
            }

            if (sounds.ContainsKey(e.KeyCode))
            {
                MediaPlayer mp = new MediaPlayer();
                mp.Open(sounds[e.KeyCode]);
                mp.Play();
            }
        }
于 2013-07-06T22:13:38.687 に答える