如何在使用Windows Forms的C#中清除键盘缓冲区?
我有一个像键盘一样工作的条形码扫描器。如果扫描一个非常长的条形码并且在表单上按下取消按钮,我需要清除键盘缓冲区。因此,我需要清除和忽略所有未处理的输入。我需要清除缓冲区,因为如果条形码包含空格,那么这些空格将被处理为按钮点击,这是不必要的。
如何在使用Windows Forms的C#中清除键盘缓冲区?
我有一个像键盘一样工作的条形码扫描器。如果扫描一个非常长的条形码并且在表单上按下取消按钮,我需要清除键盘缓冲区。因此,我需要清除和忽略所有未处理的输入。我需要清除缓冲区,因为如果条形码包含空格,那么这些空格将被处理为按钮点击,这是不必要的。
while (Console.KeyAvailable) { Console.ReadKey(true); }
将表单上的KeyPreview
属性设置为true
,然后捕获KeyPress
事件,并在取消按钮被点击时将e.Handled
设置为true
。
编辑:捕获表单的KeyPress事件。
禁用表单,在它被禁用时强制执行所有处理过程,并使用DoEvents。控件应该拒绝任何按键,因为它们被禁用了。然后重新启用表单。
this.Enabled = false;
Application.DoEvents();
this.Enabled = true;
@Chris:
Console.KeyAvailable
抛出异常,因为控制台没有获得焦点。
虽然异常消息很有帮助,但它建议使用 Console.In.Peek()
来读取该实例。
我认为这里提供一个备选方案并留给后人参考是值得的。
if (-1 < Console.In.Peek()) {
Console.In.ReadToEnd();
}
我不确定您是否能够这样做。键击会进入主事件循环的事件队列。您采取的任何取消这些按键的操作都将在按键之后放置在队列中。
只有在处理完按键后,事件循环才会执行您的取消操作。您只能根据按键序列中发生的某个事件来取消按键。
你 可以 执行BIOS级别刷新http://support.microsoft.com/kb/43993,但我建议不采取这种低层方法,因为Windows也在更高的级别上进行键盘缓冲。
最好的方法似乎是在设置特定标志时吃掉到达的任何字符。正如SLaks所建议的,我会将KeyPreview
设置为true,并在KeyPress
或KeyDown
中将e.Handled
设置为true..应该没有区别。
这是一个老问题,但我遇到了同样的问题,并找到了一个好的解决方法...
当调用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;
}