스캐너 제품 ID 및 공급 업체 ID는 알려지지 않은 동안 USB 바코드 스캐너와 키보드 데이터 입력을 무시하는 바코드를 사용하여 바코드 읽기
-
03-07-2019 - |
문제
키보드를 무시하고 USB 스캐너의 PID 또는 VID를 모르는 동안 USB 바코드 리더에서 읽을 수있는 방법이 있습니까? USB 스캐너의 VID 및 또는 PID를 사용하여 USB 스캐너 입력과 키보드 입력을 구별하는 방법이 있다는 것을 알고 있습니다. 이것은 코드를 사용하여 수행되었습니다 http://nicholas.piasecki.name/blog/2009/02/distinguishing-barcode-scanners-from-theyboard-in-winforms/그러나 스캐너의 VID 또는 PID를 구성 파일 (또는 소스 코드)에 넣지 않고 키보드와 USB 스캐너를 구별하는 또 다른 솔루션이 있습니까? 구성 파일에 다양한 VID 또는 PID를 넣고 싶지 않은 이유는 개발중인 애플리케이션이 수많은 랩탑에 배포되고 임의의 유형의 스캐너가 첨부되어 있기 때문입니다.
또한 스캐너가 같은 컴퓨터의 다른 소프트웨어에서도 스캐너를 사용하고 있으며 코드를 변경하고 싶지 않기 때문에 스캐너를 출력 및 또는 종료 시퀀스로 구성하고 싶지 않습니다. 다른 소프트웨어에서. 바코드 리더를 앞에서 언급 한 것과 같은 이유로 바코드 리더를 일련의 모드로 프로그래밍하고 싶지 않습니다.
해결책
키보드와 USB 바코드 리더를 구별하는 방법이 있습니다.
당신은 다음과 같은 사실에 의존 할 수 있습니다.
- Minmum 4 문자로 바코드 리더가 스캔 한 코드
- Barcode Reader가 스캔 한 코드는 "Enter"리턴으로 끝납니다.
- 구멍 바코드를 스캔하는 데 50ms 초 미만이 소요됩니다.
이것은 vs2005 vb를 사용하는 간단한 형태입니다.
- 텍스트 박스 1
- TextBox2
- TextBox3
- 버튼 1
- 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;
}
}
}
}
바코드에 대한 또 다른 질문이 있습니다 여기, 링크는 직렬 포트를 통해 바코드를 사용하는 답변으로 보냅니다. 어쩌면 그것은 당신을위한 해결책일까요?
IMHO : 가장 쉬운 솔루션은 키보드에서 입력을 수락하는 것입니다.
아마도 이것은 지나치게 단순화 된 솔루션이지만 키 프레스 이벤트를 캡처하고 키보드를 통한 입력을 방지 할 수 있습니까?