2013-03-15 106 views
4

我在C Sharp创建了一架钢琴,目前我有键盘按键可以播放声音。例如,键A弹奏音符C.我遇到的问题是在那里,我想同时按下多个键并将声音输出。显然,我不想将所有的组合放在keyDown类中,因为我将不得不制作数千个if语句。有没有办法解决?KeyDown和KeyUp Multiple

回答

1

Windows只能处理一个消息队列,所以每次只有一个按键消息将以时间单位处理。你可以做的是在很短的时间间隔内获得所有关键事件(例如0.5秒),将所有按键保存在列表或队列中,然后按照键(使用线程)异步播放所有声音。我从来没有这样做过,但我认为应该起作用。希望可以帮助...

编辑


好吧,让我们看到: 第一列表,其中保存键

List<Key> _keys = new List<Key>();

然后启动一个定时器用于检查钥匙按时间间隔按下:

 var t = new System.Timers.Timer(500); //you may try using an smaller value 
     t.Elapsed += t_Elapsed; 
     t.Start(); 

然后t_Elapsed方法(请注意,如果你是在WPF的DispatcherTimer应该使用,此计时器上System.Timers

void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     if (_keys.Count > 0) 
     { 
      //Here get all keys and play the sound using threads 
      _keys.Clear(); 
     } 
    } 

然后是关键down方法:

void OnKeyDownMethod(object sender, KeyPressedEventArgs e) //not sure this is the name of the EventArgs class 
{ 
    _keys.Add(e.Key); //need to check 
} 

您可能试试这个,希望有所帮助。

+0

如果你能告诉我一个示例代码,我就会陷入这个部分。亲切的问候 – frz 2013-03-15 17:40:05

+0

非常感谢很好的作品 – frz 2013-03-16 03:01:37

1

你可以看看这个link。它会帮助你解决你的查询。

还检查了该Thread

如果你正在考虑使用MIDI然后检查this出来。