# Farbe erkannt = agieren, per Mausklick etc.



## kaaeeAhnung (3. Jan 2013)

Guten Abend und frohes neues, an alle. 

Habe eine Frage zu einem Programm, bzw. ob es über Java überhaupt möglich ist oder ich mich der Sache doch lieber C, C++ wenden soll  . Was ich brauche, ist ein keines Programm, dass mir eine “bestimmte“ also in dem Fall keine beliebige Farbe mit einer Interaktion entgegen kommt. Ausführlicher brauche ich (if colour (mouse cursor.over.this ) = xy) mache einen Linksklick

Else
 mache nix  

Nur,  dieser klick sollte nicht willkürlich irgendwo auf dem Desktop stattfinden, er sollte möglichst, von einer schon bestimmten Koordinate des Desktops seinen Zeiger fällen. 

Also ungefähr so. 

Auf dem Bildschirm ist ein Button,  den wählt man aus und so settet man dem (Wo muss ich drücken, wenn Farbe == Farbe)
Jetzt weiß (Ich weiß nicht ob man das so sagen darf) die Kopie des Mauszeigers (also das Teil, das auf den Button gesettet wurde)
:shock: Wenn die Farbe, |über die ich jetzt mit der Maus fahre,  rot oder grün oder blau ist, den Farbcode kann man ja im Skript setzen oder über welche Farbe wurde ausgewählt, nur dann wird der Code ja nur umso länger , |dann klicke. 

Ich hoffe, man versteht es. 

Ist es mit Java überhaupt möglich, ich meine, ich gebe den Code in ein Editor ein kompiliere ihn, führe die class oder auch mehrere Klassen fürs OO mit der Eingabeaufforderung aus. Kann dann Windows etwas damit anfangen, ob mit GUI oder ohne, ist ja völlig egal? Oder sollte so ein Programm doch lieber in einer anderen Sprache, wie schon gesagt, in C developed werden? 

Ich bedanke mich schon einmal im voraus, falls sich jemand bereit erklärt, so einen langen Text überhaupt zu lesen un DANN auch noch drauf zu antworten, 

LG


----------



## ARadauer (3. Jan 2013)

Also was war die frage? Ob das geht? Ja klar... Schau dir mal die Robot Klasse an


----------



## tröööt (3. Jan 2013)

also ich hab die frage jetzt nicht gerallt ... um was geht es jetzt noch mal genau ?

geht es darum eine position festzulegen und jedes mal wenn der cursor über diese geht n klick zu machen ? oder das ganze noch kombiniert mit ner farbe ? oder nur farbe ? ... ich hab es absolut nicht gerallt ...

für einen großteil kannst du [japi]Robot[/japi] nutzen ... performant programmiert leistet die einiges ...

und wenn es dann noch darum geht global ohne focus auf mouse/keyboard zu achten , das hier :  Java – Global (low level) Keyboard / Mouse Hook – JNI kSquared.de – Blog

irgendwie hört sich das nach nem aim-bot für CS mit custom-models an ...


----------



## kaaeeAhnung (4. Jan 2013)

Hallo,

Dankeschön für die Antworten.

Ich habe das ganze einmal grafisch erklärt in einem animiertem gif.

1. Man wählt den Button bzw. die Stelle aus auf die gedrückt werden soll.

2. Man wählt die Farbe aus, die das Drücken aktiviert

3. Man aktiviere das ganze.

4. Man fährt mit der Maus so lange rum, bis sich die gewünschte Farbe
    unter dem Mauszeiger befindet

5. Der vorher ausgewählten Bereich bzw. Knopf wird zeitgleich gedrückt.

6. Wenn sich die Farbe bewegt, nehmen wir an, sie bewegt sich auf den Mouse cursor zu, bleibt die
    Function gleich und das auserwählte wird mit dem Cursor beklickt.

Hier die Animitation








Achja, diese Anwendung sollte sich keineswegs um eine Art Aim-Bot handeln :lol:.
Spiele im moment keine Spiele, programmiere gerade eher eines.
Ein kleines via Adobe Flash.


----------



## ARadauer (4. Jan 2013)

Ja ich hab schon verstanden was du willst. 
Aber wie ist deine Frage?
zähl mal die Fragezeichen in deinem Post...


----------



## kaaeeAhnung (4. Jan 2013)

Im ersten Post genug und im zweiten kein einziges.

Was ich ja jetzt weiß, damit es mit dem richtigen Code funktionieren kann.

Nur bräuchte ich einen kleinen Anstoß. Hab mich bis jetzt schon ein wenig in Java eingelesen mittels,
Java von Kopf bis Fuß. Da mir wahrscheinlich niemand einfach so mal n Script zusammen stellen möchte, macht es mich glücklich, wenn irgendjemand sich bereit erklärt, eventuell Quellcode-Teile preiszugeben und/oder dazu ein paar Dinge erklärt. Wie schon angesprochen, es muss nicht in einem GUI ausführbar sein. Man kann auch einfach nur in der cmd die Eingabe tätigen.

Also:
Wie schreibt man am besten diesen Code???

Danke im voraus


----------



## ARadauer (4. Jan 2013)

Guter Punkt ist mal die Robot Klasse. Schreib mal enfache Beispiele um den Mauszeiger zu bewegen und Farben zu erkennen...


----------



## kaaeeAhnung (5. Jan 2013)

```
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Robot;
import java.awt.event.InputEvent;

public class Maus {

	
	public static void main(String[] args) throws AWTException {
		
		Robot Robo = new Robot();
		Color MyColor = new Color(0,0,0);
		Color RGB = new Color(0,0,0);
		
		int x = 100, y = 150;
		
		if(MyColor.equals(RGB));
		
		 Robo.mouseMove(x,y);
		 Robo.mousePress(InputEvent.BUTTON1_MASK ); 
		 Robo.mouseRelease(InputEvent.BUTTON1_MASK );

	}

}
```

Naja, so ungefähr kann man sich das vorstellen?

RGB und Koordinaten wurden zufällig gewählt.

Jetzt fehlt mir aber noch der Befehl (Ist der Zeiger über dieser Farbe, dann gehe erst dorthin und klicke) Aber komme leider nicht weiter.

Kannst du mir ein wenig unter die Arme greifen, bitte.

Danke


----------



## tröööt (5. Jan 2013)

ich rall es irgendwie immer noch nicht ...

du legst eine position fest auf die nachher mit Robot ein mausklick simuliert werden soll ... so weit bin ich mitgekommen ...
und dann willst du zusätzlich noch eine farbe festlegen die dieses event triggert ... nun ... das wird mit reinem java so recht schwer ...

grund : ohne zusatzlib (z.b. die die ich gelinkt habe) bekommst du von der maus außerhalb deiner anwendung nichts mit ... wenns nur innerhalb der anwendung sein soll ... ok .. dann reicht java .. aber außerhalb brauchts mehr ...

auch müsstest du bei jedem event einen screenshot machen auf dem die maus nicht zu sehen ist ... dir den pixel raussuchen der vom event kommt ... und diesen mit der trigger-farbe vergleichen ...

sorry ... aber auch wenn man nur ein 50x50 rectangle um den cursor nimmt und nicht einen ganzen 1080p screenshot ... das ganze wäre einfach zu langsam um es in echtzeit zu analysieren ... vor allem bei mäusen die rechte hohe geschwindigkeiten schaffen und nur so über den screen rasen ... das pakt java nicht ...


oder hab ich jetzt immer noch irgendwas nicht gerallt ..


----------



## kaaeeAhnung (5. Jan 2013)

tröööt, in der Animation, habe ich mir das genau so vorgestellt, das ist richtig. Jetzt bin ich aber auf dem Stand, so ungefähr wie es im Script steht. Das die Position und die Farbe schon manuell ermittelt wurde. Also einfach nur noch, falls die gewählte Farbe mit meinem Mauszeiger in Berührung kommt, dann gehe zu dieser vorgegeben Koordinate. 
Nur komme ich gerade nicht weiter.


