Windowsフォームを使用してC#でキーボードバッファをフラッシュするにはどうすればよいですか?
キーボードのように機能するバーコード スキャナーがあります。非常に長いバーコードがスキャンされ、フォームでキャンセル ボタンが押された場合、キーボード バッファーをクリアする必要があります。したがって、保留中のすべての入力をフラッシュして無視する必要があります。バーコードにスペースが含まれている場合、スペースは不要なボタンクリックとして処理されるため、バッファをクリアする必要があります。
while (Console.KeyAvailable) { Console.ReadKey(true); }
KeyPreview
フォームで に設定し、イベントをtrue
キャッチして、キャンセルがクリックされた場合に に設定します。KeyPress
e.Handled
true
EDIT :フォームのKeyPress イベントをキャッチします
@クリス:
Console.KeyAvailable
コンソールにフォーカスがなかったため、例外が発生しました。
ただし、例外メッセージは役に立ちました。Console.In.Peek()
そのインスタンスで読むために使用することを提案しました。
代替の解決策として、そして後世のために、ここで注目する価値があると思いました。
if (-1 < Console.In.Peek()) {
Console.In.ReadToEnd();
}
フォームを無効にし、無効にしている間に DoEvents ですべての処理を強制的に実行します。コントロールは無効になっているため、キーストロークを拒否する必要があります。その後、フォームを再度有効にします。
this.Enabled = false;
Application.DoEvents();
this.Enabled = true;
私はあなたがこれを行うことができるかどうかわからない。キーストロークは、メイン イベント ループのイベント キューに入ります。これらのキーストロークをキャンセルするために実行したアクションは、キーストロークの後にキューに入れられます。
イベント ループは、キーストロークが処理された後にのみキャンセル アクションに到達します。キーストローク シーケンスの途中で発生する何らかのイベントに基づいてのみ、キーストロークをキャンセルできます。
BIOS レベルのフラッシュ ( http://support.microsoft.com/?scid=kb%3Ben-us%3B43993&x=22&y=10 ) を行うこともできますが、Windows はより高いレベルでキーボードのバッファリングも行うため、この低レベルのアプローチにはお勧めできません。レベル。
最善の方法は、特定のフラグが設定されている間に到着したチャーを食べることです。SLaksが示唆するように、私はKeyPreview
trueに設定し、inまたはine.Handled
のいずれかでtrueに設定します..違いはありません。KeyPress
KeyDown