USBバーコードスキャナーを使用して、スキャナーの製品IDとベンダーIDが不明なときにキーボードデータ入力を無視してバーコードを読み取る
-
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バーコードリーダーを区別する方法があります
これらの事実に依存できます:
- バーコードリーダーで最小4文字でスキャンされたコード
- バーコードリーダーでスキャンされたコードは、RETURN" ENTER"で終了します
- ホールバーコードのスキャンにかかる時間は50ミリ秒未満
これは、VS2005 VBを使用した単純なフォームです。
- textbox1
- textbox2
- textbox3
- Button1
- 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;
}
}
}
}
バーコードに関する別の質問がありますこちらでは、シリアルポート経由でバーコードを使用する回答にリンクが送信されます。たぶんそれはあなたのための解決策ですか?
私見:最も簡単な解決策は、キーボードからの入力を受け付けることです。
これは単純化されたソリューションかもしれませんが、キー押下イベントをキャプチャして、キーボードからの入力を単純に防止できますか?