KeyDown and KeyUp Multiple

本文关键字:Multiple KeyUp and KeyDown | 更新日期: 2023-09-27 18:04:01

我正在创建C Sharp钢琴,目前我有键盘键播放声音。例如,A键播放音符c,我遇到的问题是我想同时按多个键并发出声音。显然,我不想把所有的组合在keyDown类,因为我将不得不做出成千上万的if语句。还有别的办法吗?

KeyDown and KeyUp Multiple

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键向下方法:

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

你可以试试这个,希望对你有帮助