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
}
}
只响应事件一次,然后通过一个标志阻止处理程序"做事情",直到收到一个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;
}
没有定时器,没有任务,没有新线程,非常简单。