C#或.NET Flushing键盘缓冲区

时间:2009-06-10 20:53:28

标签: c# keyboard buffer flush

如何使用Windows窗体在C#中刷新键盘缓冲区?

我有条形码扫描仪,就像键盘一样。如果扫描了一个非常长的条形码并在表单上点击取消按钮,我需要清除键盘缓冲区。所以我需要刷新并忽略所有挂起的输入。我需要清除缓冲区,因为如果条形码包含空格,则空格将被处理为按钮点击,这是不必要的。

7 个答案:

答案 0 :(得分:2)

将表单上的KeyPreview设置为true,然后抓住KeyPress事件,如果点击取消,则将e.Handled设置为true

编辑:抓住表格 KeyPress事件

答案 1 :(得分:2)

while(Console.KeyAvailable){Console.ReadKey(true); }

答案 2 :(得分:1)

我不确定你能做到这一点。键击进入主事件循环的事件队列。取消这些击键时所采取的任何操作都将在击键后放入队列中。

事件循环仅在处理完击键后才会进入取消操作。您只能根据击键序列中间发生的某些事件取消击键。

答案 3 :(得分:1)

@克里斯:

Console.KeyAvailable向我提出异常,因为控制台没有焦点。

但是,异常消息很有帮助。它建议使用Console.In.Peek()来读取该实例。

我认为值得注意的是这里作为替代解决方案和后人。

 if (-1 < Console.In.Peek()) {
     Console.In.ReadToEnd();
 }

答案 4 :(得分:1)

禁用表单,并在DoEvents被禁用时强制执行所有处理。控件应拒绝任何键盘因为它们被禁用。 然后重新启用表单。

this.Enabled = false;
Application.DoEvents();
this.Enabled = true;

答案 5 :(得分:0)

可以进行BIOS级别刷新(http://support.microsoft.com/?scid=kb%3Ben-us%3B43993&x=22&y=10),但我建议不要使用这种低级别的方法,因为Windows也会在更高级别上进行键盘缓冲。

最好的方法似乎是在设置特定标志时吃掉任何到达的字符。正如SLaks建议我将KeyPreview设置为true并在e.HandledKeyPress中将KeyDown设置为true。应该没有任何区别。

答案 6 :(得分:0)

这是一个老问题,但我遇到了同样的问题,我找到了一个很好的方法来做到这一点...... 当调用 Application.DoEvent()时,keystoke缓冲区调用KeyPress事件,但_keypress设置为false,因此它将跳过所有这些,之后_keypress返回true以准备好另一个按键事件!

Public _keypress As Boolean
Private Sub Form1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Form1.KeyPress
    If Not _keypress Then
        _keypress = True
        //instructions
    End If
    Application.DoEvents()
    _keypress = False
End Sub