2009-06-10 223 views
6

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

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

+0

你是什么意思的键盘缓冲区?你想刷新并忽略所有尚未处理的待处理输入吗? – Michael 2009-06-10 20:55:49

回答

1

我不知道你能做到这一点。击键进入主事件循环的事件队列。在击键后,您取消这些击键操作的任何操作都将放入队列中。

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

2

设置KeyPreview形式true,然后赶上KeyPress事件,并e.Handledtrue如果被点击取消。

编辑:抓住窗体的 KeyPress事件

0

可能做BIOS级别冲洗(http://support.microsoft.com/?scid=kb%3Ben-us%3B43993&x=22&y=10),但我会建议对这种低水平的做法,因为Windows还确实上了一个台阶键盘缓冲。

最好的办法似乎是在设置特定标志时吃任何到达的字符。由于SLaks建议我将KeyPreview设置为true,并将e.Handled设置为true,或者在KeyPressKeyDown之间。应该没有区别。

2

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

1

@克里斯:

Console.KeyAvailable对我抛出一个异常,因为控制台没有焦点。

虽然这个异常消息很有帮助。它建议使用Console.In.Peek()来阅读那个例子。

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

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

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

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

这是一个老问题,但我得到了同样的问题,我找到了一个好办法做到这一点...
Application.DoEvent()被调用时,keystoke缓冲调用按键响应事件,但_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