Laden...

iMessageFilter zur Unterscheidung von USB Scanner und Tastatur

Erstellt von Fabian710 vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.335 Views
F
Fabian710 Themenstarter:in
42 Beiträge seit 2013
vor 10 Jahren
iMessageFilter zur Unterscheidung von USB Scanner und Tastatur

Hallo zusammen.
Ich habe ein Problem.
Habe ein USB Scanner und eine Tastatur.
Über beide sollen Eingaben erfolgen, allerdings beim Scanner andere Dinge durchgeführt werden.
Ich komme bei der Verarbeitung der imessage nicht voran. Kann mir jemand ein Tipp geben wie ich die da unterscheide?

Danke!!

T
708 Beiträge seit 2008
vor 10 Jahren

Hallo Fabian,

was bitte ist der iMessageFilter?
Soweit mir bekannt, funktionieren die allermeisten Scanner per USB wie eine Tastatur. Demnach kann man die Tastatureingabe genauso auslesen wie die des normalen Keyboards.
Ein Ansatz wäre daher, die Zeit der Eingabe bis zum mitsenden des abschließenden "Return" zu messen. Der Scanner macht das innerhalb von Millisekunden. Ein Mensch an der Tastatur benötigt natürlich deutlich länger.
Eine andere Alternative ist die Konfiguration des Scanners. Die meisten Modelle bieten eine Konfiguration mit Start- und Endzeichen an. Dann wird z.B. ein STX und ein ETX mitgesendet. So ist es natürlich ein einfaches die Eingaben von Tastatur und Scanner zu unterscheiden.

Gruß
trib

4.221 Beiträge seit 2005
vor 10 Jahren

Wir haben in einer einzigen Anwendung einen über die Tastatur geschleiften Scanner (ansonsten native).

Wir verlangen im Barcode Präfix und Suffix...

[vomScanner]

vonTastatur

So kannst Du das unterscheiden.

--> also im Prinzip eine der von trib vorgeschlagenen Methoden.

Funzt jeden Tag ohne Problems.

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

F
Fabian710 Themenstarter:in
42 Beiträge seit 2013
vor 10 Jahren

Ich möchte damit unterscheiden, ob die Eingabe vom Scanner oder von der Tastatur kommt. Er soll sie "nur" besonders beachten wenn sie vom Scanner kommt (Materialnummer wird eingescannt, darauf hin soll automatisch die Suche gestartet werden) die Eingabe mit der Tastatur soll an verschiedenen Stellen weiterhin ohne Probleme möglich sein. Ich hab da aber irgendwie immer noch eine totale Denkblockade.
Wie kann ich auf den Präfix und Suffix zugreifen und wie dann auf die eigentliche Message?

Dadurch, dass sobald ich in einer Textdatei den Barcode einscanne, zeig er mir dort ja sofort die richtige Nummer an. Aber irgendwie weiß ich einfach nicht, wie ich sie abfange und dann bearbeite...Sch*** Schlauch auf dem ich stehe 😦

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo Fabian710,

das Thema, wie man eine manuelle Eingabe von der eines Barcode-Scanners unterscheiden kann, wurde schon einige Male besprochen. Bitte benutze die Forumssuche und poste die besten Treffer hier. Vielen Dank!

herbivore

F
Fabian710 Themenstarter:in
42 Beiträge seit 2013
vor 10 Jahren

Ich habe lange gesucht doch nicht das passende gefunden.
Es klappt ja, dass wenn ich etwas einscanne, es in der Textbox steht.
Ich will aber, das man nicht auf der Tastatur rumklicken kann und dann alles direkt in der Textbox steht, sondern nur wenn diese ausgewählt ist.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo Fabian710,

wenn du unterscheiden kannst, von wo die Eingabe kommt, kannst du doch im TextChanged die Änderung rückgängig machen, wenn sie von der Tastatur kommt, das aber gerade nicht gewünscht ist. Im Grunde so ähnlich wie [FAQ] Event nur bei Benutzeraktion auslösen, nicht bei programmtechnischer Änderung, nur hier eben abhängig von der Quelle.

BTW: Wenn du lange gesucht hast, warum lässt du die anderen dann nicht daran teilhaben und postest die besten Treffer, worum ich dich gebeten hatte? "gemeinsam mehr erreichen" bedeutet eben auch, dass Hilfe keine Einbahnstraße ist und du deinen Teil beitragen solltest.

herbivore

F
Fabian710 Themenstarter:in
42 Beiträge seit 2013
vor 10 Jahren

Ich fange die Eingaben mit der IMessageFilter.PreFilterMessage(ref Message m) ab.
Dort soll dann zunächst überprüft werden, ob die Nachricht mit einem festgelegten Präfix beginnt, wenn ja, dann wird sie eingelesen und wenn er den abschließenden Suffix festellt, wird beendet. Leider funktioniert es nicht 😦
Präfix und Suffix bestehen jeweils aus drei hex-Werten....


 bool IMessageFilter.PreFilterMessage(ref Message m)
        {

            if (m.Msg == 0x0100)
            {
                char code = (char)m.WParam.ToInt32();
                if (_prefixcheck == false)
                {
                    if (code == d[counter])
                    {
                        if (counter < 2)
                        {
                            _prefixcheck = false;
                            counter++;
                            return true;
                        }
                        else if (d[counter] == (char)0x03)
                        {
                            _prefixcheck = true;
                            _scan = true;
                            return true;
                        }
                        else
                        {
                            _prefixcheck = true;
                            _scan = true;
                            return true;
                        } 
                    }
                }

                else if (_scan == true)
                {
                    uint scanCode = (uint)(((int)m.LParam >> 16) & 0xFF);
                    char c = (char)(m.WParam.ToInt32());

                    if (c == e[tempCounter])
                    {
                        if (tempCounter <= 1)
                        {
                            _dataTemp += c;
                            tempCounter++;
                            return true;
                        }
                        else if (tempCounter == 2)
                        {
                            _scan = false;
                            _dataTemp = string.Empty;
                            _suffixcheck = true;
                            return true;
                        }
                        return true;
                    }
                    else if (c != e[tempCounter] && _dataTemp != string.Empty)
                    {
                        tempCounter = 0;
                        _data += _dataTemp;
                        _dataTemp = string.Empty;
                        _data += c;
                        return true;
                    }
                    else
                    {
                        _data += c;
                        return true;

                    }
                }
                else if (_suffixcheck == true)
                {
                    _scan = false;
                    _prefixcheck = false;
                    _suffixcheck = false;
                    scan = _data;
                    _data = string.Empty;
                   MessageBox.Show(scan);

                }
                }
return false;
        }