# Koordinaten der Bildschirmposition auslesen (MouseListener?)



## dingeldidongel (29. Sep 2005)

Hallo,

ich suche eine Möglichkeit mit JAVA die Bildschirmposition der Maus an einer belibiegen Stelle auf dem Monitor (nicht nur im Applikationsfenster von JAVA) abzufangen.

ich programmiere gerade eine Mustererkennungssoftware mit Java. Ich möchte gerne Zahlen und Buchstaben die handgeschrieben sind als Matrix in Java weiterverarbeiten.
Dazu möchte ich ein Grafik Tablet verwenden(Aiptek - einfachste Ausführug) um die Handschrift einzulesen.

Am schönsten wäre es also, wenn es eine Funktion geben würde, die nach Programmstart die gesamte Bildschirmfläche auf Klicks und Motion überwacht und die Koordinaten übermittelt.
Das Ergebniss soll dann in einem kleinen zweiten Fenster, das eine Ebene dahinter liegt angezeigt werden.

Geht so etwas überhaupt?

Danke für jede Idee
Gruß
Nils


----------



## Campino (29. Sep 2005)

Wenn man Windows durchsichtig machen kann würde ich so eines über den ganzen Bildschirm legen, nur reagieren dann sachen dahinter nicht mehr, ansonsten JNI.


----------



## thE_29 (29. Sep 2005)

http://www.java-forum.org/de/viewtopic.php?t=22850&start=0

sowas da in der Art??


----------



## Majiy (30. Sep 2005)

http://java.sun.com/j2se/1.5.0/docs/api/java/awt/MouseInfo.html

Hilft dir das weiter?


----------



## dingeldidongel (30. Sep 2005)

Moinsen,

besten Dank für die Infos.
Werde beide mal ausprobieren.

Die gefakte Transparenz wäre eine gute Sache, da man ja schreiben soll und danach direkt erkannt wird was geschrieben wurde. 

Ich habe es leider nicht schaffen können, das Grafik Tablet nur auf einen Fensterbereich zu beschränken. Daher muss man wohl irgendwie improvisieren.

Gruß
Nils


----------



## dingeldidongel (10. Okt 2005)

Hallo,

also ich habe jetzt über den ganzen Desktop einen JFrame gelegt, der als Hintergrund einen Screenshot des aktuellen Desktop bekommt.
Dann lese ich über MouseDragged die gezeichneten Koordinaten ein und stelle sie grafisch dar.
Ein Thread überwacht die Eingabe über 3s und generiert dann eine 28x28 Matrix die die gezeichneten Pixel darstellt.
Das wird dann wiederum an einen Prozess übergeben, der die Zahlen und Buchstaben erkennen soll.

Der Weg über MouseInfo lieferte zu viele Koordinatenpaare. Der Screenshot bremst in grafikschwachen Systemen so stark, dass die Eingabe mit dem GrafikTablett etwas schwierig wird.

Sicher keine perfekte Lösung, aber vorerst ein guter Workaround .

Besten Dank für die Tipps

Gruß
Nils


----------



## thE_29 (11. Okt 2005)

Gibts scnr oder code?


----------



## dingeldidongel (12. Okt 2005)

Hier mal ein paar Auszüge aus dem Programm, das die Eingabe auf dem Bildschirm einliest:

Hier werden die Koordinaten eingelesen, gepeichert und mit Paint auf das übergrpße JPanel gemalt


```
public void mouseDragged(MouseEvent ev) { 
			
		int x=ev.getX();
		int y=ev.getY();
		koordinaten(x,y);
		repaint();
				
	}
```
 Bei einem Mausklick wird ein Thread gestartet, der das Malen über 3 s auf dem Display aufzeichnet. (also die Koordinaten)
 Da ich mir nicht schneller zu helfen wusste, habe ich mir hier eine globale Variable erschlichen damit der Thread nicht mehrmals während einer Eingabe gestartet wird. Er wird erst nach dem Interrupt gegenüber dem Thread zurückgesetzt 

```
public void mousePressed(MouseEvent arg0) {
		
		if (Globals.getInstance().getmalen()){
		
		Globals.getInstance().endemalen();
		
		Inputhread test = new Inputhread();
		test.start();
		repaint();
		
		
		}
```
Hier gibt es das Screenshot über einen Robot das in voller Größe auf den Hintergrund gelegt wird.

```
public Image shot() throws Exception {
		
		
		// Überprüfen der Auflösung
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		Dimension screenSize = toolkit.getScreenSize();
		Rectangle screenRect = new Rectangle(screenSize);
		
		// Screenshot erzeugen
		Robot robot = new Robot();
		BufferedImage image = robot.createScreenCapture(screenRect);
		
		
		return image;
 
	}
```

Hier wird das JFrame initialisiert mit dem Screenshot

```
public void initialize() {
		
		Screenshot shot = new Screenshot();
    	try {
			image = shot.shot();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//siehe Mausfunktion oben\\
		BackgroundPanel panel = new BackgroundPanel(image);
		
		//Abfrage Bildschirmauflösung
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); 
		
		//Fenstergröße auf Bildschirmgröße setzen
		this.setSize(d.width,d.height); 
		this.setLocation( (d.width - getSize().width ) / 2,(d.height- getSize().height) / 2 );
		this.setUndecorated(true);
		this.setContentPane(panel);
		
		this.addMouseMotionListener(panel);
		this.addMouseListener(panel);
		this.setVisible(true);
		
	}
```
Hier wird von MouseClicked der folgende Thread gestartet, der dann nach drei Sekunden wieder aufwacht und das mit Koordinaten vollgeschrieben Array wieder löscht und ggf. den nächsten Buchstaben einliest und die oben genannte Variable wieder zurücksetzt.

```
public void run(){
		
			try {
				sleep(3000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
```

Also wie gesagt, es funktioniert schon recht gut, die Eingaben kann man sauber aus dem Array auslesen und weiterverarbeiten.

Gruß
Nils[/code]


----------

