如何在C#中使用Windows窗体刷新键盘缓冲区?C#或.NET刷新键盘缓冲区
我有一个条形码扫描器,就像一个键盘。如果扫描一个非常长的条形码,并在表单上点击取消按钮,我需要清除键盘缓冲区。所以我需要刷新并忽略所有待处理的输入。我需要清除缓冲区,因为如果条形码包含空格,则会将空间处理为不必要的按钮单击。
如何在C#中使用Windows窗体刷新键盘缓冲区?C#或.NET刷新键盘缓冲区
我有一个条形码扫描器,就像一个键盘。如果扫描一个非常长的条形码,并在表单上点击取消按钮,我需要清除键盘缓冲区。所以我需要刷新并忽略所有待处理的输入。我需要清除缓冲区,因为如果条形码包含空格,则会将空间处理为不必要的按钮单击。
我不知道你能做到这一点。击键进入主事件循环的事件队列。在击键后,您取消这些击键操作的任何操作都将放入队列中。
事件循环只会在按键处理完成后进入取消操作。您只能根据按键序列中间发生的某些事件取消击键。
设置KeyPreview
形式true
,然后赶上KeyPress
事件,并e.Handled
到true
如果被点击取消。
编辑:抓住窗体的 KeyPress事件
您可能做BIOS级别冲洗(http://support.microsoft.com/?scid=kb%3Ben-us%3B43993&x=22&y=10),但我会建议对这种低水平的做法,因为Windows还确实上了一个台阶键盘缓冲。
最好的办法似乎是在设置特定标志时吃任何到达的字符。由于SLaks建议我将KeyPreview
设置为true,并将e.Handled
设置为true,或者在KeyPress
或KeyDown
之间。应该没有区别。
while(Console.KeyAvailable){Console.ReadKey(true); }
@克里斯:
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设置为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
你是什么意思的键盘缓冲区?你想刷新并忽略所有尚未处理的待处理输入吗? – Michael 2009-06-10 20:55:49