2013-06-04 5 views
1

У меня есть этот кусок кода:Невозможно воспроизвести полный звук

MediaPlayer player = new System.Windows.Media.MediaPlayer(); 
bool playing = false; 

private void Window_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.D1) 
    { 
     if (label5.Text == "Waiting 01.wav") 
     { 
      MessageBox.Show("No wav loaded"); 
      return; 
     } 
     pictureBox6.Image = Form1.Properties.Resources.white_square_button; 
     try 
     { 
      player.Open(new Uri(label37.Text)); 
      player.Volume = (double)trackBar4.Value/100; 
      playing = true; 
      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; 
     player.Stop(); 
     player.Close(); 
     playing = false; 
    } 
} 

Проблема заключается в том, что файл .wav не будет играть полный только часть его.

Он должен воспроизводиться в полном объеме, когда клавиша D1 нажата до тех пор, пока она не будет отпущена.

Что я делаю неправильно?

ответ

1

Событие KeyDown повторяется. Одно из решений состоит в том, чтобы просто сразу же вернуться, если это повторный ключ.

private void Window_KeyDown(object sender, KeyEventArgs e) 
{ 
    if(e.IsRepeat) return; 
    // ... 
+0

Он бросает мне ошибку: Ошибка \t \t 2 «System.Windows.Forms.KeyEventArgs» не содержит определение понятия «IsRepeat» – Joscplan

+0

плз помогите мне исправить эту ошибку. – Joscplan

+1

Какую версию CLR вы используете? e.IsRepeat работает корректно с CLR4.0, но не может быть в других средах. Основная идея заключается в том, что звук воспроизводится в ближайшее время, потому что повтор клавиш повторяется снова и снова, когда клавиша удерживается. Каждый раз, когда он начинает воспроизводить звук. Попробуйте добавить флаг, т. Е.: Bool _bKeyIsDown = false; protected override void OnKeyDown (KeyEventArgs e) { if (_bIsDown) return; _bIsDown = true; // воспроизведение звука; base.OnKeyDown (e); } защищенная переопределенная пустота OnKeyUp (KeyEventArgs e) { base.OnKeyUp (e); _bIsDown = false; } – SpeedCoder5

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