Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [VB.net] intercettare input da diversi device

    Buonasera a tutti.
    Vi faccio una domanda difficile (credo).
    Sto sviluppando un'applicazione che mi permetta di gestire un negozio, in tutte le sue funzioni.
    Nel caso in questione parlo della cassa, e mi piacerebbe poter sparare i codici a barre dal barcode reader usb attaccato al pc, gestire la transazione e poi mandarla in cassa per fare lo scontrino.

    Ora, si potrebbe mettere il focus su una textbox e far acquisire il barcode, però così non riuscirei a discriminare l'input da tastiera o quello da barcode.

    Volevo sapere se era possibile poter discriminare, in qualche modo, l'input in base a chi acquisisce l'input.

    Se l'input proviene da tastiera fai questo.
    se l'input proviene da dispositivo HID fai quest'altro.

    grazie!

  2. #2

  3. #3
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Non puoi discriminare perchè il lettore che usi è ad emulazione di tastiera, significa che dopo aver 'sparato' il codice letto, invia un carattere di controllo che equivale al tasto INVIO, che è appunto quello che fa l'operatore quando digita manualmente nella casella di testo.

    Una soluzione potrebbe essere quella di predisporre due TextBox diversi: uno per la tastiera ed uno per il lettore, ma in questo caso l'operatore dovrebbe sembre ricordarsi di scegliere quello giusto (la vedo una soluzione debole ed inaffidabile).

    Altrimenti NON devi utilizzare l'emulazione di tastiera, ma a questo punto ti complichi la vita non poco.
    Diverso sarebbe se tu usassi un lettore portatile previsto di 'culla' in cui l'operatore carica in sequenza tutti i codici degli articoli, poi inserisce il lettore nella culla e da questa vengono 'inviati' i codici al programma (ovvio che dovrai gestire il tutto con una apposita procedura).
    In questo caso saresti sicuro che i codici provengono dal lettore.

    A te la scelta.

  4. #4
    Utente di HTML.it L'avatar di Vinsent
    Registrato dal
    May 2011
    Messaggi
    314
    Concordo con Gibra. Comunque controlla il manuale o la pagina del produttore, visto che il lettore è usb magari ha un driver che può essere utilizzato...si sa mai...
    Oppure, se il lettore è programmabile e permette di aggiungere dei caratteri speciali come inizio e fine lettura potresti far qualcosa....
    Sempre sull' usb, se ricordo bene...dovrebbe essere una com emulata...quindi se riesci a metterti in ascolto su di essa e con un hook sulla tastiera penso che potresti risolvere.
    Ciao

  5. #5
    potrebbe essere un'idea valutare di analizzare non 'chi' invia ma 'cosa' viene inviato ?

    ciò che viene inviato dal lettore alla textbox, ha per caso caratteristiche diverse (facendone il parse) da una stringa inserita direttamente dall'utente ?

  6. #6
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,536
    Ciao!

    Secondo me hai detto bene... devi separare le due cose! ovvero una cosa è l'input da tastiera, e una cosa è il lettore in emulazione... come? semplice : tu sai che la digitazione da tastiera normalmente viene fatta premendo un tasto dopo l'altro ad una velocità media di 2-3 caratteri al secondo, nei casi più estremi si arriva a 6-7, forse 8, quindi? il lettore barcode in emulazione tastiera scrive tutti i caratteri entro poche frazioni di secondi (anche se comunque lo fa ovviamente una dopo l'altra). quindi sostanzialmente ti basta controllare il numero di caratteri digitati entro un tot di tempo per poter capire se la digitazione avviene tramite "essere umano" oppure tramite emulatore. Ovviamente per fare ciò ho paura che con gli eventi form non riesca perchè probabilmente poco performanti, quindi eccoti un esempio di come potresti fare :

    codice:
    public class BarCodeListener : IDisposable
        {
            bool Run { get; set; }
            public int TimeOutBarCode { get; set; }
            public string BarcodeEscape { get; set; }
            public int BarCodeLength { get; set; }
            bool enable = false;
            public bool Enable
            {
                get { return this.enable; }
                set
                {
                    if (value)
                    {
                        Stop();
                        Start();
                    }
                    else
                    {
                        Stop();
                    }
                    this.enable = value;
                }
            }
            KeyPressEventHandler keyPressEventHandler = null;
            BarCodeEventHandler barCodeEventHandler = null;
            StringBuilder sb = new StringBuilder();        
            bool TimerInUse = false;
            
            public BarCodeListener()
            {
                
            }
    
            void Start()
            {
                Thread t = new Thread(RunBarCode);
                Run = true;
                t.Start();
            }
    
            void Stop()
            {
                this.Run = false;
                TimerInUse = false;
            }
    
            void timerCode()
            {
                //while (TimerInUse)
                {
                    int time = 0;
                    int timeADD = 10;
                    while (time < this.TimeOutBarCode)
                    {
                        Thread.Sleep(timeADD);
                        time += timeADD;
                    }
                    string txt = sb.ToString();
                    if (txt.Length == BarCodeLength + 1 && txt.Contains(BarcodeEscape))
                    {
                        this.OnBarCodeEnter(txt);
                    }
                    sb.Remove(0, sb.Length);
                    
                    TimerInUse = false;
                }
            }
    
            void RunBarCode()
            {
                while (Run)
                {
                    for (int i = 1; i < Byte.MaxValue; i++)
                    {
                        if (GetAsyncKeyState(i) == Int16.MinValue + 1)
                        {
                            OnKeyPress(new KeyPressEventArgs(Control.ModifierKeys, i));
                            if (!TimerInUse)
                            {
                                TimerInUse = true;
                                Thread t2 = new Thread(timerCode);
                                t2.Start();
                            }
                            sb.Append(Convert.ToChar(i));
                        }
                    }
                    Thread.Sleep(5);
                }  
            }
    
            [DllImport("user32.dll")]
            public static extern int GetAsyncKeyState(int vKey);
    
            protected virtual void OnKeyPress(KeyPressEventArgs KeyPressInfo)
            {
                if (keyPressEventHandler != null)
                {
                    keyPressEventHandler(this, KeyPressInfo);
                }
            }
    
            protected virtual void OnBarCodeEnter(string BarCode)
            {
                if (barCodeEventHandler != null)
                {
                    barCodeEventHandler(this, BarCode);
                }
            }
    
            public delegate void KeyPressEventHandler
                  (object inputListener,
                  KeyPressEventArgs KeyPressInfo);
    
            public delegate void BarCodeEventHandler
                  (object inputListener,
                  string BarCode);
    
            public event KeyPressEventHandler KeyPress
            {
                add { this.keyPressEventHandler += value; }
                remove { this.keyPressEventHandler -= value; }
            }
    
            public event BarCodeEventHandler BarCodeEnter
            {
                add { this.barCodeEventHandler += value; }
                remove { this.barCodeEventHandler -= value; }
            }
    
            #region IDisposable Membri di
    
            public void Dispose()
            {
                this.Enable = false;
            }
    
            #endregion
        }
    
        public class KeyPressEventArgs : EventArgs
        {
            public KeyPressEventArgs(Keys ModifierKeys,
             int KeyCode)
            {
                this.ModifierKeys = ModifierKeys;
                this.KeyCode = KeyCode;
            }
            public readonly Keys ModifierKeys;
            public readonly int KeyCode;
        }
    A questo punto con questo codice, che inoltre rimane sempre attivo anche quando non sei sulla textbox o il form non ha il focus (almeno con la pistola che ho usato per provare va tranquillamente ma non dovrebbero esserci differenze), puoi rimanere in attesa di evento e farne quello che vuoi con il barcode rilevato, ad esempio scriverlo sulla textBox...

    ecco un esempio di come potresti utilizzarlo :

    codice:
    BarCodeListener barCode
    ..
    //imposti la lunghezza del barcode (qui 12) il carattere di escape ("\r") 
    //e il tempo massimo (qui 1000 = 1 sec.) che ci deve mettere per scrivere tutti i caratteri 
    barCode = new BarCodeListener() 
    { 
           BarCodeLength = 12, 
           BarcodeEscape = "\r",
           TimeOutBarCode = 1000 
    };
    
    barCode.BarCodeEnter += new BarCodeListener.BarCodeEventHandler(barCode_BarCodeEnter);
    
    barCode.Enable = true;
    ...
    
    void barCode_BarCodeEnter(object inputListener, string BarCode)
    {
           textBox.Text = BarCode;
    }
    
    ...
    
    public void Dispose()
    {
          barCode.Dispose();
    }
    spero ti sia utile...



    EDIT : in ogni caso, qualora l'operatore sia flash scrivendo sulla tastiera, puoi sempre attivare e disattivare l'oggetto BarCodeListener con .Enable = true/false;

  7. #7
    ottimo suggerimento.
    Stavo leggendo degli articoli su pos.net che sembrerebbe fare al caso mio.
    Intanto provo con questa soluzione, grazie ragazzi!

  8. #8
    eccoci qua. Un altra domanda.
    Facendo innumerevoli prove, ho scoperto che il mio barcode, prima di mandare in input il codice a barre, mandare un codice ascii che dovrebbe essere 0x02 e che viene interpretata come
    down leftctrl
    down b
    up leftctrl
    up b

    vorrei sapere, se possibile, come si può fare per cattuare questo codice ascii e poter quindi acquisire solo il codice a barre che mi interessa.
    grazie!

  9. #9
    Utente di HTML.it L'avatar di Vinsent
    Registrato dal
    May 2011
    Messaggi
    314
    Come avevo scritto...molto probabilmente il lettore è programmabile e puoi aggiungere dei caratteri di inizio/fine lettura. Fai un hook sulla tastiera e con un paio di IF te la cavi...
    Qui:
    http://msdn.microsoft.com/en-us/library/60ecse8t
    02 è indicato come STX (start text) e 03 come ETX (end text), se il lettore trasmette il primo penso sia in grado di trasmettere il secondo...sempre come ti avevo suggerito è bene leggere la documentazione fornita dal costruttore.
    In ogni caso penso che la soluzione di U235 sia migliore, se il lettore si guasta e ne prendi uno diverso sei vincolato nella scelta se non vuoi modificare il programma.
    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.