----------



## VielleichtSo (6. Jan 2013)

Sieht das dann nicht so aus?


```
package m.maus.de;

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Robot;
import java.awt.event.InputEvent;

public class Maus {

	
	public static void main(String[] args) throws AWTException {
		
		Robot Robo = new Robot();
		Color MyColor = new Color(185,222,144);
		 Color Pixel = new Color(0);
		 Robo.getPixelColor(200, 100);
		
		int x = 100, y = 150;
		
		if (Pixel == MyColor); 
		
		 Robo.mouseMove(x,y);
		 Robo.mousePress(InputEvent.BUTTON1_MASK ); 
		 Robo.mouseRelease(InputEvent.BUTTON1_MASK );
		
	}

}
```

Oder täusche ich mich da?


----------



## kaaeeAhnung (6. Jan 2013)

Bei mir sieht das ganze jetzt so aus:


```
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Robot;
import java.awt.event.InputEvent;

public class Maus {

	
	public static void main(String[] args) throws AWTException {
		
		Robot Robo = new Robot();
		Color MyColor = new Color(255,255,255);
		 Color Pixel = new Color(0);
		Pixel = Robo.getPixelColor(100, 200);
		
		int x = 300, y = 400;
		
		if (MyColor.equals(Pixel))/*Ohne Semilikon kommt ein komisches Fenster
                                                     aber mit dem Sem;, springt der Zeiger direkt dorthin*/
		
		 Robo.mouseMove(x,y);
		 Robo.mousePress(InputEvent.BUTTON1_MASK ); 
		 Robo.mouseRelease(InputEvent.BUTTON1_MASK );
		
	}

}
```
Was mache ich falsch?


----------



## Network (6. Jan 2013)

Ohne Semikolon wird

```
Robo.mouseMove(x,y);
```
 nur ausgeführt wenn

```
MyColor.equals(Pixel);
```
 wahr ist.

Mit Semikolon wird

```
Robo.mouseMove(x,y);
```
 immer ausgeführt.


```
Robo.mousePress(InputEvent.BUTTON1_MASK ); 
Robo.mouseRelease(InputEvent.BUTTON1_MASK );
```
werden in beiden Beispielen immer ausgeführt.

Und so sollte es wahrscheinlich richtig aussehen:

```
if (MyColor.equals(Pixel)) {
         Robo.mouseMove(x,y);
         Robo.mousePress(InputEvent.BUTTON1_MASK ); 
         Robo.mouseRelease(InputEvent.BUTTON1_MASK );
}
```

Es wirkte auf mich als hättest du nicht ganz die Syntax von Java verstanden. Deshalb habe ich es einfach mal erwähnt dass man es so schreibt.
In vielen anderen Sprachen gibt es diese Klammern ja nicht, sondern nur Einrückungen oder ein "END"/"ELSE" die das Ende markieren.

Gruß
Net


----------



## kaaeeAhnung (6. Jan 2013)

Oh, entschuldige, mein Fehler.
Es funktioniert, was ich jetzt brauche, ist das statt die festgelegten Koordinaten = Farbe, 
der Mauszeiger als Auslöser dient.
Wenn Curos berührt Farbe, dann mache...

Ist das möglich?


----------



## javarierender (7. Jan 2013)

Indem du ganz einfach ein mouseListener event einfügst


----------



## kaaeeAhnung (7. Jan 2013)

Ok, Dankeschön für den Tipp!? Nur wie stelle ich das an? Wo setze ich den Befehl rein bzw. welche Komponenten gehören noch dazu?


----------



## Berndus (8. Jan 2013)

Stehe vor ca dem gleichen problem wie macht man das mit dem mouselistener? Kann jemand bitte ein Beispiel sagen? Danke


----------



## kaaeeAhnung (8. Jan 2013)

Eigentlich schade, dass das hier schon endet. Weiß keiner einen Rat? Berndus, was programmierst du, wenn ich fragen darf?


----------



## Spacerat (8. Jan 2013)

Ich versuche da grad' durchzusteigen...
Also
1. Um feszustellen, wo sich der Cursor grad befindet, benötigst du einen MouseMotionListener. Dieser liefert dir bei jeder Mausbewegung die Koordinaten des Cursors ("getXOnScreen()" und "getYOnScreen()"). "mouseDragged()" ist für Bewegungen bei gedrüchter Maustaste und "mouseMoved()" für einfache Bewegungen.
2. Nun benötigst du den Robot. Mit der Methode "getPixelColor()" und den Koordinaten des MouseMotionListeners kommst du an die Farbe unter dem Cursor. Ich denke aber mal nicht, dass das für den ganzen Bildschirm funktioniert, sondern nur innerhalb des Java-Fensters, aber ich bin gerne bereit, das auszuprobieren.
3. Diese Farbe lässt sin nun mit jeder beliebigen Farbe vergleichen und bei Übereinstimmung, kann man den Robot nun dafür verwenden, eine Aktion (z.B. "mousePress()", ich z.B. ändere den Hintergrund der Anwendung) ausführen.

```
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Robot;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class AutoPipette {
	public static void main(String[] args) {
		Robot r = null;
		try {
			r = new Robot();
		} catch(AWTException e) {
			System.exit(-1);
		}
		final Robot robot = r;
		final Random rnd = new Random();
		final JPanel panel = new JPanel() {
			private static final long serialVersionUID = 1L;

			{
				setSize(300, 300);
				setPreferredSize(getSize());
				setMaximumSize(getSize());
				setMinimumSize(getSize());
			}

			@Override
			protected void paintComponent(Graphics g) {
				super.paintComponent(g);
				g.setColor(Color.RED);
				g.fillOval(200, 200, 40, 40);
			}
		};
		final JFrame frame = new JFrame("Autopipette");
		panel.addMouseMotionListener(new MouseMotionListener() {
			@Override
			public void mouseMoved(MouseEvent e) {
				int x = e.getXOnScreen();
				int y = e.getYOnScreen();
				if(robot.getPixelColor(x, y).equals(Color.RED)) {
					panel.setBackground(new Color(rnd.nextInt()));
					frame.repaint();
				}
			}
			
			@Override
			public void mouseDragged(MouseEvent e) {
			}
		});
		frame.add(panel);
		frame.pack();
		frame.setVisible(true);
	}
}
```


----------



## kaaeeAhnung (9. Jan 2013)

Danke, 
ich hab das mal so geschrieben.
Ist noch ziemlich Fehlerhaft, kann jemand mal drüber schauen und eventuell verbessern?


```
package maus.de.de;



import java.awt.AWTException;
import java.awt.Color;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

public class Maus{

	
	

	public static void main(String[] args) throws AWTException {
		
		
		
		Robot Robo = new Robot();
		Color MyColor = new Color(255,255,255);
		 Color Pixel = new Color(255,255,255);
		 Pixel = Robo.getPixelColor(0,0);
		
		int x = 688, y = 605;
		private static void MouseMotionListener() {
		
		
	

		public abstract void mouseMoved(MouseEvent e) {
		
		int xx = e.getXOnScreen();
        int yy = e.getYOnScreen();
		
		if (Robo.getPixelColor(xx, yy).equals(MyColor)) {
		
		 Robo.mouseMove(x,y);
		 Robo.mousePress(InputEvent.BUTTON1_MASK ); 
		 Robo.mouseRelease(InputEvent.BUTTON1_MASK );
		}
		}
}
		
	}

	
}
```

Bin langsam am verzweifeln  . Es muss doch umzusetzen sein. ???


----------



## Spacerat (10. Jan 2013)

Wie ist denn der Stand deiner sonstigen Javakenntnisse? Was bitte soll "public static void MouseMotionListener()" bedeuten?
Hat dich meine Art der Instanzierung (diese nennt sich anonyme Instanzierung) irritiert oder wie kommt so'n (sorry) Blödsinn zu stande?

