簡體   English   中英

C# 或 .NET 刷新鍵盤緩沖區

[英]C# or .NET Flushing Keyboard Buffer

如何使用 Windows 窗體在 C# 中刷新鍵盤緩沖區?

我有一個像鍵盤一樣的條形碼掃描儀。 如果掃描了一個非常長的條形碼並點擊了表單上的取消按鈕,我需要清除鍵盤緩沖區。 所以我需要刷新並忽略所有掛起的輸入。 我需要清除緩沖區,因為如果條形碼包含空格,則空格將作為不必要的按鈕點擊進行處理。

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

將 Form 上的KeyPreview設置為true ,然后捕獲KeyPress事件並在單擊取消時將e.Handled設置為true

編輯:捕獲表單的KeyPress 事件

@克里斯:

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 事件,但 _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

可以執行 BIOS 級別刷新( http://support.microsoft.com/?scid=kb%3Ben-us%3B43993&x=22&y=10 )但我建議不要使用這種低級別方法,因為 Windows 也會在更高級別上進行鍵盤緩沖等級。

最好的方法似乎是在設置特定標志時吃掉任何到達的字符。 正如 SLaks 建議我將KeyPreview設置為 true 並將e.Handled設置為 true 無論是在KeyPress還是在KeyDown .. 應該沒有區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM