私のプログラムは既に正常に動作しています。TextBox を使用してバーコード スキャナーの入力をキャプチャします。私のプログラムの目的は、時間と出席の監視です。問題は、ユーザーがキーボードを使用して ID を入力できないようにすることです。これは、バーコード スキャナーとバーコード付きの ID が役に立たなくなるためです。
*すでにコンピューターからキーボードを取り外してみましたが、動作しましたが、要件としてキーボードを取り外してはなりません...
私のプログラムは既に正常に動作しています。TextBox を使用してバーコード スキャナーの入力をキャプチャします。私のプログラムの目的は、時間と出席の監視です。問題は、ユーザーがキーボードを使用して ID を入力できないようにすることです。これは、バーコード スキャナーとバーコード付きの ID が役に立たなくなるためです。
*すでにコンピューターからキーボードを取り外してみましたが、動作しましたが、要件としてキーボードを取り外してはなりません...
オプション1:
シリアル ポート (COM ポートで読み取られる raw シリアル デバイス) に接続されているバーコード スキャナーを取得します。ほとんどのバーコード スキャナーはキーボード ストロークをエミュレートするため、低レベルに移行せずに (次のオプションを参照)、バーコード スキャナーの入力とキーボード入力を直接区別する方法はありません (最後の更新を参照)。
シリアルポートに接続されたもの (または、シリアルポートはもはや一般的ではないため、USB 経由でエミュレートされたもの) を使用すると、入力がどこから来るかを完全に制御できます。
オプション 2:
時間ごとに入力された文字数をカウントします。バーコード スキャナーは、タイピングに比べてかなり高速にシーケンス (行) を挿入します。キーを押した回数をカウントしてテキストボックスで使用された時間を測定すると (CR + LF もスキャナーから送信されるため、測定点として使用します)、人間が入力しているかどうかを判別する 1 つの方法が得られます (1 人が速く入力している場合を除きます)。 f) として、またはコンテンツが注入されました。タイムアウトした場合は、入力を拒否/クリアします。
さらに、バーコードのチェックサム (それを含むものを使用する場合) を使用して、時間測定に加えて追加の検証を行うことができます。
(次のオプションのように ctrl + v をオーバーライドすることで、貼り付けを検出できます)。
オプション 3:
オプション2を組み合わせますが、テキストボックスで測定する代わりに、ProcessCmdKey()関数を(オーバーライドして)タップし、テキストボックスにフォーカスがある場合はそこで測定します。このようにして、最初に入力をバッファリングし、時間を測定し、設定されたタイムアウト値内であれば、テキストボックスに行を挿入できます。
アップデート:
オプション 4:非技術的アプローチ -
使いやすさの向上: バーコードはタイプするのではなくスキャナーで入力する必要があることを視覚的に明確にします。シンプルで正解すれば有効でもあるので選択肢に入れておきます(残念ながら何が正解というわけではありません)。
アプローチには、f.exが含まれる可能性があります。テキストボックスの透かし(「入力しないで、スキャンしてください!」またはその順序で何か)。通常のテキストボックスと区別するために、別の色、境界線、サイズなどを指定し、ヘルプ テキストを関連付けていつでも利用できるようにして、明確さを向上させます。
私は同じ問題を抱えていて、次のことをしました:
int 変数 digitsPrevTyped = 0 を設定します
テキストボックスの「TextChanged」イベントにこれを追加しました(テキストボックスの最大サイズは17文字です):
Private Sub tbxScannedText_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) tbxScannedText.TextChanged を処理します
If tbxScannedText.Text.Length >= 17 Then
SearchFunction(False)
Else
digitsPrevTyped = tbxScannedText.Text.Length
End If
サブ終了
次に、「SearchFunction」で次のことを確認します。
Dim inputMethod As Char
If tbxScannedText.TextLength = 17 And digitsPrevTyped = 0 Then
inputMethod = TEXT_SCANNED
Else
inputMethod = TEXT_MANUALLY_ENTERED
End If
テキストボックスの長さが最初は 0 文字で、現在は 17 文字になっている場合、テキストがスキャンされたことを意味します。以前に入力したテキストの長さが 17 文字未満の場合、テキストは入力されています。それは非常に基本的ですが、私にとってはうまくいきます。
もう 1 つの可能な回避策は、keypress イベントを処理してユーザー入力を制限することです。キーボードからの直接入力を許可せず、読み取り専用を false のままにします。
KeyPress イベントハンドラに以下を設定
Private Sub Textbox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Textbox1.KeyPress
e.Handled = True
End Sub
If e.KeyCode = Keys.Enter And txt.Text.Length > 0 Then
'To Do
Else
'To Do
End if
私のスキャナー入力はすべて「非表示」のテキストボックスに入り、入力に応じて必要に応じて表示されているものを埋めます。もちろん、これは、焦点がどこにあるかを追跡する必要があることを意味します。フォーカスを取得できる任意のタイプのコントロールは、これらのイベントで呼び出しを行い、その時点で「アクティブな」テキスト ボックス (通常は非表示のテキスト ボックス) にフォーカスを戻します。例えば...
Private Sub buttons_gotFocus(sender As System.Object, e As System.EventArgs) Handles btnPrint.GotFocus, btnInMVPageDown.GotFocus, btnAdv.GotFocus, btnManual.GotFocus, btnResend.GotFocus, dgvInbound.GotFocus, dgvOutbound.GotFocus, TCRole.GotFocus
Try
activeTextbox.Focus()
Catch ex As Exception
'ignore any errors
End Try
End Sub
他のほとんどのテキストボックスはデフォルトで無効になっており、特定の条件下でのみ有効になっています。そのエントリが完了すると、それらは無効になり、非表示のエントリが再びフォーカスされます。魅力のように機能します。