C#-避免按钮按下/垃圾邮件延迟

本文关键字:延迟 按钮 C#- | 更新日期: 2023-09-27 18:22:48

如果我按下键盘键,key_Down事件会被触发一次,然后会有一秒钟的延迟,然后它会开始发送事件
我正在使用C#WinForms,这将是我的代码:

private void key_Down(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Key.A)
        {
            // Do Stuff
        }
    }

C#-避免按钮按下/垃圾邮件延迟

只响应事件一次,然后通过一个标志阻止处理程序"做事情",直到收到一个keyup。keyup事件将重置标志。

因此:

bool isAKeyDown = false;
private void key_Down(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Key.A && !isAKeyDown )
    {
        isAKeyDown = true;
        // Do Stuff
    }
}
private void key_Up(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Key.A)
    {
        isAKeyDown = false;
    }
}

这显然只涉及一把钥匙。您可以选择保留一堆标志,也许是在字典中,来标记许多键的状态。

因为处理程序是在UI线程上调用的,所以您不需要担心对处理程序中引用的变量的同步访问。

当您按住记事本中的某个键时,就会发生这种情况。有一个轻微的延迟,然后它添加了很多你正在按下的字符。

你可以使用不同的事件。。。按键事件可能更适合你。

您可以取消订阅活动,并在1秒后订阅回

 private void OnKeyDown(object sender, KeyEventArgs keyEventArgs)
    {
        this.KeyDown -= OnKeyDown;
        // Do Something
        Task.Delay(1000).ContinueWith(x => { this.KeyDown += OnKeyDown; });
    }

您可以为第一个事件存储DateTime值,并将其与每个后续事件的当前时间进行比较:

private DateTime? dateFirstEvent;
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (this.dateFirstEvent == null ||
        (this.dateFirstEvent != null && DateTime.Now.Subtract(this.dateFirstEvent.Value) > TimeSpan.FromSeconds(1)))
    {
        // Do stuff
        this.Text = DateTime.Now.Ticks.ToString();
    }
    if (this.dateFirstEvent == null)
    {
        this.dateFirstEvent = DateTime.Now;
    }
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    // Resets date
    this.dateFirstEvent = null;
}

没有定时器,没有任务,没有新线程,非常简单。