如何在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