C#或.NET清空键盘缓冲区

8

如何在使用Windows Forms的C#中清除键盘缓冲区?

我有一个像键盘一样工作的条形码扫描器。如果扫描一个非常长的条形码并且在表单上按下取消按钮,我需要清除键盘缓冲区。因此,我需要清除和忽略所有未处理的输入。我需要清除缓冲区,因为如果条形码包含空格,那么这些空格将被处理为按钮点击,这是不必要的。


键盘缓冲区是什么意思?您想清除并忽略所有未处理的挂起输入吗? - Michael
你为什么要这样做? - SLaks
是的...比如说我有一个像键盘一样的条码扫描器...如果扫描了一个非常长的条形码并在表单上点击取消按钮,我需要清除键盘缓冲区。因此,我需要清空并忽略所有未处理的输入。 - Amar Premsaran Patel
我需要清空缓冲区,因为如果条形码包含空格,则这些空格将被处理为按钮点击,这是不必要的。 - Amar Premsaran Patel
7个回答

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

2

将表单上的KeyPreview属性设置为true,然后捕获KeyPress事件,并在取消按钮被点击时将e.Handled设置为true

编辑:捕获表单的KeyPress事件。


1

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

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

1

@Chris:

Console.KeyAvailable 抛出异常,因为控制台没有获得焦点。

虽然异常消息很有帮助,但它建议使用 Console.In.Peek() 来读取该实例。

我认为这里提供一个备选方案并留给后人参考是值得的。

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

1

我不确定您是否能够这样做。键击会进入主事件循环的事件队列。您采取的任何取消这些按键的操作都将在按键之后放置在队列中。

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


0

可以 执行BIOS级别刷新http://support.microsoft.com/kb/43993,但我建议不采取这种低层方法,因为Windows也在更高的级别上进行键盘缓冲。

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


0

这是一个老问题,但我遇到了同样的问题,并找到了一个好的解决方法...
当调用Application.DoEvent()时,按键缓冲区会调用KeyPress事件,但_keypress被设置为false,因此它将跳过所有这些事件,之后_keypress返回true以准备另一个keypress事件!

public bool _keypress;
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (!_keypress)
    {
        _keypress = true;
        // instructions
    }
    Application.DoEvents();
    _keypress = false;
}

1
这不是C#代码,因此它不能回答这个问题。 - a0poster
@a0poster 我的错,已经完成! - BlinkSun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接