2

私のプログラムは既に正常に動作しています。TextBox を使用してバーコード スキャナーの入力をキャプチャします。私のプログラムの目的は、時間と出席の​​監視です。問題は、ユーザーがキーボードを使用して ID を入力できないようにすることです。これは、バーコード スキャナーとバーコード付きの ID が役に立たなくなるためです。

*すでにコンピューターからキーボードを取り外してみましたが、動作しましたが、要件としてキーボードを取り外してはなりません...

4

12 に答える 12

8

オプション1:

シリアル ポート (COM ポートで読み取られる raw シリアル デバイス) に接続されているバーコード スキャナーを取得します。ほとんどのバーコード スキャナーはキーボード ストロークをエミュレートするため、低レベルに移行せずに (次のオプションを参照)、バーコード スキャナーの入力とキーボード入力を直接区別する方法はありません (最後の更新を参照)。

シリアルポートに接続されたもの (または、シリアルポートはもはや一般的ではないため、USB 経由でエミュレートされたもの) を使用すると、入力がどこから来るかを完全に制御できます。

オプション 2:

時間ごとに入力された文字数をカウントします。バーコード スキャナーは、タイピングに比べてかなり高速にシーケンス (行) を挿入します。キーを押した回数をカウントしてテキストボックスで使用された時間を測定すると (CR + LF もスキャナーから送信されるため、測定点として使用します)、人間が入力しているかどうかを判別する 1 つの方法が得られます (1 人が速く入力している場合を除きます)。 f) として、またはコンテンツが注入されました。タイムアウトした場合は、入力を拒否/クリアします。

さらに、バーコードのチェックサム (それを含むものを使用する場合) を使用して、時間測定に加えて追加の検証を行うことができます。

(次のオプションのように ctrl + v をオーバーライドすることで、貼り付けを検出できます)。

オプション 3:

オプション2を組み合わせますが、テキストボックスで測定する代わりに、ProcessCmdKey()関数を(オーバーライドして)タップし、テキストボックスにフォーカスがある場合はそこで測定します。このようにして、最初に入力をバッファリングし、時間を測定し、設定されたタイムアウト値内であれば、テキストボックスに行を挿入できます。

アップデート:

オプション 4:非技術的アプローチ -

使いやすさの向上: バーコードはタイプするのではなくスキャナーで入力する必要があることを視覚的に明確にします。シンプルで正解すれば有効でもあるので選択肢に入れておきます(残念ながら何が正解というわけではありません)。

アプローチには、f.exが含まれる可能性があります。テキストボックスの透かし(「入力しないで、スキャンしてください!」またはその順序で何か)。通常のテキストボックスと区別するために、別の色、境界線、サイズなどを指定し、ヘルプ テキストを関連付けていつでも利用できるようにして、明確さを向上させます。

于 2013-01-03T09:45:06.107 に答える
3

私は同じ問題を抱えていて、次のことをしました:

  1. int 変数 digitsPrevTyped = 0 を設定します

  2. テキストボックスの「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
    

    サブ終了

  3. 次に、「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 文字未満の場合、テキストは入力されています。それは非常に基本的ですが、私にとってはうまくいきます。

于 2013-05-08T06:12:59.820 に答える
1

もう 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
于 2013-01-03T08:27:52.723 に答える
0
If e.KeyCode = Keys.Enter And txt.Text.Length > 0 Then
    'To Do
Else
    'To Do
End if
于 2016-03-22T14:20:49.047 に答える
0

私のスキャナー入力はすべて「非表示」のテキストボックスに入り、入力に応じて必要に応じて表示されているものを埋めます。もちろん、これは、焦点がどこにあるかを追跡する必要があることを意味します。フォーカスを取得できる任意のタイプのコントロールは、これらのイベントで呼び出しを行い、その時点で「アクティブな」テキスト ボックス (通常は非表示のテキスト ボックス) にフォーカスを戻します。例えば...

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

他のほとんどのテキストボックスはデフォルトで無効になっており、特定の条件下でのみ有効になっています。そのエントリが完了すると、それらは無効になり、非表示のエントリが再びフォーカスされます。魅力のように機能します。

于 2016-10-11T14:24:04.160 に答える