```
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Maus {
	public static void main(String[] args) throws AWTException {
		final Robot Robo = new Robot();
		final Random rnd = new Random();
		final Color MyColor = Color.RED;
		final int x = 688, y = 605;
		// So'n MML nutzt einem nichts, wenn man keine Komponente hat,
		// wo man ihn adden kann.
		final JPanel panel = new JPanel() {
			private static final long serialVersionUID = 1L;

			{
				setSize(300, 300);
				setPreferredSize(getSize());
				setMaximumSize(getSize());
				setMinimumSize(getSize());
			}

			@Override
			protected void paintComponent(Graphics g) {
				super.paintComponent(g);
				g.setColor(Color.RED);
				g.fillOval(200, 200, 40, 40);
			}
		};
		// evtl. wundert dich hier überall dieses "final"...
		// Variablen welche man in anonymen klassen verwenden will,
		// müssen innerhalb der Methode final sein oder als Klassen
		// oder Instanzvariablen deklariert sein.
		MouseMotionListener mml = new MouseMotionListener() {
			@Override
			public void mouseMoved(MouseEvent e) {
				int xx = e.getXOnScreen();
				int yy = e.getYOnScreen();
				if (Robo.getPixelColor(xx, yy).equals(MyColor)) {
					Robo.mouseMove(x , y);
					Robo.mousePress(InputEvent.BUTTON1_MASK ); 
					Robo.mouseRelease(InputEvent.BUTTON1_MASK );
					// Wenn dieser Block durch ist sollte sich die
					// Maus an einer anderen Stelle befinden und
					// das Fenster im Hintergrund verschwunden
					// sein. Wenn das nicht auffällt, weil es
					// ohnehin von nichts anderem überlagert wurde,
					// ändern wir zur Kontrolle den Hintergrund
					// der Anwendung.
					panel.setBackground(new Color(rnd.nextInt()));
				}
			}

			@Override
			public void mouseDragged(MouseEvent e) {
			}
		};
		// Und ohne Frame nutzt einem die Komponente auch nichts.
		final JFrame frame = new JFrame("Maus");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		panel.addMouseMotionListener(mml);
		frame.add(panel);
		frame.pack();
		frame.setVisible(true);
    }
}
```


----------



## kaaeeAhnung (10. Jan 2013)

Auch dafür ein dickes Dankeschön und es gibt wirklich keine Möglichkeit anstatt das Fenster, einen Teil des Desktop´s als Komponente zu nehmen für das mml?

Bzw. vielleicht das Fenster benutzen und es dahin verschieben, wo man es braucht?
Z.B. Transparent und die Farben dahinter können Funktionen auslösen?

Weißt du wie ich meine?

Es freut mich sehr, dass du so bemüht bist mir zu helfen.Es fehlt halt nur noch, 
damit ich es auch außerhalb vom ProgFenster benutzen kann.

Danke im voraus,

lG


----------



## Network (10. Jan 2013)

Das hatte ich mir auch bereits bei deiner Fragestellung überlegt gehabt.
Theoretisch könnte man ja einen nonopaque undecorated jframe nehmen, das über den gesammten Desktop gestreckt wird.
Nur die Frage ist dann, was dabei herauskommt. Die Lösung scheint mir zu leicht zu sein.
Ich nehme an Robot würde einfach die Farbe des Fensters zurückgeben, die es wahrscheinlich sonst hat.

Hinzu müsste man das JFrame noch so einstellen, dass es die Eingaben der Maus nicht abfängt.

Gruß
Net


----------



## Spacerat (10. Jan 2013)

kaaeeAhnung hat gesagt.:


> Weißt du wie ich meine?


Joa, nur zu gut :lol:. Das hätte viele gerne, siehe Networks post.
Ich bin mir aber nicht wiklich sicher, ob Networks Idee überhaupt klappt. Evtl. lässt sich ja in einem Thread etwas mit "Robot.createScreenCapture()" und "MouseInfo.getPointerInfo().getLocation()" machen.


----------



## kaaeeAhnung (10. Jan 2013)

@ Spacerat

Kann man sich das mit dem Screen Capture so vorstellen? 
Man macht einen Screenshot, pickt das zu brauchende Pixel heraus, packt die Zieladresse des Bildes,  per Import in den Quelltext und tippt die Werte der Farbe in MyColor? Wenn das so funktionieren sollte, wieso gibt's da keinen besseren Weg, dass ganze in Realtime auszuführen oder ist Java da dann doch zu lahm? 

Ich verstehe es nicht, haha. 
Am einfachsten wäre doch...

1.
Gebe Farbenwert ein oder mehrere Farbenwerte, der gleichen Farbgruppe, falls der Auslöser so zu sagen in einem Verlauf verläuft. 

2.
Wähle die Stelle, die als Ziel fungiert!

3.
Dann programmiere den Mauszeiger so, dass wenn er diese Farbe berührt, auf die vorher angegebene Stelle springt und dort seine Aktion ausführt. 

Klingt halt alles zu einfach ;-) .


----------



## Spacerat (11. Jan 2013)

Hehehe... Vergiss das mit ScreenCapture.
Ich hab's mit Networks Idee hinbekommen.

```
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class ScreenPipette {
	public static void main(String[] args) {
		Robot r = null;
		try {
			r = new Robot();
		} catch(AWTException e) {
			System.exit(-1);
		}
		final Robot robot = r;
		final Random rnd = new Random();
		final JFrame frame = new JFrame("Pipette");
		final JPanel panel = new JPanel() {
			private static final long serialVersionUID = 1L;

			private final Point mouse = new Point();
			JFrame mini;

			{
				setSize(300, 300);
				setPreferredSize(getSize());
				setMaximumSize(getSize());
				setMinimumSize(getSize());
				addFocusListener(new FocusListener() {
					@Override
					public void focusLost(FocusEvent e) {
						if(mini == null) {
							requestFocus();
						}
					}
					
					@Override
					public void focusGained(FocusEvent e) {
					}
				});
				addMouseMotionListener(new MouseAdapter() {
					@Override
					public void mouseMoved(MouseEvent e) {
						int x = e.getXOnScreen();
						int y = e.getYOnScreen();
						if(robot.getPixelColor(x, y).equals(getForeground())) {
							frame.setBackground(new Color(rnd.nextInt()));
							frame.repaint();
						}
					}
				});
				final JButton pipette = new JButton("farbe saugen");
				add(pipette);
				pipette.addActionListener(new ActionListener() {
					@Override
					public void actionPerformed(ActionEvent e) {
						if(mini != null) {
							return;
						}
						mini = new JFrame();
						mini.setUndecorated(true);
						PointerInfo pi = MouseInfo.getPointerInfo();
						mini.setSize(Toolkit.getDefaultToolkit().getScreenSize());
						mouse.setLocation(pi.getLocation());
						mini.setAlwaysOnTop(true);
						mini.setOpacity(0.01F);
						MouseAdapter ma = new MouseAdapter() {
							@Override
							public void mouseClicked(MouseEvent e) {
								mini.setVisible(false);
								mini.dispose();
								mini = null;
								requestFocus();
							}

							@Override
							public void mouseMoved(MouseEvent e) {
								mouse.setLocation(MouseInfo.getPointerInfo().getLocation());
								setForeground(robot.getPixelColor(mouse.x, mouse.y));
								repaint();
							}
						};
						mini.addMouseListener(ma);
						mini.addMouseMotionListener(ma);
						mini.addFocusListener(new FocusListener() {
							@Override
							public void focusLost(FocusEvent e) {
								if(mini != null) {
									mini.requestFocus();
								}
							}
							
							@Override
							public void focusGained(FocusEvent e) {
							}
						});
						mini.setVisible(true);
					}
				});
			}

			@Override
			protected void paintComponent(Graphics g) {
				super.paintComponent(g);
				setBackground(frame.getBackground());
				g.setColor(getForeground());
				g.fillOval(200, 200, 40, 40);
			}
		};
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(panel);
		frame.pack();
		frame.setVisible(true);
	}
}
```
Button und Bewegung kann man nun noch per Robot automatisieren... Ok, zugegeben, das Ganze sieht ein wenig verquer und umständlich aus, aber das könnte daran liegen, dass ich auf die Schnelle viel zu viele anonyme Klassen instanziere. Das müsste noch verbessert werden.
Im übrigen ganz wichtig: der Wert bei "setOpacity()" darf nicht ganz 0 sein, weil die meisten Betriebssysteme Fenster, bei denen es nichts zu zeichnen gibt, einfach ignorieren. Diese Fenster empfangen dann weder Maus- noch KeyEvents.


