# Barcode Scanner einlesen



## MPC4ever (10. Jun 2011)

Hallo zusammen.
Gibt es eine Möglichkeit zu unterscheiden ob der Zahlenwert in dem JTextField von Barcodescanner kommt oder per Hand an der Tastatur eingegeben wurde.

Gruß, MPC4ever


----------



## Asgar13 (10. Jun 2011)

Würde mal sagen ja, wenn man auf jeder Taste(0-9) ein Event hast, was dir sagt, das diese/eine Taste gedrückt wurde.


----------



## Andi_CH (10. Jun 2011)

Ich hab genau dasselbe Problem - der Barcodescanner ist eine ganz gewöhnliche Tastatur.

Wie kann ich überhaupt Tastaturevents auswerten? (Nein, ich habe kein GUI - ich will auch gar keines haben, denn das ganze wird als Hintergrundprozess laufen und wo der Focus ist, ist aus Sicht des Programmes nicht definiert)

ach so nebenbei - der Barcodescanner liefert je nach Code auch Buchstaben ;-) also nicht nur 0-9


----------



## inv_zim (10. Jun 2011)

Vielleicht lässt sich der Unterschied über die Geschwindigkeit mit der eingegeben wird ausmachen? Von Hand wird niemand so schnell tippen wie ein Barcodescanner.


----------



## Andi_CH (10. Jun 2011)

Na na - wir basteln doch nicht. Schon mal die die Keyrepetionsrate gedacht?
Und daran, dass gleichzeitig jemand tippt und eine andere Person den Scanner betätigt?

Vorerst möchte ich überhaupt an die Werte kommen, auch wenn eine Applikation mit GUI im Vordergrund läuft, die eigentlich alle Tastaturevents schluckt.
Im Weiteren sollen diese Events vom Hintergrundprozess geschluckt werden, also gar nie bis zum laufenden Office oder was auch immer kommen.


----------



## Herr (13. Sep 2011)

Muss meinen Vorrednern Recht geben.

_________________________________
Barcodescanner


----------



## andy82 (13. Sep 2011)

Andi_CH hat gesagt.:


> Na na - wir basteln doch nicht. Schon mal die die Keyrepetionsrate gedacht?
> Und daran, dass gleichzeitig jemand tippt und eine andere Person den Scanner betätigt?
> 
> Vorerst möchte ich überhaupt an die Werte kommen, auch wenn eine Applikation mit GUI im Vordergrund läuft, die eigentlich alle Tastaturevents schluckt.
> Im Weiteren sollen diese Events vom Hintergrundprozess geschluckt werden, also gar nie bis zum laufenden Office oder was auch immer kommen.



Eine saubere Programmierung ist immer über Model, wenn es um die Daten geht. Das ist der Unterschied zwischen Swing und AWT. Jede Component in Swing gibt es immer eine entsprechende Model, in diesem Fall zu JTextField ist die PlainDocument. Das nennt man Programmierung nach MVC-Prinzip, also Trennung zwischen Daten(Daten-Steuerung) und Darstellung(View) der Daten
:rtfm:
Ein weitere Vorteil der Benutzung der PlainDocument. Nur bei Document lässt sich die Eingabe vorher kontrollieren, gegebenfalls manipullieren oder schwinden lassen, bevor überhaupt zum Erscheinen lassen oder nicht.


----------



## Andi_CH (14. Sep 2011)

andy82 hat gesagt.:


> Eine saubere Programmierung ist immer über Model, wenn es um die Daten geht. Das ist der Unterschied zwischen Swing und AWT. Jede Component in Swing gibt es immer eine entsprechende Model, in diesem Fall zu JTextField ist die PlainDocument. Das nennt man Programmierung nach MVC-Prinzip, also Trennung zwischen Daten(Daten-Steuerung) und Darstellung(View) der Daten
> :rtfm:
> Ein weitere Vorteil der Benutzung der PlainDocument. Nur bei Document lässt sich die Eingabe vorher kontrollieren, gegebenfalls manipullieren oder schwinden lassen, bevor überhaupt zum Erscheinen lassen oder nicht.



Eine *nicht* provokative Frage (ehrlich!) Ist deutsch nicht deine Muttersprache?
Ich verstehe nicht einmal die sprachliche Ebene und auch der Zusammenhang mit dem eigentlichen Problem fehlt total!

Also da steht ein PC und daran ist ein Scanner angeschlossen - Kollege 1 ist gerade daran ein Mail zu tippen wärend Kollege 2 etwas scannt.
Was nützt dem Kollegen 1 der Barcode in seinem Mail?

-> zu exotisch? nur ein Benutzer pro PC? ok ->

Der Mitarbeiter hat soeben eingetragen, dass er mit Arbeiten begonnen hat (ja, Arbeitszeiterfassung per PC ist hier üblich und das ist eine eigenständige Applikation)
Einige Zeit später beginnt er damit zu scannen -> wo landet denn das Resultat des Scans, wenn dummerweise vergessen wurde die Applikation in den Vordergrund zu klicken?

Es ist einfach ein bescheuertes System einen Scanner als Tastatur zu konfigurieren, aber es ist nun mal so.

Also gesucht ist immer noch eine Lösung (es muss definitiv nicht alles in Java sein) womit alle Tastaturereignisse abgefangen werden, nach Quelle gefiltert werden und alles was nicht vom Scanner ist, weitergereicht wird.


----------



