Bot, Mausklicke simulieren

oOJavaNeulingOo

Bekanntes Mitglied
Guten Tag!

Ich hätte ein paar Fragen. Wie kann man Mausklicke simulieren, ohne die "echte" Maus zu benutzen? Also, dass quasi in dem Programm selbst eine "zweite" Maus klickt.
Und wie kann ich irgendein Programm, zB Browserfenster, öffnen - Ohne es wirklich zu öffnen? Also, Beispiel: Mein Programm startet zB ein Spiel wie zB Terraria - Der Benutzer, also ich, merkt nichts davon. (Also dass das Spiel gestartet wird - Das Programm selbst soll es ja machen, und ich will nicht ständig ein Fenster rumhängen haben) Dann kann man dem Programm zB Locations zuteilen, und es simuliert dann Mausklicke, in eben jenem nicht sichtbarem Spiel, Browserfenster, whatever. Ist sowas möglich? Ich will nämlich gerne einen kleinen Bot schreiben.



MfG
 
Zuletzt bearbeitet von einem Moderator:
P

Pippl

Gast
Die Klasse Robot kann glaub ich die Mausklicks simulieren.

Aber dass, das Fenster nicht sichtbar ist während dessen geht glaub ich nicht. Da der Klick ja dann ins Leere geht!
 

oOJavaNeulingOo

Bekanntes Mitglied
@Pippl Vielen Dank für die Antwort! Eben das ist ja das Problem - Ich will keinen echten Klick; Schließlich will ich auf dem PC solange was anderes machen; Aber einen "Fake"-Klick in einem unsichtbarem Fenster..
 
S

SlaterB

Gast
was hat das in Java-Basics zu suchen?, verschoben,
strenggenommen überhaupt nicht mal ein Thema für Java

Java zeichnet sich im besonderen Maße dadurch aus, dass alles in einem festen Rahmen/ Speichermodell/ vorgegebenen Swing-Fenster, überhaupt im EIGENEN Programm usw. passiert,
für Betriebssystem-, Browser- und sonstige Hintergrund-Manipulationen sind andere Sprachen überlegenswerter

ansonsten ist das Thema auch weit zu hoch und bisschen anrüchig, Bots sind meist Betrug,
aber nun genug Plauderei von mir

(edit: kleiner Scherz am Rande zur untigen Antwort:
bei Bankeinbruch lernt man auch wunderbar Tresore abzustauben und Geld sauber zu zählen)
 
Zuletzt bearbeitet von einem Moderator:

oOJavaNeulingOo

Bekanntes Mitglied
Nunja, ich will mir einen Bot machen um meine Minecraft-Farm zu automatisieren - Und um etwas zu lernen, gleichzeitig - Und anfangen eine andere Sprache zu lernen, nur um einen kleinen sinnlosen Bot zu machen will ich nicht :D Wie gesagt will ich dabei auch was lernen.

Ich habe schon an an eom durchsichtiges JWindow gedacht - Allerdings wären dann zwei Probleme: ES sind echte Klick, das Fenster ist sichtbar, und man kann sicherlich nicht durch einen JWindow "hindurchklicken"..
 
Zuletzt bearbeitet:
S

SlaterB

Gast
'java minecraft bot' in Suchmaschinen findet übrigens ne Menge,
ganze fertige Projekte wie
https://github.com/nevercast/Minecraft-Bot
mit Quellcode

glaube nicht, dass hier im Forum vergleichbar produktives rauskommt

ob du das alles verstehst wenn du noch mit int-Berechnungen haderst ist eine andere Frage,
erwähne ich nur zur allgemeinen Abwägung deiner Ziele, nicht aus Häme
 

oOJavaNeulingOo

Bekanntes Mitglied
@SlaterB Vielen Dank :)!

Problem hierbei: Ich will es selbst machen :D

Und da ich weiß, dass ein "richtiger" Bot viel zu kompliziert wird, dachte ich halt einfach daran eben so eine Art durchsichtiges Fenster mit Fake-Klicks zu machen :/
 
T

tröööt

Gast
Guten Tag!

