C# 如何编写一个函数来确定某个键是否已关闭并传递了延迟?

C# 如何编写一个函数来确定某个键是否已关闭并传递了延迟?,c#,refactoring,key,stopwatch,C#,Refactoring,Key,Stopwatch,我现在有一个函数如下所示: public static bool IsKeyDownWithDelayPassed(Keys key, int delay) { bool timeElapsed = stopWatch.ElapsedMilliseconds > delay; bool isKeyDown = currentKeyboardState.IsKeyDown(key); if (timeElapsed && isKeyDown)

我现在有一个函数如下所示:

public static bool IsKeyDownWithDelayPassed(Keys key, int delay)
{
    bool timeElapsed = stopWatch.ElapsedMilliseconds > delay;

    bool isKeyDown = currentKeyboardState.IsKeyDown(key);

    if (timeElapsed && isKeyDown)
    {
        stopWatch.Restart();
    }

    return timeElapsed && isKeyDown;
}
这项功能非常有效,但一次只能使用一个键。例如,如果我想使用箭头键并进行对角线移动(同时按住向右和向下箭头键),则该操作无效

我想到了一个解决方案,它包括一个
字典
,它将
映射到
秒表
上,但这似乎有点过于复杂。我是否遗漏了一些可以简化此任务的内容

谢谢。

用这个:

Dictionary<Keys, DateTime> keytimes = new Dictionary<Keys, DateTime>();

public bool IsKeyDownWithDelayPassed(Keys key, long delay)
{
    if(!keytimes.Keys.Contains(key) || keytimes[key] == DateTime.MinValue)
        return false;
    long elapsed = DateTime.Now.Ticks - keytimes[key].Ticks;    
    return delay < elapsed;
}

private void KeyDownEvent(object sender, KeyEventArgs e)
{
    keytimes[e.KeyData] = DateTime.Now;
}

private void KeyUpEvent(object sender, KeyEventArgs e)
{
    keytimes[e.KeyData] = DateTime.MinValue;
}
Dictionary keytimes=newdictionary();
public bool IsKeyDownWithDelayPassed(按键、长延迟)
{
如果(!keytimes.Keys.Contains(key)| | keytimes[key]==DateTime.MinValue)
返回false;
长时间运行=DateTime.Now.Ticks-keytimes[key].Ticks;
返回延迟<经过时间;
}
私有void KeyDownEvent(对象发送方,KeyEventArgs e)
{
keytimes[e.KeyData]=DateTime.Now;
}
私有void KeyUpEvent(对象发送方,KeyEventArgs e)
{
keytimes[e.KeyData]=DateTime.MinValue;
}

您能提供更多关于您要做什么的信息吗?你不能使用keydown事件吗?@OskarKjellin:是的,但我想创建一个自定义函数,其行为与
keydown
相同,除了附加条件,即自上次该键返回true以来,任意延迟已经过去。我的意思是,你能不能先订阅这些事件,然后在向上/向下执行你的逻辑检查一下这篇文章的答案,返回
returndelay而不是?这将为您节省四行代码。@ChuckSavage谢谢,代码确实需要一些优化。