قراءة رمز باركي باستخدام ماسح ضوئي باركود USB جنبًا

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

  •  03-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة للقراءة من قارئ الباركود USB أثناء تجاهل لوحة المفاتيح وعدم معرفة PID أو vid من ماسحة USB؟ أعلم أن هناك طريقة للتمييز بين إدخال ماسحة USB وإدخال لوحة المفاتيح باستخدام VID و OR PID من ماسحة USB ؛ تم ذلك باستخدام الكود من http://nicholas.piasecki.name/blog/2009/02/distinguishing-barcode-scanners-from-the-keyboard-in-winforms/ولكن هل هناك حل آخر للتمييز بين لوحة المفاتيح والماسح الضوئي USB دون وضع VID الماسح الضوئي أو PID في ملف التكوين (أو التعليمات البرمجية المصدر)؟ السبب لعدم الرغبة في وضع العديد من فيدس أو PIDs في ملف التكوين هو أنه سيتم نشر التطبيق الذي يتم تطويره على العديد من أجهزة الكمبيوتر المحمولة وله أنواع تعسفية من الماسحات الضوئية المرتبطة بها.

أيضًا ، لا أريد تكوين الماسح الضوئي بسلسلة بدء وإنهاء سيتم إخراجها ، حيث يتم استخدام الماسح الضوئي من قبل البرامج الأخرى على نفس الجهاز أيضًا ولا أريد تغيير الرمز على البرنامج الآخر. لا أرغب في برمجة قارئ الباركود ليكون في الوضع التسلسلي إما لنفس السبب المذكور سابقًا.

هل كانت مفيدة؟

المحلول

هناك طريقة للتمييز بين لوحة المفاتيح وقارئ الباركود USB

يمكنك الاعتماد على هذه الحقائق:

  1. الكود الذي تم مسحه ضوئيًا بواسطة قارئ الباركود بأحرف Minmum 4
  2. ينتهي الرمز الممسوح بواسطة قارئ الباركود مع الإرجاع "أدخل"
  3. يتطلب الأمر أقل من 50 ميللي ثانية لمسح الباركود الفتحة

هذا نموذج بسيط باستخدام VS2005 VB يحتوي على:

  1. TextBox1
  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: الحل الأكثر سهولة هو قبول المدخلات من لوحة المفاتيح.

ربما يكون هذا حلًا مبالغًا فيه ، ولكن هل يمكنك التقاط حدث Presss الرئيسي ومنع الدخول ببساطة عبر لوحة المفاتيح؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top