Ich hätte ein paar Fragen. Wie kann man Mausklicke simulieren, ohne die "echte" Maus zu benutzen? Also, dass quasi in dem Programm selbst eine "zweite" Maus klickt.
Und wie kann ich irgendein Programm, zB Browserfenster, öffnen - Ohne es wirklich zu öffnen? Also, Beispiel: Mein Programm startet zB ein Spiel wie zB Terraria - Der Benutzer, also ich, merkt nichts davon. (Also dass das Spiel gestartet wird - Das Programm selbst soll es ja machen, und ich will nicht ständig ein Fenster rumhängen haben) Dann kann man dem Programm zB Locations zuteilen, und es simuliert dann Mausklicke, in eben jenem nicht sichtbarem Spiel, Browserfenster, whatever. Ist sowas möglich? Ich will nämlich gerne einen kleinen Bot schreiben.



MfG

also DAS geht SO schon mal überhaupt nicht ...

du kannst nicht mal eben ein programm im "hintergrund" laufen lassen ... schon gar nicht wenn es diese funktion selbst nicht anbietet ... ein OS kann hier keinen einfluss drauf nehmen ...
weiterhin kannst du auch nicht in einem nicht-existierenden fenster mit einer nicht-vorhandenen "zweiten maus" einen klick machen ...

sorry ... aber alleine auf eine solche idee zu kommen zeigt das man scheinbar überhaupt keinen plan hat was überhaupt im hintergrund so alles abläuft ... ich weis gar nicht wie ich es anders ausdrücken soll ...
klar dürfte es möglich sein mehrere von ein ander unabhängige zeige-geräte nutzen zu können ... aber selbst dann kann man nicht auf etwas klicken was nicht da ist ...

und alleine schon wieder "Minecraft" ... warum denken immer alle das die lösung auf alle fragen HIER zu finden ist ? ... ist zwar richtig das dies hier ein JAVA-fachforum ist ... aber mit meincraft dürften sich hier nur die wenigstens soweit auskennen das sie zu sowas überhaupt hilfe leisten könnten ...

als gegenfrage : denkst du nicht auch das die chance das dir jemand bei fragen zu minecraft helfen kann in einem speziellen minecraft-forum größere wäre als in einem java-forum ?

um mal einen ganz blöden vergleich zu ziehen : nur weil Crysis so erfolgreich ist haben auch nicht hunderte hirn-amputierte damit begonnen irgendeinen ableger von C zu lernen um das game zu modden ...

nur weil mc in java geschrieben ist wird in JAVA-foren so ein hype drum gemacht ... mc hätte echt besser in C/++ geschrieben werden sollen ... dann hätten wir das ganze nich ... zu mal es dann auch deutlich performanter wäre


gosh ... geht es eigentlich noch ?

klar könntest du ... eben gerade weil es java ist ... dich von außen in den EDT klinken und so events feuern ... wäre zumindest ein weitaus besserer ansatz als irgendwo ein fenster im nichts verschwinden zu lassen und darauf rumklicken zu wollen ...


und mal ein direktes wort :

von deinen threads kann man gut deinen wissens-stand ableiten .. und dieser äußert sich nur sehr marginal ... und dann willst du nur um java ein bisschen besser zu lernen mal eben einen MC-bot schreiben ... OUCH ... solche höhenflüge hätte ich auch gerne mal ohne mir sonst was reinziehen zu müssen ...
 
A

Al kuez

Gast
Hallo oOJavaNeuling,

im Gegensatz zu manchen anderen finde ich Dein Anliegen gar nicht so doof. Ich finde es auh etwas schade, wenn sich Leute hier zu potenziell entmutigenden Äußerungen hinreißen lassen. Jeder hat mal angefangen, mit wenig Wissen - und deshalb: Gute Frage. Natürlich muss man eine Menge lernen, wenn man weiter kommen will. Bei dem Thema kannst du eine ganze Menge über Java UND Windows lernen.

Ich finde es auch nicht falsch, in einem Forum nachzufragen, wenn man Neuland betritt.
Das würde ja sonst heißen, dass man auch keine Bücher lesen darf, sonst isses nich alleine gemacht ;-). So funktioniert das nicht. Informationsbeschaffung ist das A&O im Entwicklerleben.

Auch wenn es eine eher ungewöhnliche Fragestellung ist, finde ich sie hier im allgemeinen Thread durchaus passend plaziert. Wo sonst, wenn es keinen spezifischen Thread dafür gibt? Na gut. Du könntest natürlich auch einen neuen Thread starten...

