繁体   English   中英

C# 或 .NET 刷新键盘缓冲区

[英]C# or .NET Flushing Keyboard Buffer

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

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

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

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

编辑:捕获表单的KeyPress 事件

@克里斯:

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

不过,异常消息很有帮助。 它建议使用Console.In.Peek()在该实例中读取。

我认为作为替代解决方案和后代,这里值得一提。

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

禁用表单,并在禁用时强制所有处理与 DoEvents 一起发生。 控件应拒绝任何按键操作,因为它们已被禁用。 然后重新启用表单。

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

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

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

这是一个老问题,但我遇到了同样的问题,我找到了一个很好的方法来做到这一点......
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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM