Java - Mausklick abfragen

MCStreetguy

Stammuser
Hey Leute :)

Ich arbeite im Moment an einem Bot für ein Spiel der in einer bestimmten
Reihenfolge verschiedene Bildschirmpositionen anklicken soll. :)
Ist nicht sonderlich kompliziert, aber ich bin auf ein Problem gestoßen :/
Ich möchte den Bot universell einsetzbar machen...
Dafür programmiere ich grade einen Assistenten der den User bittet
alle notwendigen Positionen nacheinander anzuklicken um die Position
zu bestimmen :)

Klingt ja alles schön und gut aber nach knapp 2 Stunden Recherche ist mir
klar geworden das das scheinbar nicht so einfach geht :/
Ich bin auf Begriffe wie "MouseListener" oder "MouseEvent" gestoßen,
aber soweit mir bekannt ist bezieht sich das ja immer nur entsprechend auf
das eigenen Fenster :/

Jetzt ist meine Frage ob es möglich ist die Abfrage für ein anderes
Programm durchzuführen und wenn ja wie? :/
Alternativ schwebt mir eine Art Overlay vor das dann die Mausklicks
abfängt und verarbeitet aber ich weiß nicht wie ich das machen soll da das
Overlay logischerweise durchsichtig sein müsste :/

Ich hoffe ihr könnt mir weiterhelfen :)
LG, MCStreetguy
 
Zuletzt bearbeitet:

GrafZahl

Member of Honour
tja ... schauen wir und mal an wie eine maus funktioniert ...

vorbei sind die zeiten in denen das über direkte hardware interrupts gemacht wurde, aber so tief müssen wir ja gar nicht gehen ...

sagen wir mal eine maus ist ein gerät das in irgend einer weise eingaben an dein system gibt, und dort dann eine reaktion auslöst

diese eingaben werden vom betriebssystem verarbeitet, und an die entsprechenden programme weiter gegeben... wenn du die maus ein minimales detektierbares stück in eine richtung bewegst, kommt diese änderung beim betriebssystem an, und es macht z.B. aus einer relativen bewegung (x richtung plus 1) eine entsprechende absolute position eines mauszeigers

nun ist es in betriebssytemen so, dass sie nicht jedes programm per default darüber informieren wie sich die maus gerade bewegt ... applikationen die fenster haben, registrieren beispielsweise oft listener beim betriebssystem die dann über maus aktionen benachrichtigt werden ... diese listener werden aber meistens dann auch nur benachrichtigt, wenn die maus-koordinaten innerhalb des jeweiligen fensters liegen, oder die anwendung im vordergrund ist ...

für die meisten anwendungen die mit einer maus arbeiten reicht das ...

nun kommst du und willst alles ... sozusagen am besten vorbei an dieser ganzen vorauswahl die ereignisse nur an die fenster gibt die es betrifft ...

leider greift java die mausereignisse erst nach dieser vorauswahl ab, weswegen dein vorhaben so in reinem java nicht machbar ist...

ganz gallien? ... nein ...

du kannst natürlich abhänig vom jeweiligen betriebssystem direkt native maus und/oder tastatur ereignisse bekommen ...

glücklicherweise bist du nicht der erste mit diesem problem und statt nun selbst eine bibliothek zu schreiben, welche für alle möglichen betriebssysteme die low level anbindung realisiert, gibts sowas schon ...

https://code.google.com/p/jnativehook/

vereinfacht gesagt tut diese bibliothek das was du haben willst, und greift auf die grundlegenden maus und tastatureingaben zu, so wie sie herein kommen, und nicht wie das OS sie an die applikationen verteilt ...


deine google stichworte wären gewesen: java global mouse hook
 

MCStreetguy

Stammuser
Danke für die hilfreiche Antwort :)
Ich hab das mal mit JNativeHook versucht aber ich blicke da nicht so
ganz durch :/ Ich hab die Beispiele vom Entwickler zu Rate gezogen
aber hab trotzdem nicht so ganz verstanden wie ich damit zu arbeiten habe... :/

Also wie genau mache ich das wenn ich eine Funktion schreiben will,
die bis zu einem Mausklick wartet und dann die aktuelle Position zurückgibt? :eek:
 

MCStreetguy

Stammuser
Mein bisheriger Ansatz besteht aus 3 Funktionen...
Aber alles was da bisher anstelle der XXX-Kommentare stand,
hat nicht funktioniert :/


Code:
package main;

import org.jnativehook.*;

public class MouseClickListener {
	
	public MouseClickListener() {
		
	}

	public boolean isClicked() {
		//XXX
		return false;
	}
	
	public int getX() {
		//XXX
		return 0;
	}
	
	public int getY() {
		//XXX
		return 0;
	}
}
 

MCStreetguy

Stammuser
Die hab ich mir schon angesehen, hat mich aber nicht viel weiter gebracht :/
Mein Programm besitzt bisher kein Interface weil es nicht notwendig war :/

Kann ich JNativeHook nicht ohne ein Interface benutzen um einen Mausklick als Bedingung für eine while-Schleife abzufragen? :/
 

Tsjuder

Stammuser
Also ich hab diese API noch nie benutzt, aber in deinem Code steht nichts was die Methoden aufrufen würde. Kann natürlich sein, dass du ein Objekt der Klasse an irgendwas in der Main Methode übergeben hast. Ich vermute aber mal, ohne sich die API anzugucken, dass du das Interface implementieren musst. Warum sollte das ein Problem sein... Oder kann es sein, dass du nicht wirklich weißt was das ist?
 

GrafZahl

Member of Honour
*soifz*

aaaalso ... das interface ist dafür da, dass du gezwungen wirst die im interface hinterlegten methoden zu implementieren ... im einfachsten fall als leere rümpfe

warum?

weil sobald du das objekt deiner klasse, welche das interface implementiert bei GlobalScreen.getInstance().addNative...() registriert hast, wird die library deine funktionen aufrufen, immer dann wenn das betreffende ereignis eintritt ...

da kannst du dann darauf reagieren

wenn du nur leere rümpfe da drin hast, pasiert natürlich nix...

das alles wäre dir überigens klar, wenn du das beispiel einfach mal im debuger ausprobiert und ein paar haltepunkte gesetzt hättest ...
 
Oben