KeyDown和KeyUp的多重性

5

我正在使用C Sharp创建一个钢琴,目前我已经有了可以播放音符的键盘按键。例如,按键A会播放音符C。我遇到的问题是,我希望能够同时按下多个键并且产生声音。显然,我不想在keyDown类中添加所有组合,因为这样我将不得不编写成千上万个if语句。有没有其他解决方法呢?

1个回答

2

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();
        }
    }

然后是 on key down 方法:

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

你可以尝试这个,希望有所帮助。

请问您能否给我展示一个代码示例?我在这部分真的被卡住了。谢谢。 - frz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接