2013-06-04 87 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

这引发了我一个错误:错误“System.Windows.Forms.KeyEventArgs”不包含“IsRepeat”的定义 – Joscplan

+0

plz帮助我解决这个错误。 – 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