2009-06-10 234 views
6

如何在C#中使用Windows窗體刷新鍵盤緩衝區?C#或.NET刷新鍵盤緩衝區

我有一個條形碼掃描器,就像一個鍵盤。如果掃描一個非常長的條形碼,並在表單上點擊取消按鈕,我需要清除鍵盤緩衝區。所以我需要刷新並忽略所有待處理的輸入。我需要清除緩衝區,因爲如果條形碼包含空格,則會將空間處理爲不必要的按鈕單擊。

+0

你是什麼意思的鍵盤緩衝區?你想刷新並忽略所有尚未處理的待處理輸入嗎? – Michael 2009-06-10 20:55:49

回答

1

我不知道你能做到這一點。擊鍵進入主事件循環的事件隊列。在擊鍵後,您取消這些擊鍵操作的任何操作都將放入隊列中。

事件循環只會在按鍵處理完成後進入取消操作。您只能根據按鍵序列中間發生的某些事件取消擊鍵。

2

設置KeyPreview形式true,然後趕上KeyPress事件,並e.Handledtrue如果被點擊取消。

編輯:抓住窗體的 KeyPress事件

0

可能做BIOS級別沖洗(http://support.microsoft.com/?scid=kb%3Ben-us%3B43993&x=22&y=10),但我會建議對這種低水平的做法,因爲Windows還確實上了一個臺階鍵盤緩衝。

最好的辦法似乎是在設置特定標誌時吃任何到達的字符。由於SLaks建議我將KeyPreview設置爲true,並將e.Handled設置爲true,或者在KeyPressKeyDown之間。應該沒有區別。

2

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

1

@克里斯:

Console.KeyAvailable對我拋出一個異常,因爲控制檯沒有焦點。

雖然這個異常消息很有幫助。它建議使用Console.In.Peek()來閱讀那個例子。

我認爲在這裏值得注意的是作爲替代解決方案和後代。

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

禁用表單,並在DoEvents禁用時強制執行所有處理。控件應該拒絕任何鍵擊,因爲它們被禁用。 然後重新啓用表單。

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

這是一個老問題,但我得到了同樣的問題,我找到了一個好辦法做到這一點...
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