Jetzt zur Problemstellung.
  • Jedes Java-Programm läuft in einer eigenen Instanz der JVM, das heißt, in einem eigenen Windows-Prozessraum (oder denen eines anderen OS).
  • Die verschiedenen JVM-Instanzen wissen nichts von einander. Wenn ein Programm keine Schnittstelle bietet für die Fernsteuerung, ist es anders als über den von Dir angedachten Weg kaum zu realisieren, so ein Programm zu steuern. Wenn das Programm Schnittstellen für den Remotezugriff bieten würde (z.B. über REST oder SOAP), müsste man die auch erst einmal herausfinden.
  • Deshalb ist die Idee mit den simulierten Mausklicks gar nicht so schlecht. Das ist nämlich die Schnittstelle für das UI zur Steuerung und in diesem Fall wohl die einzige Möglichkeit. Natürlich ist es tricky. Und, ob's wirklich funktioniert, steht noch auf einem anderen Blatt.
  • Richtig ist, dass unsichtbare Fenster auch nicht angeklickt werden können. Ein unsichtbares Fenster kann nicht fokussiert werden. Das ist aber die Voraussetzung, um Tastatur- bzw. Mausevents zu empfangen. Dann versuche doch mal das Fenster zu verstecken.
  • Bei dem allem kommst du unter Windows allerdings nicht um COM (Component Object Model) herum. Das ist die Technologie, auf der Schnittstellen von Windows und Windowsprogrammen basieren (die JVM für Windows ist ein Windowsprogramm, welches eine virtuelle Java-Maschine unter Windows bereitstellt).
  • Das Thema ist nicht trivial und für einen (relativen) Anfänger vielleicht noch zu komplex. Und ob der Ansatz funktioniert, ist nicht sicher:
    1. Das Fenster darf nicht unsichtbar sein. also verstecken wir es über den rechten Bildschirmrand hinaus (auch dafür braucht man COM), so dass es quasi außerhalb des sichtbaren Bildschirmbereichs liegt. Es wäre dann nicht unsichtbar und könnte auch fokusiert werden, wäre aber mit der pysikalischen Maus natürlich nicht anklickbar. Deshalb ist die Überlegung auch gut, Mausklicks zu simulieren.
    2. Die nachfolgenden Schritte laufen über COM (bzw. eine Bibliothek, die den Zugriff über COM ermöglicht):
      • Fensterhandle beziehen
      • Fenster über den rechten Bildschirmrand verschieben (horizontale Auflösung)
      • Danach aus Deinem Programm heraus die Maus-Events (Messages) über COM auslösen (natürlich mit den passenden Koordinaten).
      • Ggf. eigenes Fenster für eine kurze Zeit einfrieren (über COM kurz schlafen legen: eigenen Fensterhandle ermitteln, passende Methode, vielleicht sleep? weiß ich aktuell nicht.).
    3. Zur internen Steuerung deines Programmes wäre der Einsatz Threads ratsam.
    4. Wenn Windows für die Nachricht nicht die sichtbaren Grenzen des Monitors kontrolliert und außerhalb liegende Werte abfängt, könnte es funktionieren... - oder es gibt eine Exception.

Für Java gibt es Bibliotheken wie JACOB (Java-COM-Bridge), mit denen der Zugriff über COM möglich ist. Und Kenntnisse zur Windows API werden auch vonnöten sein.

Das waren jetzt nur mal ein paar Denkansätze, wie das funktionieren könnte - wie gesagt, das ist nicht trivial. Und die Lösung wird sicher sicher eine Zeit beschäftigen.

Natürlich ist es nicht ganz im Sinne von Java, native Betriebssystemoperationen aus einem Javaprogramm auszuführen. Dein Programm liefe dann nur noch unter Windows.
Andererseits gibt es auch in der Praxis Anwendungsfälle, die so etwas nötig machen.
Und diese Aufgabe ist nicht anders zu lösen, als native Windows-Funktionen zu verwenden, ob in Java-Libraries gekapselt oder nicht.


Viel Spaß!
 
T

tröööt

