如何使用 Windows 窗体刷新 C# 中的键盘缓冲区?
我有一个像键盘一样的条形码扫描仪。如果扫描了一个很长的条形码并且在表单上点击了取消按钮,我需要清除键盘缓冲区。所以我需要刷新并忽略所有待处理的输入。我需要清除缓冲区,因为如果条形码包含空格,则空格会被处理为按钮单击,这是不必要的。
while (Console.KeyAvailable) { Console.ReadKey(true); }
KeyPreview
在 Form 上设置为true
,然后捕获KeyPress
事件并在单击取消时设置e.Handled
为。true
编辑:捕捉表单的KeyPress 事件
我不确定你能做到这一点。击键进入主事件循环的事件队列。您为取消这些击键而采取的任何操作都将在击键后放入队列中。
只有在处理完击键后,事件循环才会执行您的取消操作。您只能根据击键序列中间发生的某些事件取消击键。
@克里斯:
Console.KeyAvailable
因为控制台没有焦点,所以向我抛出了异常。
不过,异常消息很有帮助。它建议Console.In.Peek()
在这种情况下使用 to read。
我认为在这里作为替代解决方案和后代值得注意。
if (-1 < Console.In.Peek()) {
Console.In.ReadToEnd();
}
禁用表单,并在禁用时强制使用 DoEvents 进行所有处理。控件应拒绝任何按键,因为它们已被禁用。然后重新启用表单。
this.Enabled = false;
Application.DoEvents();
this.Enabled = true;
您可以进行 BIOS 级别刷新(http://support.microsoft.com/?scid=kb%3Ben-us%3B43993&x=22&y=10)但我建议不要使用这种低级别方法,因为 Windows 也会在更高级别上进行键盘缓冲等级。
最好的方法似乎是在设置特定标志时吃掉任何到达的字符。正如 SLaks 建议的那样,我将设置KeyPreview
为 true 并在 ..或 in 中设置e.Handled
为 true应该没有区别。KeyPress
KeyDown
这是一个老问题,但我遇到了同样的问题,我找到了一个很好的方法......
当Application.DoEvent()被调用时,按键缓冲区调用 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