## Landei (14. Sep 2011)

Üblicherweise lässt sich ein Scanner so konfigurieren, dass man einen Präfix angeben kann. Wenn du dafür irgend etwas selten benutztes einstellst (wie ° oder §), kannst du das zumindest innerhalb eines Programms abfangen.


----------



## andy82 (14. Sep 2011)

Andi_CH hat gesagt.:


> Eine *nicht* provokative Frage (ehrlich!) Ist deutsch nicht deine Muttersprache?
> Ich verstehe nicht einmal die sprachliche Ebene und auch der Zusammenhang mit dem eigentlichen Problem fehlt total!
> ...



Natürlich Deutsch ist nicht meine Muttersprache, aber vor der Wissenschaft sind alle Sprache gleich. Es scheint, dass Du das Prinzip der Model-View-Control Programmierung nicht kennt, und auch nicht wie man PlainDocument statt JTextField benutzt. Über dieses Thema braucht man wohl ein langes Kapitel. Also verschenke ich es.


----------



## Andi_CH (14. Sep 2011)

Vor dem menschlichen Gehirn sind nicht alle Sprachen gleich und was die abstrakte Wissenschaft damit anstellt weiss ich nicht - egal, es ging mir nur darum abzutasten wie ich den unzusammenhängenden Satz interpretieren soll.

MVC: Ich kenne das verdammt genau, aber es bringt in diesem fall nichts und hat abgesehen davon auch nichts damit zu tun, denn ....

Das Betriebssystem (egal ob Windows oder Linux) leitet alle Keyboardevents an die Applikation weiter, die den Fokus hat.

Wenn nun dein MVC oder was auch immer für ein Programm den Fokus *nicht* hat oder nicht mal ein GUI hat, weil es das, wie in meinem Fall, gar nicht braucht, wird es NIEMALS ein Event vom Keyboard erhalten.
(@Landei - das ist mein eigentliches Problem - die Events  landen nie in meiner Hintergrundapplikation. Ausserdem habe ich nicht einmal ein Doku für den Handscanner, aber das ist ein anderes Problem ;-))

Also eine Kurzbeschreibung:

- Der Mitarbeiter betätigt die Scannerpistole.
- Es wird von der Webcam ein Bild aufgenommen und im Filesystem abgelegt.
(Es ist noch detailliert beschrieben dass die gescannte Nummer, Zeit und Datum im Dateinamen des Bildes vorkommen, aber das ist hier irrelevant und abgesehen davon auch banal zu reaisieren.)
- Zur Verfügung steht der PC XY. (Das ist der auf dem auch die Zeiterfassung und andere Appliaktionen zur Verfügung stehen)

Für so eine Mikroapplikation braucht man ganz sicher weder Swing noch AWT noch Document noch sonst was.

Also wenn Du es schaffst in *Java* eine Applikation zu schreiben die den Scanneroutput erhält obwohl z.B. ein Mail- oder Officeprogramm offen ist, hast du dir eine Prämie verdient.

Nebenbei - hat hier jemand genügend C++ Kenntnisse? Kann man das damit machen? Wenn ja, bitte PN.


----------



## mmz (14. Sep 2011)

Hi,

läuft das ganze unter Windows? Mit einem globalen KeyHook (z.b. von Java Global Keyboard/Mouse Hook – JNI &bull; Blog Archive &bull; Jotschi’s Blog, Java lib und dll für Windows per JNI eingebunden) bekommst Du zumindest alle Keyboard Eingaben in deinem Programm mit. ( für Linux hab ich ehrlich gesagt nicht gesucht )
Wenn sich der Treiber für den Scanner tatsächlich wie ein reales Keyboard verhält und wir den Input mit gegebenenfalls Prefix oder per RegEx (sollte die Eingabe einem bestimmten Muster entsprechen) auswerten können, könnte man da zumindest ansetzten. Evtl. die Eingabe mit einem Delay weitergeben wenn wir festgestellt haben, dass sie nicht vom Scanner kommt. Das mit der Verzögerung ist vllt. nicht elegant, aber wenn der Scanner so schnell tippt wie angenommen, dann sollte das nicht auffallen bis die Auswertung fertig ist.


----------



## Flashbanger (15. Sep 2011)

Unter Linux hab ich mal etwas ähnliches geschafft.

Ich hatte eine zweite Tastatur angeschlossen und wollte die Eingaben an dieser Tastatur gesondert behandeln. 
Unter Linux öffnete ich dafür die Gerätedatei als Stream und konnte daraufhin den Tastatur-Scancode abhören. 

Diesen müsste man dann noch in die entsprechende Zeichenkette umwandeln.

Wie das unter Windows geht weis ich allerdings nicht. Vermutlich wirst Du nicht darüber hinweg kommen einen eigenen Treiber zu schreiben, der den Scanner nichtmehr Windows als Keyboard sondern nurnoch deiner Applikation zur Verfügung stellt. 

Liebe Grüße

Flashbanger


```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package javaapplication3;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;

/**
 *
 * @author jalmar
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws FileNotFoundException, IOException {
        // TODO code application logic here
        File j = new File("/dev/input/event4");		//ANPASSEN!
        System.out.println(j.exists()); 
        System.out.println(j.canRead());
        Scanner r = null;
        try {
            r = new Scanner(j);
            while(r.hasNext()) {
                System.out.println(r.next());
                }

            }
        finally {
            r.close();
            }
    }

}
```


----------