Gast
@Al kuez
ganz nette idee ... ABER :
TO hat gesagt.:
Schließlich will ich auf dem PC solange was anderes machen
was dann wieder das problem aufwerfen würde : WIE ?
denn wenn das "versteckte" fenster den focus hat um mouse-/key-events zu empfangen kann man so lange nicht in einem anderen programm arbeiten ... zumindest nicht ohne das der focus wechselt ...

und genau desshalb ist das vorhaben NICHT möglich ... mann kann halt immer nur eine sache im focus haben ... zwei gleichzeitig GEHT EINFACH NICHT ... und genau desshalb ist das vorhaben von TO auch völlig sinnlos ... denn selbst mit der von dir beschriebene methode kann man nicht gleichzeitig im "hintergrund" minecraft automatisiert laufen lassen und "nebenbei" z.b. n full-screen-shooter wie crysis zocken ... oder auch nur z.b. vernünftig einen foren-post verfassen da der focus ja ständig auf dem anderen fenster liegt ...


ergo : entweder direkt in die VM hooken (was im übrigen so möglich ist ... nur mal nebenbei) oder es sein lassen da nicht möglich ...

und wie du schon sagtest : es ist nicht wirklich sinnvoll java dazu zu verwenden um Win-COM aktionen ablaufen zu lassen ... dafür würde sich C oder eine seiner ab-arten deutlich besser eignen ... zu mal C# (also DotNET) direkt COM anbietet ...

ich find es ja positiv das du TO mut machen willst ... aber das was er vorhat ist nun mal schlicht einfach nicht möglich ... PUNKT
 

m7x

Mitglied
Ich wollt sowas auch mal machn.
Hab dann irgendwann aufgegeben, aber ich hatte damals die Idee nen virtuellen Desktop laufen zu lassen und auf dem das Fenster zu kontrollieren. Trotzdem haben die andren leider recht ich halte es für so gut wie unmöglich und vor allem nicht mit JAVA. Aber Probieren geht über studieren. Wenns dir doch gelingt melde dich doch einfach nochma :)

Viel Spaß beim Forschen :)
m7x
 
M

Marcinek

Gast
Verstehe ich nicht. Oben ist ein Bot für minecraft. Den kann man sich nutzen u d lernt eine Menge dabei.

"Ich will alles alleine machen" und dann so ein Thread sind doch wiedersprüchlich. Und sagen doch nur aus: wirklich Bock hat man ja nicht dazu.
 
A

Al kuez

Gast
Hallo,

@tröööt:
... zumindest nicht ohne das der focus wechselt ...
Genau. so hatte ich das ja auch gemeint. Der Focus muss natürlich nur für eine sehr kurze Zeit an das versteckte Fenster gegeben werden.
Dann wird ein Mausklick simuliert und der Focus wieder an das vorher aktive Fenster gegeben.

Ich behaupte nicht, dass es elegant ist, auch nicht, dass es super laufen muss, aber es kann funktionieren. Dem Ansatz liegt ja zugrunde, dass nicht zwei Fenster gleichzeitig den Fokus haben können.

Gerade für die Fensterwechsel braucht man Zugriff auf die Windows-Api-Funktionalität, ob nun über Libs, Interfaces (wie JNI, JNA oder JACOB). Hooken der Mausklicks in die VM, ok, aber da man ohnehin Zugriff auf native Windows-Funktionalität bräuchte, könnte man gleich alles so erledigen.

und wie du schon sagtest : es ist nicht wirklich sinnvoll java dazu zu verwenden um Win-COM aktionen ablaufen zu lassen ... dafür würde sich C oder eine seiner ab-arten deutlich besser eignen ... zu mal C# (also DotNET) direkt COM anbietet ...

So habe ich das nicht gesagt. Ich habe lediglich ausgedrückt, dass damit natürlich die Plattformunabhängigkeit verloren geht. Darüber hinaus habe ich gesagt, dass es in der Praxis Fälle gibt, wo das sogar erforderlich ist, die Existenz der o.g. Technologien beweist das ja geradezu.
Ansonsten ist es doch legitim, das aus Java heraus zu lösen, vor allem, wenn man es nur auf seinem eigenen System einsetzen will.
Ob die Lösung dann auch einigermaßen flüssig läuft und nicht zu sehr nervt, steht doch erstmal noch auf einem anderen Blatt.