----------



## X5-599 (11. Jan 2013)

Sagt mal braucht ihr nicht einfach nur eine Möglichkeit die Farbe des Pixels zu ermitteln über dem sich der Maus Cursor gerade befindet?

Also grob gesagt sowas:


```
Robot r = new Robot();
while(true)
{
	Point p = MouseInfo.getPointerInfo().getLocation();
			
	System.out.println(r.getPixelColor(p.x, p.y));
			
			
	Thread.sleep(1000);
}
```


----------



## Spacerat (11. Jan 2013)

Ja, natürlich... aber evntl. auch den Mausklick, um die Farbe zu wählen. Ausserdem ist die Sache mit den Events sauberer als busy waiting mit "Thread.sleep()".
Im übrigen: der Minimalwert für setOpacity() ist [c]1.0 / 255.0[/c]. Kleinere Werte schliessen das Fenster vom EventHandling aus. Leider hat das auch den Nachteil, dass alle Kanäle biss auf Weiss um einen Schritt nach oben verfälscht werden. Der mindestwert ist also 0xFF010101


----------



## kaaeeAhnung (11. Jan 2013)

Klappt ja alles ganz gut, ich habe es versucht das ganze so umzuschreiben, damit nicht nur der Kreis,
der die Farbe aufnimmt als Auslöser dient, sondern der Hintergrund außerhalb vom Fenster via getDesktop aber 
leider ohne Erfolg. 
Hab auch java.awt.Desktop importiert.

Die Farbe kann ich auch außerhalb aufnehmen nur halt nicht die aufgenommene Farbe "außerhalb" als Auslöser.


```
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Desktop;
import java.awt.Graphics;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class Maus2 {
    public static void main(String[] args) {
        Robot r = null;
        try {
            r = new Robot();
        } catch(AWTException e) {
            System.exit(-1);
        }
        final Robot robot = r;
        final Random rnd = new Random();
        final JFrame frame = new JFrame("Pipette");
        final JPanel panel = new JPanel() {
            private static final long serialVersionUID = 1L;
 
            private final Point mouse = new Point();
            JFrame mini;
 
            {
                setSize(300, 300);
                setPreferredSize(getSize());
                setMaximumSize(getSize());
                setMinimumSize(getSize());
                addFocusListener(new FocusListener() {
                    @Override
                    public void focusLost(FocusEvent e) {
                        if(mini == null) {
                            requestFocus();
                        }
                    }
                    
                    @Override
                    public void focusGained(FocusEvent e) {
                    }
                });
                addMouseMotionListener(new MouseAdapter() {
                    @Override
                    public void mouseMoved(MouseEvent e) {
                        Desktop.isDesktopSupported();
                    	int x = e.getXOnScreen();
                        int y = e.getYOnScreen();
                        int xx = 500, yy = 500;
                        
                        if(robot.getPixelColor(x, y).equals(Desktop.getDesktop())) {
                        	
                            frame.setBackground(new Color(rnd.nextInt()));
                            frame.repaint();
                            
                            robot.mouseMove(xx , yy);
                            robot.mousePress(InputEvent.BUTTON1_MASK ); 
                            robot.mouseRelease(InputEvent.BUTTON1_MASK );
                        }
                    }
                
                });
                final JButton pipette = new JButton("farbe saugen");
                add(pipette);
                pipette.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        if(mini != null) {
                            return;
                        }
                        mini = new JFrame();
                        mini.setUndecorated(true);
                        PointerInfo pi = MouseInfo.getPointerInfo();
                        mini.setSize(Toolkit.getDefaultToolkit().getScreenSize());
                        mouse.setLocation(pi.getLocation());
                        mini.setAlwaysOnTop(true);
                        mini.setOpacity(0.01F);
                        MouseAdapter ma = new MouseAdapter() {
                            @Override
                            public void mouseClicked(MouseEvent e) {
                                mini.setVisible(false);
                                mini.dispose();
                                mini = null;
                                requestFocus();
                            }
 
                            @Override
                            public void mouseMoved(MouseEvent e) {
                                mouse.setLocation(MouseInfo.getPointerInfo().getLocation());
                                setForeground(robot.getPixelColor(mouse.x, mouse.y));
                                repaint();
                            }
                        };
                        mini.addMouseListener(ma);
                        mini.addMouseMotionListener(ma);
                        mini.addFocusListener(new FocusListener() {
                            @Override
                            public void focusLost(FocusEvent e) {
                                if(mini != null) {
                                    mini.requestFocus();
                                }
                            }
                            
                            @Override
                            public void focusGained(FocusEvent e) {
                            }
                        });
                        mini.setVisible(true);
                    }
                });
            }
 
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                setBackground(frame.getBackground());
                g.setColor(getForeground());
                g.fillOval(200, 200, 40, 40);
            }
        };
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }
}
```

So habe ich mir das vorgestellt.
Ich kann zwar eine Farbe wählen aber auf diese wird nicht reagiert ob im Fenster oder außerhalb.


----------



## Spacerat (11. Jan 2013)

Zeile 66: Wieso vergleichst du eine Farbe mit 'nem Desktop? Das macht keinen Sinn. Ist als wenn du meine Frage nach deinem Geburtstag mit Rosarot beantwortest. Da gehört 'ne gespeicherte Farbe hin.


----------



## kaaeeAhnung (11. Jan 2013)

Mhh, vllt gibt es ja jemanden, der so alt is 
:-D . Hab mir nur gedacht, es halt einfach mit den Farben des Desktops zu vergleichen also natürlich nur die, die mit der Maus in Berührung kommt. 
Und schon wieder in die komplett falsche Richtung gedacht...

Ist es auch eigentlich möglich eine invisible Hitbox zu generieren, falls eine der ausgewählten Farben sich in der Box befindet, dann reagiere. Bezieht sich halt wieder nur außerhalb des Programms.
Ich lege fest, 255,255, 255 | 0,0,0 | 172,116,20 (Das | ist ja der “oder“ Operator) oder irre ich mich da? 

Danach setze ich der Box z.b. 100,120,15,15 an. 

Wenn jetzt eine der ausgewählten Farben in der Box auftaucht oder schon vorhanden ist, dann mache. 

Ich merke schon ich verlange ganz schön viel, haha. 
Man sollte mal ein Spendenbutton einführen, mit dem man mitunter einem Danke setzen auch spenden kann, für den einzelnen User, hehe.


----------



## Spacerat (11. Jan 2013)

kaaeeAhnung hat gesagt.:


> Ich merke schon ich verlange ganz schön viel, haha.
> Man sollte mal ein Spendenbutton einführen, mit dem man mitunter einem Danke setzen auch spenden kann, für den einzelnen User, hehe.


Mach doch einen Verbesserungsvorschlag .
Also wie gesagt, ausserhalb der Java-Anwendung sind keine Events aktiv, deswegen besteht meine ScreenPipette halt aus einem fast unsichtbarem Frame, welcher blöderweise die Farben geringfügig verfälscht. Aber man kann das ja noch anders machen:

