USBバーコードスキャナーを使用して、スキャナーの製品IDとベンダーIDが不明なときにキーボードデータ入力を無視してバーコードを読み取る

StackOverflow https://stackoverflow.com/questions/615036

  •  03-07-2019
  •  | 
  •  

質問

キーボードを無視し、USBスキャナーのPIDまたはVIDを知らずに、USBバーコードリーダーから読み取る方法はありますか? USBスキャナーのVIDまたはPIDを使用して、USBスキャナー入力とキーボード入力を区別する方法があることを知っています。これは、のコードを使用して行われましたhttp://nicholas.piasecki.name/blog/2009/02/distinguishing-barcode-scanners-from-the-keyboard-in-winforms/ しかし、スキャナーのVIDまたはPIDを構成ファイル(またはソースコード)に入れずにキーボードとUSBスキャナーを区別する別のソリューションはありますか?構成ファイルにさまざまなVIDまたはPIDを入れたくない理由は、開発中のアプリケーションが多数のラップトップに展開され、任意のタイプのスキャナーが接続されるためです。

また、スキャナーは同じマシン上の他のソフトウェアでも使用されているため、出力する開始シーケンスまたは終了シーケンスでスキャナーを構成したくありません。他のソフトウェアのコードを変更します。前述の理由と同じ理由で、バーコードリーダーをシリアルモードにプログラムしたくありません。

役に立ちましたか?

解決

キーボードとUSBバーコードリーダーを区別する方法があります

これらの事実に依存できます:

  1. バーコードリーダーで最小4文字でスキャンされたコード
  2. バーコードリーダーでスキャンされたコードは、RETURN" ENTER"で終了します
  3. ホールバーコードのスキャンにかかる時間は50ミリ秒未満

これは、VS2005 VBを使用した単純なフォームです。

  1. textbox1
  2. textbox2
  3. textbox3
  4. Button1
  5. Timer1" 50に設定された時間間隔" ms"

Public Class Form1

Dim BarcodeStr As String = ""
Dim IsBarcodeTaken As Boolean = False
Dim Str As String = ""
Dim str3 As String = ""


Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown

    If Timer1.Enabled = False Then
        Str = TextBox1.Text
        str3 = TextBox3.Text
    End If

End Sub

Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
    If Timer1.Enabled = False Then
        Timer1.Enabled = True
    End If


    BarcodeStr = BarcodeStr & e.KeyChar
    If Asc(e.KeyChar) = 13 And Len(BarcodeStr) >= 4 Then
        IsBarcodeTaken = True
        TextBox2.Text = BarcodeStr


    End If

End Sub
Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
    If IsBarcodeTaken = True Then
        TextBox1.Text = Str
        TextBox1.Select(Len(TextBox1.Text), 0)
        Str = ""

        TextBox3.Text = str3
        TextBox3.Select(Len(TextBox3.Text), 0)
        str3 = ""
    End If

End Sub


Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    BarcodeStr = ""
    IsBarcodeTaken = False
    Timer1.Enabled = False
End Sub


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    TextBox2.Text = ""

End Sub

End Class

他のヒント

まあ、私はEhabのようなソリューションを使用しています。アプリケーション用にコードを少しクリーンアップしました。エディットコントロールにカスタムクラスを使用しています(他のことも行っています)-しかし、これらは重要な部分です:#

    public class ScannerTextBox : TextBox
    {
        public bool BarcodeOnly { get; set; }

        Timer timer;

        private void InitializeComponent()
        {
            this.SuspendLayout();

            this.ResumeLayout(false);
        }

        void timer_Tick(object sender, EventArgs e)
        {
            if (BarcodeOnly == true)
            {
                Text = "";
            }

            timer.Enabled = false;
        }


        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            base.OnKeyPress(e);

            if (BarcodeOnly == true)
            {
                if (timer == null)
                {
                    timer = new Timer();
                    timer.Interval = 200;
                    timer.Tick += new EventHandler(timer_Tick);
                    timer.Enabled = false;
                }
                timer.Enabled = true;
            }

            if (e.KeyChar == '\r')
            {
                if (BarcodeOnly == true && timer != null)
                {
                    timer.Enabled = false;
                }
            }
        }
    }

バーコードに関する別の質問がありますこちらでは、シリアルポート経由でバーコードを使用する回答にリンクが送信されます。たぶんそれはあなたのための解決策ですか?

私見:最も簡単な解決策は、キーボードからの入力を受け付けることです。

これは単純化されたソリューションかもしれませんが、キー押下イベントをキャプチャして、キーボードからの入力を単純に防止できますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top