Und das alleine machen zu wollen, ist doch eher positiv. Das bedeutet, dass man was lernen will. Und der Zugriff auf native Betriebssystemfunktionen kann in bestimmten Anwendungsfällen auch aus Java heraus sogar sehr nützlich sein. Dann ist es gut, wenn man schon mal Erfahrung damit hat.

Du verweist an anderer Stelle im Forum (zur Simulation von Mausklicks) auf die Klasse java.awt.Robot. Die greift auch auf native Betriebssystem-Funktionen zu und schreibt in die jeweiligen OS-MessageQueues. Dass Robot auf manchen OS zusätzliche Berechtigungen für den Zugrif auf Low-level Betriebssystemfunktionen braucht, auf manchen Betriebssystemen sogar zusätzliche Bibliotheken, zeigt, dass die Plattform-Unabhängigkeit damit auch nur noch bedingt gegeben ist. Worüber regst du dich also auf?

Natürlich ist es ok, es zum Ausdruck zu bringen, wenn man etwas nicht sinnvoll findet. Das kann man aber auch sachlicher machen.

Jemanden seinen vermeintlichen geringen Kenntnisstand vorzuhalten, finde ich übrigens keinen guten Stil, und es ist überheblich. Wie ich in meinem vorherigen Beitrag schon geschrieben habe, haben wir alle mal angefangen. Und ganz sicher mit einem deutlich geringeren Kenntnisstand als heute - und dafür, beim Weiterkommen zu helfen, sind solche Foren schließlich auch da.

Und typographisch laut zu werden (ganze Wörter und Sätze in Großbuchstaben), finde ich stilistisch auch nicht gerade vorteilhaft.

Du hättest zum Beispiel ja was in der Art schreiben können, wie "zwei Fenster gleichzeitig können nicht fokussiert sein. Deshalb kannst du nicht ohne weiteres Mausklicks im einen Fenster simulieren, während Du in einem anderen spielst oder arbeitest. Für die Simulation von Mausklicks kann ich dir aber die Klasse Robot empfehlen. ..." Und dann noch ein freundlicher Link auf die Java-API... - das wäre doch was gewesen. Auf die Idee, den Fokus der Fenster zu wechseln (in einer Schleife, und mit sleep), hättest Du ja auch kommen können.
Mit Robot gibt es keine Möglichkeit, direkt einen Handle auf ein anderes Fenster zu beziehen. Deshalb wäre eine andere Schnittstelle (die die native WinAPI-Methode findWindow kapselt) in diesem speziellen Fall vielleicht sinnvoller. Aber "geht gar nicht" stimmt schon mal auf dieser Ebene nicht.

In deiner ersten Antwort auf oOJavaNeulingOo hast du geschrieben
also DAS geht SO schon mal überhaupt nicht ...

du kannst nicht mal eben ein programm im "hintergrund" laufen lassen ... schon gar nicht wenn es diese funktion selbst nicht anbietet ... ein OS kann hier keinen einfluss drauf nehmen ...
weiterhin kannst du auch nicht in einem nicht-existierenden fenster mit einer nicht-vorhandenen "zweiten maus" einen klick machen ...

sorry ... aber alleine auf eine solche idee zu kommen zeigt das man scheinbar überhaupt keinen plan hat was überhaupt im hintergrund so alles abläuft ... ich weis gar nicht wie ich es anders ausdrücken soll ...
klar dürfte es möglich sein mehrere von ein ander unabhängige zeige-geräte nutzen zu können ... aber selbst dann kann man nicht auf etwas klicken was nicht da ist ...

Aber der von oOJavaNeulingOo angedachte Weg geht eben auch. Auch sowas, was quasi kein echter Mausklick ist, diesen aber ersetzt. Das geht dann auch im Hintergrund. Dazu darf das Fenster sogar unsichtbar sein. Das erfordert aber schon ein sehr fortgeschrittenes Grundlagenwissen von Java. Frameworks wie Spring, Struts, Hibernate, um nur wenige zu nennen, nutzen die dem zugrundeliegenden Technologien, sonst ginge das, was diese Frameworks machen nämlich überhaupt nicht. Findest du es heraus?