```
import java.awt.AWTException;
import java.awt.Color;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashSet;
import java.util.Set;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ScreenPipette {
	public static void main(String[] args) {
		Robot r = null;
		try {
			r = new Robot();
		} catch(AWTException e) {
			System.exit(-1);
		}
		final Robot robot = r;
		final JFrame frame = new JFrame("ScreenPipette");
		final JPanel panel = new JPanel() {
			private static final long serialVersionUID = 1L;

			private final Point mouse = new Point();
			private final Set<Color> pickedColors = new HashSet<>();
			JFrame mini;

			{
				final JButton pipette = new JButton("Farbe saugen");
				add(pipette);
				pipette.addActionListener(new ActionListener() {
					@Override
					public void actionPerformed(ActionEvent e) {
						if(mini != null) {
							return;
						}
						mini = new JFrame();
						mini.setUndecorated(true);
						PointerInfo pi = MouseInfo.getPointerInfo();
						mini.setSize(Toolkit.getDefaultToolkit().getScreenSize());
						mouse.setLocation(pi.getLocation());
						mini.setAlwaysOnTop(true);
						mini.setOpacity((float) (1.0 / 255.0));
						MouseAdapter ma = new MouseAdapter() {
							@Override
							public void mouseMoved(MouseEvent e) {
								// auf dem EDT ist's egal (sogar eher willkommen),
								// dass der Sender keine Events werfen kann.
								mini.setOpacity(0.0F);
								mouse.setLocation(e.getLocationOnScreen());
								Color c = robot.getPixelColor(mouse.x, mouse.y);
								// hier kann man mit der unverfälschten Farbe
								// machen, was man will. Ich ändere z.B.
								// den Hintergrund des "Farbe saugen"-Buttons
								pipette.setBackground(c);
								// ...danach aber muss die Opacity zurückgesetzt
								// werden.
								mini.setOpacity((float) (1.0 / 255.0));
								repaint();
							}

							@Override
							public void mouseClicked(MouseEvent e) {
								// da die unverfälsche Farbe nun die
								// Hintergrundfarbe des "Farbe saugen"-Buttons
								// ist, kann man sie sich von dort holen und
								// ggf. in einem Set speichern. Dazu muss man
								// nicht mal fürchten, dass in dieses Set
								// doppelte Einträge gelangen.
								pickedColors.add(pipette.getBackground());
								mini.setVisible(false);
								mini.dispose();
								mini = null;
								requestFocus();
							}
						};
						mini.addMouseListener(ma);
						mini.addMouseMotionListener(ma);
						mini.addFocusListener(new FocusListener() {
							@Override
							public void focusLost(FocusEvent e) {
								if(mini != null) {
									mini.requestFocus();
								}
							}
							
							@Override
							public void focusGained(FocusEvent e) {
							}
						});
						mini.setVisible(true);
					}
				});
			}
		};
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(panel);
		frame.pack();
		frame.setVisible(true);
	}
}
```
Ich hab' diesmal auch den ganzen Farben-Schnick-Schnack entfernt, das macht den Code ein wenig übersichtlicher.
BTW.: Das mit der Hitbox müsstest du mir mal Erklären.


----------



## kaaeeAhnung (11. Jan 2013)

Also, da ich schon gut was gebechert hab, mal n etwas weniger artikulierenden Beitrag :lol: .

Was ich meine:

Bei ActionScript2 z.B. kann man eine HitBox erstellen die, wenn man ein Objekt nimmt, mit diesem kollidieren kann. Diese HitBox kann man beliebig auf Transparenz schalten.

Stell dir das so vor...

Du programmierst ein Autospiel. Dein Fahrzeug kannst du beliebig konfiguieren, der Bandbreite ist demnach ja keine Grenze gesetzt.
Du willst, dass dieses Auto eventuell mal an die Wand knallt, um ein wenig realistic rein zu bringen.
Also erstellst du eine HitBox die dafür sorgt, dass wenn dieses Gefährt mit überhöter Geschwindigkeit gegen diese, ebenfalls mit einer HitBox ausgestatteten Wand rast, einen Totalschaden erleidet.

Um nicht zu weit vom Thema abzudriften, nehmen wir mal an, wir haben ein kleines Quadrat, das von links unten nach rechts oben des Desktops wandert. Dieses hat 3 Farben : Rot, Blau und Gelb.
Dieses wiederum wechselt die Farbe alle 5 Sekunden.
Jetzt kommen wir zur sogenannten HitBox.
Wir erstellen dafür ein Rectangle mit den Koordinaten x1300 y60, also ziemlich weit oben rechts in der Ecke. Nun nur noch die Maße dafür z.B. h5,b5. new Rectangle(1300, 60, 5, 5).
Weiß net ob man dafür das BufferedImage, Screen Capture und und und braucht.

Wir stellen ein, das Rechteck soll nur auf eine Farbe und zwar "Rot" reagieren.
Wandert nun das Quadrat, dass 5 sekündlich die Farbe wechselt, zur Hitbox und hat in diesem Momemt die benötigte Farbe, wird etwas ausgeführt, was man vorher eingestellt hat, wie zum Beispiel, gehe mit der Maus zur Koordinate 1300,55 und klicke doppelt.

Jetz ungefähr n Plan was ich meine???


----------



## Spacerat (12. Jan 2013)

Denke schon. Nur brauchst du in Java dazu erstmal keine Farben, sondern zunächst erstmal nur die Bounds der beiden Quadrate. Das farbewechselnde Quadrat ist dabei ein undekoriertes Fenster und die Hitbox ein laufender Thread, der kontinuierlich "getBounds()" registrierter Objekte, in diesem Fall das farbewechselnde Quadrat, abfragt und mit den für die Htibox festgelegten Bounds (1300, 60, 5, 5) vergleicht (siehe "<Rectangle>.intersects()"). Erst wenn diese Bounds überlappen, fragt die Hitbox die Farbe des wechselnden Quadrats ab und reagiert bei Übereinstimmung entsprechend (evtl. "setLocation(da, dort)").
Erst wenn Kollisionen anderer Formen ausser Quadrate geprüft werden sollen, müssen für die Objekte Bitmaps festgelegt werden. Dann wird wie gewohnt erst die Box geprüft und bei Überlappung die beiden überlappenden Bereiche der betroffenen Bitmaps verglichen (UND-Verknüpft). Erst wenn eine dieser Verknüpfungen true ergibt, liegt eine Kollision vor und man kann nun noch prüfen ob auch die augenblickliche Farbe passt. Ist dies der Fall, kann man wie zuvor auch, entsprechend reagieren.
Im übrigen meldet die Hitbox dem Objekt, das eine Kollision vorlag (EventSystem) indem es eine Methode eines vom Objekt registrierten Listeners (etwa "collisonOccured(HitBox source)") aufruft. In dieser Methode prüft das Objekt dann weitere Umstände und reagiert selbstständig bzw. nach Vorgabe im Methodenrumpf.


----------



## Nachui (12. Jan 2013)

@kaaeeAhnung

ich stelle mir das so vor habe aber keine ahnung ob es geht habe es gerade mit dem handy geschrieben und konnt des noch nicht ausprobieren ich hoffe es klappt


```
package maus.de.de;

import java.awt.AWTException;
import java.awt.Color;
import java.awt.MouseInfo;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.image.BufferedImage;
import java.awt.Rectangle;

public class DasRechteck {
 
    

	public static void main(String[] args) throws AWTException {
        
        Robot Robo = new Robot();
        Color MyColor = new Color(174,12,60);
        Color RGB = new Color(174,12,60);
        MouseInfo.getPointerInfo().getLocation();
        int dasx = 665;
        Rectangle reck = new Rectangle();
        BufferedImage image = new Robot().createScreenCapture( reck );
        setRectangle(665,310,15,200); /*665, 310, 15, 200*/ {
        
        int x = 690, y = 600;
        
        if(MyColor.equals(reck))
        
         Robo.mouseMove(x,y);
         Robo.mousePress(InputEvent.BUTTON1_MASK ); 
         Robo.mouseRelease(InputEvent.BUTTON1_MASK );
 
    }
 
}

	private static void setRectangle(int i, int j, int k, int l) {
		// TODO Auto-generated method stub
		
	}
}
```


