c# - 如何编写一个函数来确定一个键是否按下并经过延迟?

标签 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)
    {
        stopWatch.Restart();
    }

    return timeElapsed && isKeyDown;
}

这很好用,但一次只能用一个键。例如,如果我想使用箭头键并进行对角线移动(同时按住向右和向下箭头键),它就不起作用。

我想到了一个解决方案,它涉及一个 Dictionary,它将 Keys 映射到 Stopwatches,但这似乎有点过于复杂。我是否遗漏了可以简化此任务的内容?

谢谢。

最佳答案

使用这个:

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

关于c# - 如何编写一个函数来确定一个键是否按下并经过延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13001598/

相关文章:

c# - 避免在另一个类中使用公共(public)方法?

c# - Razor 语法突出显示在带有 MVC 5 的 VS 2012 中不起作用

arrays - 在 angularfire 1.0.0 中通过唯一的 firebase id 获取项目

java - 我可以有一个没有键的非空 HashMap 吗?

ruby-on-rails - 是否可以使用 "eval"来定义一个函数(而不是每个函数一个)?

xslt - 是否可以计算 xslt 键中的项目数?

c# - YouTube视频上传/下载以及字幕/字幕文件

c# - 包装 Interop COM 对象时如何在 c# 中实现处置模式?

c++ - 重构:在 CLion 中移动 (F6) - 为什么它会这样工作?

ruby-on-rails - 类似 Rails 的数据库迁移?