Vielleicht stellst du dich ansonsten mal vor einen Spiegel. Der reflektiert dann dich und du villeicht ein wenig über dich selbst. Dann kommst du vielleicht zu der tiefgreifenden Erkenntnis, dass du, wie alle anderen auch, sehr viel mehr nicht weißt, als du weißt. Es gibt also keinen Grund für Überheblichkeit.

In diesem Sinne einen schönen Gruß
 
T

tröööt

Gast
ich erachte das ganze immer noch als so ziemlich sinnfrei .. ganz gleich wie man es löst ...

denn fakt ist : TO will im "hintergrund" eine anwendung automatisieren die von sich aus dafür keine schnittstellen anbietet ...
und in der regel dürfte es auch noch grundlegend etwas mehr brauchen als nur mal n kurzen focus-wechsel um mal eben schnell einen klick zu simulieren um das was TO vorhat wirklich umzusetzen ...

das problem ist halt das selbst nach der von dir beschriebenen methode es eben nicht möglich ist das ganze komplett in den hintergrund zu schieben um den desktop so normal weiter verwenden zu können ... beispiele habe ich genannt ...

was wie gesagt noch ein ansatz sein könnte wäre sich direkt in die VM einzuklinken und dort direkt events in die event-queue des dort laufenden EDT einzuschleusen ... und selbst dann dürfte einem ohne weitreichende kenntnisse der jeweiligen ziel-anwendung immer noch das analysieren des ergebnisses probleme bereiten ... wobei man sich hier auch wieder tricks wie reflections bedienen könnte um einen gewissen status eines bestimmten objektes auszulesen ...

alles in allem ist es ein sehr komplexes projekt was die fähigkeiten von TO übersteigen dürfte ... und mit allem anderen was hier so kam kommt er höchstens so halb in die nähe ... muss dabei aber in kauf nehmen das er seinen desktop nicht "normal weiter verwenden kann" ...

da kannst du noch so argumentieren ... es wird TO bloß nicht weiterhelfen ...
 
A

Al Kuez

Gast
  • Den Sinn hat TO ja selbst definiert und beschrieben. Ob es wie gewünscht funktioniert, ist eine andere Frage.
  • Ich habe jedenfalls selbst geschrieben, dass es möglicherweise nicht rund läuft.
  • Ich weiß nicht, wie oft TO Klicks auslösen muss. wenn er mehr 1 in ein paar Sekunden auslösen wollte, würde es wohl schon holprig werden, weil eine geringe Zeitspanne musst du der Zielanwendung lassen, das Event auch zu empfangen (Prozessmanagement). Sowas schränkt diese Lösung natürlich ein, und es gibt mehrere Möglichkeiten für unangenehme Seiteneffekte. Ob das für TOs Vorhaben dann reicht, weiß ich natürlich nicht.
  • Manche haben einen ziemlich guten Zugang zu Programmierthemen und lernen schnell.
    Wie willst du das aus der Ferne beurteilen? Die Posts hier sind doch nur Momentaufnahmen.
  • Weil reflections für den Anfang ein zu komplexes Thema sind, habe ich das zunächst auch nicht erwähnt.
  • Vorhin habe ich das nur deshalb erwähnt, weil du es als völlig abwegig dargestellt hast, dass das mit den simulierten Klicks funktionieren könnte. Mit Reflections, die seit 1.3 Bestandteil des Standards sind, geht's halt doch (jedenfalls für Java-Programme)
  • Mein Resummée:
    1. Die Frage und die Idee von TO waren gut. Es ist prinzipiell möglich, auch wenn ihm sicher noch die Kenntnisse fehlen, es in dieser Form selbst umzusetzen.
    2. Deine Antwort fand ich in Stil und Inhalt deshalb nicht ok. Darüber hatte ich mich etwas geärgert. Man darf sich auch im Internet mit Respekt begegnen.
    3. Ob TO es schafft (oder will), den alternativen Ansatz zu realisieren, möchte ich mir nicht anmaßen, zu beurteilen. Möglicherweise braucht es einfach seine Zeit.
    4. Ob es TO was gebracht hat, in welchem Sinn auch immer, kann ich auch nicht beurteilen. Kannst Du es?

Von meiner Seite aus könnten wir die Diskussion jetzt auch beenden.

Ciao
Al Kuez
 

Ähnliche Java Themen

Neue Themen


Oben