----------



## Spacerat (12. Jan 2013)

Das klappt nicht!
Zeile 28: Eine Farbe mit einem Rechteck zu vergleichen, macht ebenso wenig Sinn, wie eine Farbe mit einem Desktop (siehe oben).


----------



## kaaeeAhnung (12. Jan 2013)

Oh man Oh man,

ich versteh die Syntax von Java glaub ich echt net, so wie angesprochen.

Das Rechteck hab ich absichtlich so groß gesettet, zu Testzwecken.

Mein Code


```
import java.awt.AWTException;
import java.awt.Color;
import java.awt.MouseInfo;
import java.awt.Robot;
import java.awt.Shape;
import java.awt.event.InputEvent;
import java.awt.Rectangle;

public class Maus2 {
 
    

	public static void main(String[] args) throws AWTException {
        
        Robot Robo = new Robot();
        Color MyColor = new Color(134,12,10);
        MouseInfo.getPointerInfo().getLocation();
        final Rectangle reck2 = new Rectangle(200,310,800,800);
        
        setRectangle(200,310,800,800);  {
        
        int x = 400 y = 300;
        
        if(((Shape) MyColor).intersects(reck2));
        getBounds(true);
         Robo.mouseMove(x,y);
         Robo.mousePress(InputEvent.BUTTON1_MASK ); 
         Robo.mouseRelease(InputEvent.BUTTON1_MASK );
 
    }
 
}

	private static void getBounds(boolean b) {
		// TODO Auto-generated method stub
		
	}

	private static void setRectangle(int i, int j, int k, int l) {
		// TODO Auto-generated method stub
		
	}
}
```


----------



## Elaut (13. Jan 2013)

Das mit dem Rechteck hatte ich irgendwo schon einmal gesehen, eigentlich ganz einfach. Müsste ihn halt suchen. 
Und das mit der Maus würde mich auch interessieren. es ist möglich das alles außerhalb des Java Programms zu tätigen nur wie, da fehlt mir auch noch der richtige funke. Einfach mal mit Farbe.intersects, statt equals versuchen. Muss mir mal wieder alles installieren und konfigurieren. Dann probiere ich das. 

ciao


----------



## Spacerat (13. Jan 2013)

Nein, das ist ein Missverständnis, es geht nicht ausserhalb Java. Der Trick ist, ein undekoriertes, (fast) durchsichtiges Java-Fenster über den gesamten Screen zu öffnen, welches die mouseMoved- und mouseClicked-Events abfängt (bei der Pipette zumindest).
Für "kaaee Ahnung"s Problem, könnte das Farbe wechselnde Quadrat auch ein undekoriertes Fenster in der gewünschten Grösse und Farben sein, welches man per "setLocation()" in einem Thread über den Bildschirm wandern lässt.
In der selben Anwendung läuft ein weiterer Thread (die "Hitbox") bei welchem sich das wandernde Fenster registrieren muss. Die Hitbox selber ist dabei nur ein virtuelles Fenster, bestehend aus einem Rectangle. Dieser Thread, fragt nun laufend die Positionen der registrierten Fenster ab und ruft im Falle einer Kollision deren "collisionOccured(Hitbox hb)"-Methode auf, in welcher das Fenster selbständig prüft, ob es grad' den richtigen Zustand ("OMG, bin ich Blau!" :lol hat und entsprechend reagiert.
Es ist im übrigen recht selten (bis gar nicht) sinnvoll, Objekte verschiedener Typen miteinander zu vergleichen, ob "Color.intersects(myFrame)" (was natürlich nicht mal ginge) oder was anderes. Wenn ich Zeit hab' werd' ich's mal zusammen frickeln.
Für den Fall, dass noch einer von den Erfahrenen mitliest: Für den Hitbox-Thread kann (sollte) man natürlich auch den EDT verwenden, ganz einfach, indem man sich registrierenden Fenstern oder Komponenten einen ComponentListener ("componentMoved()") anhängt.


----------



## Elaut (13. Jan 2013)

Wieso sollten die Robot Anweisungen außerhalb des Fensters gehen, so wie bewege die Maus un klicke 3 mal. Genauso wie die Tastatur. Es werden Tasten gedrückt, dass geschieht ja sich alles außerhalb eines Fensters bzw bräucht nicht mal eines. Zumal es ja eh nur ein mouse listener ist. Wenn ich jetzt das Programm schreiben wollte mit der Maus die die Farbe berührt und dann an die Koordinate x,y springt, die Farbe die wir vorher schon im Code aufgelistet haben. Dann würde ich das so machen und ohne frame: Ein mouseListener einfügen der die Koordinaten ausliest. Die Farbe schwarz mit 0,0,0 werten und die variable kreuze ich mittels intersection. Da brauche ich doch kein extra Fenster sonst kann ich mir das sehr gut vorstellen. Aber ansonsten ohne Fenster kann ich das ganze ganz gut auf den jetzigen Hintergrund projezieren, sei es ein geöffnetes Bild, eine Internetseite oder der übliche Desktop. Es ist zwar schon eine ganze weile her mit meinen java Aktionen aber das müsste so umzusetzen sein. 

Ciao


----------



## Elaut (13. Jan 2013)

Elaut hat gesagt.:


> Wieso sollten dann die Robot Anweisungen außerhalb des Fensters gehen, so wie bewege die Maus un klicke 3 mal. Genauso wie die Tastatur.


Aber nicht die  Maus lese aus Anweisung. 
Diese muss doch ganz einfach nur sagen welche Farbe sie gerade berührt und auf diese reagieren. 

Ciao


----------



## Spacerat (13. Jan 2013)

Elaut hat gesagt.:


> Wieso sollten die Robot Anweisungen außerhalb des Fensters gehen, so wie bewege die Maus un klicke 3 mal. Genauso wie die Tastatur. Es werden Tasten gedrückt, dass geschieht ja sich alles außerhalb eines Fensters bzw bräucht nicht mal eines. Zumal es ja eh nur ein mouse listener ist. Wenn ich jetzt das Programm schreiben wollte mit der Maus die die Farbe berührt und dann an die Koordinate x,y springt, die Farbe die wir vorher schon im Code aufgelistet haben. Dann würde ich das so machen und ohne frame: Ein mouseListener einfügen der die Koordinaten ausliest. Die Farbe schwarz mit 0,0,0 werten und die variable kreuze ich mittels intersection. Da brauche ich doch kein extra Fenster sonst kann ich mir das sehr gut vorstellen. Aber ansonsten ohne Fenster kann ich das ganze ganz gut auf den jetzigen Hintergrund projezieren, sei es ein geöffnetes Bild, eine Internetseite oder der übliche Desktop. Es ist zwar schon eine ganze weile her mit meinen java Aktionen aber das müsste so umzusetzen sein.
> 
> Ciao


Dann hast du in dieser Weile anscheinend vergessen, dass Listener nur innerhalb einer aktiven Java-Applikation Events empfangen können, MouseEvents obendrein auch nur dann, wenn sich die Maus gerade über der entsprechenden Komponente befindet. Du kannst vieles mit Robot und Threads machen, nur leider keine Klicks ausserhalb einer Java-Anwendung registrieren und genau das ist der Haken.


----------



## Network (13. Jan 2013)

@Elaut
Wenn du den ganzen Thread durchliest solltest du erkennen, warum der Code so umgesetzt wurde.

Wenn du aber meinst es geht auch anderst:
Da ist der Code von Spacerat... kopieren, umschreiben wie du denkst das es auch funktionieren sollte, testen und wiederkommen, neuen Code posten und berichten ob er funktioniert oder nicht.

