8

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

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

4

7 回答 7

5
while (Console.KeyAvailable) { Console.ReadKey(true); }
于 2010-10-01T16:38:18.787 回答
2

KeyPreview在 Form 上设置为true,然后捕获KeyPress事件并在单击取消时设置e.Handled为。true

编辑:捕捉表单的KeyPress 事件

于 2009-06-10T21:12:04.543 回答
1

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

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

于 2009-06-10T21:22:48.640 回答
1

@克里斯:

Console.KeyAvailable因为控制台没有焦点,所以向我抛出了异常。

不过,异常消息很有帮助。它建议Console.In.Peek()在这种情况下使用 to read。

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

 if (-1 < Console.In.Peek()) {
     Console.In.ReadToEnd();
 }
于 2010-12-03T16:30:24.950 回答
1

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

this.Enabled = false;
Application.DoEvents();
this.Enabled = true;
于 2011-09-27T07:00:55.023 回答
0

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

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

于 2009-06-10T21:47:38.607 回答
0

这是一个老问题,但我遇到了同样的问题,我找到了一个很好的方法......
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
于 2015-07-04T18:45:04.987 回答