如何使用Windows窗体在C#中刷新键盘缓冲区?
我有条形码扫描仪,就像键盘一样。如果扫描了一个非常长的条形码并在表单上点击取消按钮,我需要清除键盘缓冲区。所以我需要刷新并忽略所有挂起的输入。我需要清除缓冲区,因为如果条形码包含空格,则空格将被处理为按钮点击,这是不必要的。
答案 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.Handled
或KeyPress
中将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