Allein eine Aussage wie: Warum habt ihr es so gemacht? Es sollte auch anderst funktionieren!
Bei einer funktionierenden Lösung hat soviel Aussagewert wie das Ergebniss einer Diskussion mit einem mehrere Tage alten seelenlosen ungetoasteten Käsebrotes auf einer Veranda.
(Ja das ist extra kompliziert, musste mir irgendetwas unbedeutendes einfallen lassen. )

Gruß
Net


----------



## Elaut (13. Jan 2013)

Spacerat hat gesagt.:


> Dann hast du in dieser Weile anscheinend vergessen, dass Listener nur innerhalb einer aktiven Java-Applikation Events empfangen können, MouseEvents obendrein auch nur dann, wenn sich die Maus gerade über der entsprechenden Komponente befindet. Du kannst vieles mit Robot und Threads machen, nur leider keine Klicks ausserhalb einer Java-Anwendung registrieren und genau das ist der Haken.



Der listener kann doch Pixel auslesen, er muss ja keinen klick registrieren er soll dann einfach einen tätigen, wenn die Farbe im Hintergrund der der vorprogrammierten gleicht und dazu dient der Mauszeiger.  So verstehe ich das. naja ich mach dann mal alles fertig und versuche mich daran. 

Ciao


----------



## kaaeeAhnung (13. Jan 2013)

@Elaut

So wie es aussieht haben die zwei Herren,  Spacerat und Network mehr Ahnung,  was sie Materie Java angeht. 
Habe nochmal versucht, dass mit dem rectangle aber ich bekomme es, egal wie und was ich versuche nicht hin. 

Also, wenn ich jetzt den Mauszeiger als Auslöser haben möchte, wird eine Farbe angegeben,  den Mauszeiger mit mouse listener versehen und das alles in ein transparentes Applikationsfenster gesteckt, damit die Pixel im Hintergrund ausgelesen und darauf reagiert werden kann? Und wenn Zeiger über Farbe, dann minimiere Fenster ! Das wäre der beste Lösungsweg, 
lG


----------



## Spacerat (13. Jan 2013)

Also wenn du keine Klicks benötigst und nur die Mausbewegungen, dann gibt es noch die etwas dubiosere Variante mit Thread un busy waiting. Die ist aber nicht so toll, weil 1. "busy waiting" und 2. der Thread deswegen nicht jede Mausposition erwischt.
Ansonsten arbeitet die Pipette schon so, nur dass sie das transparente Fenster nicht minimiert, sondern geschlossen wird. Bei erneutem Klick auf "Farbe saugen" wieder geöffnet usw.
Lies mal die Kommentare in dem Code. Da gibt es 'ne Stelle, an welcher du mit der gelesenen Farbe machen kannst, was du willst. Speichern, mit anderen Farben vergleichen, die Maus per Robot an eine andere Stelle setzen usw. Du kannst dort bei entsprechenden Ereignissen das unsichtbare Fenster gleich minimieren (müsste "setVisible(false)" sein) oder schliessen.


----------



## kaaeeAhnung (13. Jan 2013)

So sieht das ganze jetzt aus, nur passt da irgendetwas schon wieder nicht. 
Die Pause habe ich eingefügt, damit er nicht direkt seine Aufgabe betätigt, sondern ich noch Zeit habe den Zeiger von der Farbe zu nehmen. Kannst du dir den Code bitte genau anschauen, danke.


```
package maus.de.de;

import java.awt.AWTException;
import java.awt.Color;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashSet;
import java.util.Set;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class Maus2 {
    public static void main(String[] args) {
        Robot r = null;
        try {
            r = new Robot();
        } catch(AWTException e) {
            System.exit(-1);
        }
        final Robot robot = r;
        final JFrame frame = new JFrame("ScreenPipette");
        final JPanel panel = new JPanel() {
            private static final long serialVersionUID = 1L;
            
 
            private final Point mouse = new Point();
            private final Set<Color> pickedColors = new HashSet<>();
            JFrame mini;
 
            {
                final JButton pipette = new JButton("Farbe saugen");
                
                add(pipette);
                pipette.addActionListener(new ActionListener() {
                	
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        if(mini != null) {
                            return;
                            
                        }
                        
                        mini = new JFrame();
                        mini.setUndecorated(true);
                        PointerInfo pi = MouseInfo.getPointerInfo();
                        mini.setSize(Toolkit.getDefaultToolkit().getScreenSize());
                        mouse.setLocation(pi.getLocation());
                        mini.setAlwaysOnTop(true);
                        mini.setOpacity((float) (1.0 / 255.0));
                        MouseAdapter ma = new MouseAdapter() {
                            @Override
                            public void mouseMoved(MouseEvent e) {
                                
                            	
                            	// auf dem EDT ist's egal (sogar eher willkommen),
                                // dass der Sender keine Events werfen kann.
                                mini.setOpacity(0.0F);
                                mouse.setLocation(e.getLocationOnScreen());
                                
                                Color c = robot.getPixelColor(mouse.x, mouse.y);
                                
                                // hier kann man mit der unverfälschten Farbe
                                // machen, was man will. Ich ändere z.B.
                                // den Hintergrund des "Farbe saugen"-Buttons
                                pipette.setBackground(c);
                                // ...danach aber muss die Opacity zurückgesetzt
                                // werden.
                                mini.setOpacity((float) (1.0 / 255.0));
                                repaint();
                                
                            }
 
                            @Override
                            public void mouseClicked(MouseEvent e) {
                                // da die unverfälsche Farbe nun die
                                // Hintergrundfarbe des "Farbe saugen"-Buttons
                                // ist, kann man sie sich von dort holen und
                                // ggf. in einem Set speichern. Dazu muss man
                                // nicht mal fürchten, dass in dieses Set
                                // doppelte Einträge gelangen.
                            	
                            	
                            	
                                pickedColors.add(pipette.getBackground());
                                
                                mini.setVisible(false);
                                try {
									Thread.sleep(2000);
								} catch (InterruptedException e1) {
								
									e1.printStackTrace();
								}
                                mini.dispose();
                                mini = null;
                                requestFocus();
                              
                                
                               
                                int x = 100, y = 150;
                                

                                if(pickedColors.equals(robot.getPixelColor(mouse.x, mouse.y)))
                                
                                 robot.mouseMove(x,y);
                                 robot.mousePress(InputEvent.BUTTON1_MASK ); 
                                 robot.mouseRelease(InputEvent.BUTTON1_MASK );
                            }
                        };
                        mini.addMouseListener(ma);
                        mini.addMouseMotionListener(ma);
                        mini.addFocusListener(new FocusListener() {
                            @Override
                            public void focusLost(FocusEvent e) {
                                if(mini != null) {
                                    mini.requestFocus();
                                }
                            }
                            
                            @Override
                            public void focusGained(FocusEvent e) {
                            }
                        });
                        mini.setVisible(true);
                    }
                });
            }
        };
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }
}
```


----------



## Spacerat (14. Jan 2013)

Es muss doch irgendwann mal... Du vergleichst ein Set mit einer Farbe... das ist nicht sinnvoll...:autsch:
Naja... langsam aber sicher weis ich kaum mehr, was du erreichen willst, hier noch mal ein wenig abgewandelter Code:

