스캐너 제품 ID 및 공급 업체 ID는 알려지지 않은 동안 USB 바코드 스캐너와 키보드 데이터 입력을 무시하는 바코드를 사용하여 바코드 읽기

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-theyboard-in-winforms/그러나 스캐너의 VID 또는 PID를 구성 파일 (또는 소스 코드)에 넣지 않고 키보드와 USB 스캐너를 구별하는 또 다른 솔루션이 있습니까? 구성 파일에 다양한 VID 또는 PID를 넣고 싶지 않은 이유는 개발중인 애플리케이션이 수많은 랩탑에 배포되고 임의의 유형의 스캐너가 첨부되어 있기 때문입니다.

또한 스캐너가 같은 컴퓨터의 다른 소프트웨어에서도 스캐너를 사용하고 있으며 코드를 변경하고 싶지 않기 때문에 스캐너를 출력 및 또는 종료 시퀀스로 구성하고 싶지 않습니다. 다른 소프트웨어에서. 바코드 리더를 앞에서 언급 한 것과 같은 이유로 바코드 리더를 일련의 모드로 프로그래밍하고 싶지 않습니다.

도움이 되었습니까?

해결책

키보드와 USB 바코드 리더를 구별하는 방법이 있습니다.

당신은 다음과 같은 사실에 의존 할 수 있습니다.

  1. Minmum 4 문자로 바코드 리더가 스캔 한 코드
  2. Barcode Reader가 스캔 한 코드는 "Enter"리턴으로 끝납니다.
  3. 구멍 바코드를 스캔하는 데 50ms 초 미만이 소요됩니다.

이것은 vs2005 vb를 사용하는 간단한 형태입니다.

  1. 텍스트 박스 1
  2. TextBox2
  3. TextBox3
  4. 버튼 1
  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;
                }
            }
        }
    }

바코드에 대한 또 다른 질문이 있습니다 여기, 링크는 직렬 포트를 통해 바코드를 사용하는 답변으로 보냅니다. 어쩌면 그것은 당신을위한 해결책일까요?

IMHO : 가장 쉬운 솔루션은 키보드에서 입력을 수락하는 것입니다.

아마도 이것은 지나치게 단순화 된 솔루션이지만 키 프레스 이벤트를 캡처하고 키보드를 통한 입력을 방지 할 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top