2009-03-05 24 views
11

कीबोर्ड को अनदेखा करते समय यूएसबी बारकोड रीडर से पढ़ने का कोई तरीका है और पीआईडी ​​या वीआईडी ​​को नहीं जानते यूएसबी स्कैनर? मुझे पता है कि यूएसबी स्कैनर के वीआईडी ​​और पीआईडी ​​का उपयोग कर यूएसबी स्कैनर इनपुट और कीबोर्ड इनपुट के बीच अंतर करने का एक तरीका है; यह http://nicholas.piasecki.name/blog/2009/02/distinguishing-barcode-scanners-from-the-keyboard-in-winforms/ से कोड का उपयोग करके किया गया था लेकिन क्या स्कैनर के वीआईडी ​​या पीआईडी ​​को कॉन्फ़िगरेशन फ़ाइल (या स्रोत कोड) में डाले बिना कीबोर्ड और यूएसबी स्कैनर के बीच अंतर करने का कोई और समाधान है? कॉन्फ़िगरेशन फ़ाइल में विभिन्न वीआईडी ​​या पीआईडी ​​डालने की इच्छा न करने का कारण यह है कि, विकसित होने वाले एप्लिकेशन को कई लैपटॉप पर तैनात किया जाएगा और उनके साथ जुड़े अनियंत्रित प्रकार के स्कैनर होंगे।स्कैनर उत्पाद आईडी और विक्रेता आईडी को ज्ञात नहीं करते हुए यूएसबी बारकोड स्कैनर का उपयोग करके एक बारकोड पढ़ना

इसके अलावा, मैं स्कैनर को प्रारंभिक और समापन अनुक्रम के साथ कॉन्फ़िगर नहीं करना चाहता हूं, जिसे स्कैनर का उपयोग उसी मशीन पर अन्य सॉफ़्टवेयर द्वारा भी किया जा रहा है और मैं नहीं चाहता अन्य सॉफ्टवेयर पर कोड बदलने के लिए। मैं बारकोड रीडर को धारावाहिक मोड में या तो पहले उल्लेख किए गए कारण के लिए प्रोग्राम नहीं करना चाहता हूं।

उत्तर

13

वहाँ कीबोर्ड और यूएसबी बारकोड रीडर के बीच अंतर करने के लिए एक रास्ता है

आप इन तथ्यों पर निर्भर कर सकते हैं:

  1. कोड minmum 4 अक्षर में बारकोड रीडर द्वारा स्कैन
  2. कोड द्वारा स्कैन बारकोड रीडर रिटर्न "ENTER" के साथ समाप्त होता है
  3. छेद बारकोड
स्कैन करने के लिए 50 से कम mseconds लेता है

यह एक सरल VS2005 वीबी का उपयोग कर प्रपत्र में शामिल किया गया है:

  1. textbox1
  2. TextBox2
  3. textbox3
  4. Button1
  5. Timer1 "समय अंतराल 50 करने के लिए सेट" एमएस "

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 
+0

चूंकि मेरे पास अभी तक अन्य लोगों की पोस्ट को संपादित करने के लिए पर्याप्त प्रतिनिधि नहीं हैं, इसलिए बस मुझे आपके लिए इसका अनुवाद करने दें: "मान लें कि स्कैनर कम से कम चार वर्ण दर्ज करेगा, एक एंटर कीप्रेस के साथ समाप्त होगा, और ऐसा करने के लिए 50ms से कम ले जाएगा।" यह मेरे लिए एक अच्छा विचार की तरह लगता है, लेकिन शायद आपको इसके बजाय 100ms समय बनाना चाहिए। – MiffTheFox

+0

मुझे डर है, यह गलत है। आप ** ** बता सकते हैं कि [रॉ इनपुट] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645536.aspx) का उपयोग कर कौन सा डिवाइस इनपुट इनपुट करता है। आपको वीआईडी ​​और पीआईडी ​​को या तो जानने की जरूरत नहीं है, क्योंकि यूएसबी स्कैनर ने * UsagePage * और * उपयोग * प्रविष्टियों को समर्पित किया है। – IInspectable

0

बारकोड here के बारे में एक और सवाल है, लिंक आपको एक ऐसे उत्तर में भेज देगा जो एक धारावाहिक बंदरगाह के माध्यम से बारकोड का उपयोग करता है। शायद यह आपके लिए एक समाधान है?

आईएमएचओ: सबसे आसान समाधान कीबोर्ड से इनपुट स्वीकार करेगा।

+0

इसके अलावा, मैं स्कैनर कॉन्फ़िगर करने के लिए होने के लिए नहीं करना चाहते हैं सीरियल मोड, क्योंकि स्कैनर का इस्तेमाल उसी सॉफ़्टवेयर पर अन्य सॉफ़्टवेयर द्वारा भी किया जा रहा है और मैं दूसरे सॉफ़्टवेयर पर कोड बदलना नहीं चाहता हूं। –

0

शायद यह एक अतिसंवेदनशील समाधान है, लेकिन क्या आप कुंजी प्रेस ईवेंट को कैप्चर कर सकते हैं और कीबोर्ड के माध्यम से प्रविष्टि को रोक सकते हैं?

+1

एक स्कैनर एक कीबोर्ड है, इसलिए एक कुंजी प्रेस को अवरुद्ध करने से स्कैनर को भी अवरुद्ध कर दिया जाएगा। –

3

ठीक है, मैं एक समाधान का उपयोग कर रहा हूं जैसे कि एहाब से - मैंने बस अपने आवेदन के लिए कोड को थोड़ा सा साफ़ किया है। मैं अपने संपादन नियंत्रण के लिए एक कस्टम वर्ग का उपयोग कर रहा है (यह कुछ अन्य बातों के भी कर रहा है) - लेकिन इन इस के लिए महत्वपूर्ण हिस्से हैं: #

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; 
       } 
      } 
     } 
    } 
संबंधित मुद्दे