如何从陈旧的消息中清除键盘缓冲区

时间:2011-01-27 04:49:38

标签: winforms keyboard buffer flush

我的WinForms应用程序有一个按钮。此按钮具有加速键(例如Alt + L)。按下按钮时,我处理Click事件并禁用UI以防止进一步按钮单击,直到处理完成。但是,当使用键盘按下加速键时,这些键击会排队并在UI再次启用后立即处理。我不想要这个。我的问题是如何清除/刷新键盘缓冲区?

如果我使用KeyPress或KeyDown来吃这些字符,我不知道它们什么时候被收到。我只想抑制当我还在处理第一个Click事件时到达的旧/陈旧消息。

1 个答案:

答案 0 :(得分:3)

是的,确实你的问题理论与我和madmik3在上述评论交换中提出的理论一致。您的应用程序在UI线程上执行的工作量有效地阻止它处理其他事件,包括用户的击键。每当您的应用程序完成其耗时的前台任务时,这些都会排队等待以后执行。这些是现代先发制人的多任务操作系统的危险。当然,在没有发布您的实际代码的情况下,根据我们的经验,我或其他任何人所能做的最好的就是推测问题是什么。

快速检查确认实际情况确实如此,就是将Application.DoEvents投入处理循环。这将允许操作系统立即处理键击,这将因为按钮被禁用而全部失败。 (Click事件,无论是由鼠标还是键盘快捷键启动,都不会为Button属性设置为“False”的Enabled控件引发。)这是最接近你的'我会得到像“冲洗缓冲区”这样的东西。我怀疑你是否正在接受KeyDownKeyPress事件,直到任何长期任务完成之后。

如果这样可以解决问题,那么长期解决方案是生成一个新线程并执行您需要执行的任何处理,而不是在您的UI线程上执行。这将阻止您阻止UI线程,并且假设Button控件被正确禁用,导致击键被丢弃,因为他们“点击”的按钮处于不可点击状态。创建新线程的最简单方法是使用BackgroundWorker component。该文档包含一个很好的例子。