```
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.HashSet;
import java.util.Set;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ScreenPipette {
	public static void main(String[] args) {
		final Set<Color> pickedColors = new HashSet<>();
		Robot r = null;
		try {
			r = new Robot();
		} catch(AWTException e) {
			System.exit(-1);
		}
		final Robot robot = r;
		final JFrame frame = new JFrame("ScreenPipette");
		final JPanel panel = new JPanel() {
			private static final long serialVersionUID = 1L;

			JFrame mini;

			{
				final JButton pipette = new JButton("Farbe saugen");
				add(pipette);
				pipette.addActionListener(new ActionListener() {
					@Override
					public void actionPerformed(ActionEvent e) {
						if(mini != null) {
							return;
						}
						mini = new JFrame();
						mini.setUndecorated(true);
						mini.setSize(Toolkit.getDefaultToolkit().getScreenSize());
						mini.setAlwaysOnTop(true);
						mini.setOpacity((float) (1.0 / 255.0));
						MouseAdapter ma = new MouseAdapter() {
							@Override
							public void mouseClicked(MouseEvent e) {
								// da die unverfälsche Farbe nun die
								// Hintergrundfarbe des "Farbe saugen"-Buttons
								// ist, kann man sie sich von dort holen und
								// ggf. in einem Set speichern. Dazu muss man
								// nicht mal fürchten, dass in dieses Set
								// doppelte Einträge gelangen.
								Color c = pipette.getBackground();
								if(!pickedColors.contains(c)) {
									// Wenn die gepickte Farbe noch nicht in
									// der Liste ist, wird's Zeit...
									pickedColors.add(c);
								} else {
									// ...sonst verschwindet der unsichtbare
									// Frame nämlich ganz und selektiert zum
									// Abschied noch ein paar Programmzeilen,
									// sofern vorhanden.
									mini.setVisible(false);
									mini.dispose();
									mini = null;
									robot.mouseMove(700, 500);
									robot.mousePress(MouseEvent.BUTTON1_DOWN_MASK);
									robot.mouseMove(800, 600);
									robot.mouseRelease(MouseEvent.BUTTON1_DOWN_MASK);
									requestFocus();
								}
							}

							@Override
							public void mouseMoved(MouseEvent e) {
								// auf dem EDT ist's egal (sogar eher willkommen),
								// dass der Sender keine Events werfen kann.
								mini.setOpacity(0.0F);
								Color c = robot.getPixelColor(e.getXOnScreen(), e.getYOnScreen());
								// hier kann man mit der unverfälschten Farbe
								// machen, was man will. Ich ändere z.B.
								// den Hintergrund des "Farbe saugen"-Buttons
								pipette.setBackground(c);
								// ...danach aber muss die Opacity zurückgesetzt
								// werden.
								mini.setOpacity((float) (1.0 / 255.0));
								repaint();
							}
						};
						mini.addMouseListener(ma);
						mini.addMouseMotionListener(ma);
						mini.addFocusListener(new FocusListener() {
							@Override
							public void focusLost(FocusEvent e) {
								if(mini != null) {
									mini.requestFocus();
								}
							}
							
							@Override
							public void focusGained(FocusEvent e) {
							}
						});
						mini.setVisible(true);
					}
				});
			}
		};
		frame.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				frame.setVisible(false);
				frame.dispose();
				for(Color c : pickedColors) {
					System.out.println(c);
				}
			}
		});
		frame.add(panel);
		frame.pack();
		frame.setVisible(true);
	}
}
```
1. Die Farben speichere ich, während die Maus bewegt wird. Dazu verwende ich den Hintergrund des Buttons, damit ich sehe, welche Farbe sich unter der Maus befindet. Eine Membervariable vom Typ Color tut es aber auch.
2. Bei einem Klick hole ich mir die Farbe sinnigerweise aus genau jenem Register, wo ich sie bei "mouseMoved()" gespeichert habe. Wenn ich bei diesem Klick die Maus "verrissen" habe, macht das also nichts, die Farbe war ja bereits registriert. Was ich nun mit dem Farbregister anstelle, ist offen... Ich kann schauen, ob die Farbe zuvor schon mal gesaugt wurde, kann die Farbe als Zeichenfarbe für andere Panels benutzen und und und. Diesmal speichere ich sie in einer Liste. Wenn sie in dieser Liste bereits vorhanden war, breche ich den "Saugvorgang" ab, schliesse das Fenster und markiere ein paar Textzeilen, sofern sich gerade welche im vordefinierten Bereich befinden. Wenn ich nun die Anwendung komplett verlasse, werden in der Konsole alle gesaugten Farben der Sitzung angezeigt.

Ich denke, damit müsstest du deinen Anwendungsfall hinbekommen.

1. "Set WO" ist ein Button mit einem ActionListener. In seiner "actionPerformed()"-Methode öffnest du ein unsichtbares Fenster in Screengrösse, addest wie gewohnt einen MouseListener in dessen "mouseClicked()" du die Koordinaten der Stelle speicherst, die gedrückt werden soll.
2. "Set Welche Farbe" ist genau jener Code meiner ScreenPipette.
3. "Set Active"... unsichtbares Fenster, wie gehabt, Pipette wie gehabt, nur mit dem Unterschied, dass diesmal keine Farbe gespeichert wird, sondern die Maus per Robot an die Position aus Button "Set WO" gefahren und betätigt wird.
Das Ganze sieht dann so aus:

```
import java.awt.AWTException;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;

public class ButtonClicker {
	public static void main(String[] args) {
		Robot r = null;
		try {
			r = new Robot();
		} catch (AWTException e) {
			System.exit(-1);
		}
		final Robot robot = r;
		final JFrame frame = new JFrame("ButtonClicker") {
			private static final long serialVersionUID = 1L;
			private static final String DESTINATION = "Ziel";
			private static final String COLOR = "Farbe";
			private static final String ACTIVE = "Aktivieren";

			JFrame invisible;
			Point moveTo = new Point();
			JButton pipette, destination, active;
			String activeCommand;
			ActionListener al = new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					activeCommand = e.getActionCommand();
					if (invisible != null) {
						return;
					}
					invisible = new JFrame();
					invisible.setUndecorated(true);
					invisible.setSize(Toolkit.getDefaultToolkit()
							.getScreenSize());
					invisible.setAlwaysOnTop(true);
					invisible.setOpacity((float) (1.0 / 255.0));
					invisible.addMouseListener(ma);
					invisible.addMouseMotionListener(ma);
					invisible.addFocusListener(new FocusListener() {
						@Override
						public void focusLost(FocusEvent e) {
							if (invisible != null) {
								invisible.requestFocus();
							}
						}

						@Override
						public void focusGained(FocusEvent e) {
						}
					});
					invisible.setVisible(true);
				}
			};
			MouseAdapter ma = new MouseAdapter() {
				@Override
				public void mouseClicked(MouseEvent e) {
					if (DESTINATION.equals(activeCommand)) {
						moveTo.setLocation(MouseInfo.getPointerInfo()
								.getLocation());
					}
					invisible.setVisible(false);
					invisible.dispose();
					invisible = null;
				}

				@Override
				public void mouseMoved(MouseEvent e) {
					if (COLOR.equals(activeCommand)) {
						invisible.setOpacity(0.0F);
						Color c = robot.getPixelColor(e.getXOnScreen(),
								e.getYOnScreen());
						pipette.setBackground(c);
						invisible.setOpacity((float) (1.0 / 255.0));
					} else if (ACTIVE.equals(activeCommand)) {
						Color c1 = robot.getPixelColor(e.getXOnScreen(),
								e.getYOnScreen());
						Color c2 = pipette.getBackground();
						if(c1.equals(c2)) {
							invisible.setVisible(false);
							invisible.dispose();
							invisible = null;
							robot.mouseMove(moveTo.x, moveTo.y);
							robot.mousePress(MouseEvent.BUTTON1_DOWN_MASK);
							robot.mouseRelease(MouseEvent.BUTTON1_DOWN_MASK);
						}
					}
				}
			};

			{
				setLayout(new GridLayout(3, 1));
				destination = new JButton(DESTINATION);
				pipette = new JButton(COLOR);
				active = new JButton(ACTIVE);
				destination.addActionListener(al);
				pipette.addActionListener(al);
				active.addActionListener(al);
				add(destination);
				add(pipette);
				add(active);
			}
		};
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.pack();
		frame.setVisible(true);
	}
}
```


----------

