Mausklick außerhalb des Programms erzeugen?

Status
Nicht offen für weitere Antworten.
S

Samuel

Gast
Hallo, kann Java auf die API von Windows zugreifen und dort einen Mausklick simulieren? Konnte leider nichts genaueres darüber finden, es tauchen nur Maus Events für AWT und SWING in der Suche auf :)
 

André Uhres

Top Contributor
Samuel hat gesagt.:
..kann Java auf die API von Windows zugreifen und dort einen Mausklick simulieren?..
Code:
//package robot;
/*
 * RobotDemo.java
 *Diese kleine Demo startet das Notepad Programm, schreibt einen Text,
 *wählt den Text aus, löscht ihn wieder und beendet dann Notepad
 */
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
public class RobotDemo{
    //Array für Tastaturdaten (um den Text zu schreiben):
    static int keyInput[] = {
        KeyEvent.VK_H,
        KeyEvent.VK_A,
        KeyEvent.VK_L,
        KeyEvent.VK_L,
        KeyEvent.VK_O
    };
    public static void main(String[] args) throws IOException, AWTException{
        Runtime.getRuntime().exec("notepad");//Notepad starten
        final Robot robot = new Robot();
        robot.keyPress(KeyEvent.VK_SHIFT);
        for (int i = 0; i < keyInput.length; i++){
            robot.keyPress(keyInput[i]);
            robot.keyRelease(KeyEvent.VK_SHIFT);
            //Eine Sekunde Wartezeit zwischen den Buchstaben einfügen:
            robot.delay(1000);
        }
        robot.mouseMove(400,200);
        robot.mousePress(InputEvent.BUTTON3_MASK);//Rechtsklick (Kontextmenü)
        robot.mouseRelease(InputEvent.BUTTON3_MASK);
        robot.delay(1000);
        robot.mouseMove(410,310);
        robot.delay(1500);
        robot.mousePress(InputEvent.BUTTON1_MASK);//Linksklick (Alles auswählen)
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        robot.delay(3000);
        robot.keyPress(KeyEvent.VK_DELETE);//text wieder löschen
        robot.keyRelease(KeyEvent.VK_DELETE);
        robot.delay(2000);
        robot.keyPress(KeyEvent.VK_ALT);//Notepad beenden
        robot.keyPress(KeyEvent.VK_F4);
        robot.keyRelease(KeyEvent.VK_ALT);
        robot.keyRelease(KeyEvent.VK_F4);
        new Thread(new Runnable(){
            public void run() {
                robot.delay(1500);
                robot.keyPress(KeyEvent.VK_ENTER);//beendet das JOptionPane
                robot.keyRelease(KeyEvent.VK_ENTER);
            }
        }).start();
        JOptionPane.showMessageDialog(null,"Robot Demo ist fertig.");
    }
}
 
S

Samuel

Gast
Hallo, entschuldigt bitte, es kam keine Mailbenachrichtigung.

Werde es sofort testen, aber kann dieer Robot Direct X Mausklicks ausführen?

Danke
 

Leroy42

Top Contributor
@André

Das ist ja mal ein lustiges Programm? :lol:

Richtig spaßig wird's, wenn man kurz nach Öffnen des Notepads (bevor
"Hallo" zu Ende geschrieben wurde, seinen Browser in den Vordergrund holt. :cool:
 
S

Samuel

Gast
Was ich suche, soll ein Click Tool sein ,welche in anderen Fenstern, wie in Spielen funktioniert.
Wir brauchen es später um an der Hochschule ein Mappingexperiment zu bauen, jedoch muss das Ding in solchen Programmen wie Spielen oder dem später benutzen Programmen(die fast spiele sind), laufen
 

André Uhres

Top Contributor
Leroy42 hat gesagt.:
@André

Das ist ja mal ein lustiges Programm? :lol:

Richtig spaßig wird's, wenn man kurz nach Öffnen des Notepads (bevor
"Hallo" zu Ende geschrieben wurde, seinen Browser in den Vordergrund holt. :cool:
Das ist eben kein intelligenter Roboter, der würde erkennen wenn etwas auf dem Bildschirm nicht mehr an seinem richtigen Platz ist.
Aber sowas zu programmieren geht wohl ein bischen zu weit.
Wahrscheinlich würde man dabei nie zu einer hundertprozentigen Absicherung der gewollten Funktionalität kommen.
 

André Uhres

Top Contributor
Samuel hat gesagt.:
Was ich suche, soll ein Click Tool sein ..
Was auch immer das Wort bedeuten mag, die Klasse Robot beherrscht den Mausklick ohne Zweifel.
Wenn dein Tool intelligent sein soll, wird's aber äusserst knifflig, wenn nicht unmöglich.
 
S

Samuel

Gast
Ja, das tut es, aber sobal an der Stell sowas wie ein Spiel läuft, also eine Anwedung außerhalb des Desktops, reagiert der Click nicht mehr
 
S

Samuel

Gast
Es gibt keinen, das Programm führ den Click zwar aus, aber es kommt nichts im SPiel an
 

Leroy42

Top Contributor
Samuel hat gesagt.:
also eine Anwedung außerhalb des Desktops

Aber genau das hat André doch mit seinem Beispiel vorgeführt.

Der Notepad empfängt und verarbeitet die Klicks.

Edit: Und jetzt komm mir keiner mit der Behauptung Notepad sei kein Spiel! :cool:
 
S

Samuel

Gast
tut sie auch, aber das Spiel nicht, dort scheint es anders zu gehen, oder garnicht und das ist eben dass, was ich suche, dass der Click dort verarbeitet wird
 

André Uhres

Top Contributor
Samuel hat gesagt.:
tut sie auch, aber das Spiel nicht, dort scheint es anders zu gehen, oder garnicht und das ist eben dass, was ich suche, dass der Click dort verarbeitet wird
Das Problem scheint darin zuliegen, dass das Spiel nicht den Fokus hat.
Wie und wo startest du denn das Spiel und den Roboter?
 
S

Samuel

Gast
spiel läuft, dann gehe ich mit dem spiel in den window mode, starte script, wähle spiel aius, klicke n paar mal auf nen button, auf den auch das Script klicken würde, aber das script klickt nicht dahin
 
S

Samuel

Gast
Habe nochmal getestet, das Spiel läuft in Windowmode ich weiß die Koordinaten, das Script klickt dahin, wo das Spiel ist, das Spiel rückt auch in den Vordergrund, ich kann also per Maus dort rumklicken, aber bewege ich meine Maus woanders hin, so setzt das Script diese nicht dahin wo es soll, klick ich wieder außerhalb des Spiels, dann springt die Maus wieder dahin, aber im Spiel selber wird so kein Klickeffekt ausgelöst.
Das Robot Ding läuft bei mir auch im Thread, daher wird das Script doch nicht angehalten, oder?
Es scheint irgendwie eher so, als würde das Spiel eine ebene höher liegen, als man mit dem Robot rankommen würde.
Daher dachte ich, es gibt sowas wie eine directx mausfunktion, die das im Spiel auf die Reihe kriegt
 
S

Samuel

Gast
So, habe es wiederum nochmal getestet, Browserspiele, sowas wie Flash oder Shockwave Dateien sind klickbar.

Spiele, die aber vom Desktop gestartet werden nicht, leider kenne ich mich damit nicht wirklich aus.
Wird dort ein Programm Hook gestartet, der sowas verhindert? Oder werden solche Programme irgendwie in sowas wie einer Z-Achse vor den Mausevents des Desktops gesetzt?
 
M

Mario_H

Gast
Mit dem DirectX bist du auf dem richtigen Dampfer.
Ein Spiel, das DirectX bzw. DirectMouse verwendet ist direkt(er?) mit dem Maustreiber verbunden als normale Windwosanwendungen.

Man müsste da direkt ran, aber frag mich bitte nicht wie.
Ich gehe nicht davon, dass das von einer Java-Bibliothek unterstützt wird.
Wenn überhaupt wirst du wohl auf das JNI zurückgreifen müssen.

Vielleicht wäre überhaupt eine andere Sprache sinnvoller...


p.s. Eine Idee wäre über Assembler direkt den Maus-Interrupt auszulösen.
 
S

Samuel

Gast
Naja, Assember ist n wenig weit weg von mir um das sinnvoll zu realisieren. C++ ist schpn sehr weit, aber Assembler... :)

Hat C++ DirectMouse? (heißt das so?)
 
G

Gast

Gast
DirectInput ist glaube ich das was du suchst, aber an deiner Ausdrucksweise solltest du wirklich noch etwas arbeiten (sorry, nicht bös' gemeint, aber missverständlich sind Teile schon!)

Zudem sind imho Programme unter Windows nie mit einem Treiber verbunden. Windows basiert auf zwei sehr einfachen Dingen, Nachrichten und Botschaften. Wird die Maus bewegt oder eine Maustaste gedrückt, so wird eine Botschaft an den Empfänger gesendet. Spiele verwenden definitiv keine Hooks (wozu auch), aber sie bauen in der Regel nicht auf dem Desktop auf (immerhin wollen sie den im Vollbildmodus ersetzen!)
Was DirectX angeht, so dürftes du (wie generell in der Windowsprogrammierung) mit C++ keinerlei Probleme haben (mit Assembler hättest du die dagegen ganz schnell!). Aber auch andere Sprachen (e.g. Delphi) kommen in Frage.

Die sind auf jeden Fall eher geeignet als ein Java Programm (da du hier eine sehr Plattformspezifische API verwenden möchtest).
 
S

Samuel

Gast
Danke :)

Bevor ich mich mal wieder in C++ einarbeite, hol ich mir lieber C#, aber ich hab hier die JNI und http://www.hardcode.de/jxinput/ gefunden, da ich in Java im Moment fitter bin, als in C++, versuch ich mich mal daran
 
M

Mario_H

Gast
Na, ich weiß nur dass das mit dem DirectInput ne ganz außergewöhnliche Sache ist, verglichen mit dem Rest von Windows. Wie groß die Unterschiede tatschächlich sind, weiß aber nicht genau.

Aber ich mein mich zu erinnern gelesen zu haben, dass DirecX direkt zwischen Programm und Hardware steht. Deswegen weiß ich nicht wie das mit den Messages ist.

Mit C++ kenn ich mich zu wenig aus.
 
Hi,
was DirectInput angeht, so gibt es hier ein paar Dinge zu unterscheiden. Die DirectX Schnittstellen entkoppeln einfach Hardware von der Schnittstelle. DirectInput unterstützt über eine einheitliche Schnittstelle Tastaturen, Mäuse und Joysticks/pads.
Letztlich wird natürlich die eigentlich vorhandene HW verwendet, es wird aber eine Kapselung um diese herum erstellt (ein DirectInput Objekt). Hier gibt es nun einige Besonderheiten. Ein DirectInput Objekt kann (muss nicht) die Windowsbotschaften-Schleife ignorieren. Dann ist der Input wirklich etwas direkter, letztlich heißt dass aber nur, dass kein anderer Prozess mit benachrichtigt wird. Insbesondere Mouse-Hooks, die eigentlich nur solche Botschaften (CM_MOUSE...) abfangen haben dann keinen Effekt. Der Vorteil liegt einfach darin, dass versteckte Elemente nicht über ein Spiel geblendet werden, weil der Mauszeiger sich gerade über den entsprechenden Bereich des Desktops bewegt. Ohne eine Nachricht von Windows werden diese nicht merken, dass die Maus bewegt wird.
Das Problem könnte für dich werden, dass man auch einen komplett exclusiven Zugriff auf ein Device (in dem Fall dann die Maus) setzten kann. In diesem Fall gibt es denke ich für dich keine Möglichkeit direkt auf die Maus zuzugreifen.
Ansonsten hast du (wie hier schon gesagt wurde) die Möglichkeit über JNI auf diese Schnittstelle zu zu greifen. Für .net gibt es ManagedDirectX (wenn ich mich nicht völlig irre), für Win32 dürfte dir "normales" DirectX helfen. Die Sprache sollte dabei egal sein, solange du eine Dll einbinden kannst. Natürlich musst du für den JNI Aufruf noch einen Adapter verwenden, aber das sollte dann kaum ein Problem sein.

Gruß Der Unwissende
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Input/Output Mausklick außerhalb des Frames registrieren Allgemeine Java-Themen 2
S Generellen MausKlick am PC erkennen Allgemeine Java-Themen 1
K Farbe erkannt = agieren, per Mausklick etc. Allgemeine Java-Themen 47
S per Mausklick Position ermitteln Allgemeine Java-Themen 8
Maxim6394 Grafik zu Mausklick-Koordinate bewegen Allgemeine Java-Themen 18
M JTree aktualisieren nach Mausklick Allgemeine Java-Themen 12
L Mausklick simulieren Allgemeine Java-Themen 4
D JTable -> ArrayIndexOutOfBoundsException bei Mausklick Allgemeine Java-Themen 2
M JTextPane Mausklick auf bestimmte Wörter startet Aktion Allgemeine Java-Themen 8
M datei über rechten mausklick aus explorer in programm laden Allgemeine Java-Themen 4
N JList mit Mausklick auf einen JButton scrollen Allgemeine Java-Themen 28
Drachenbauer Wie kann ich einer existierenden Enum von außerhalb veränderte Werte zuweisen? Allgemeine Java-Themen 5
M Variable außerhalb Klasse definierbar? Allgemeine Java-Themen 2
X Registrierung eines Ecore-Models außerhalb der Eclipse-Umgebung Allgemeine Java-Themen 0
E Pfadangabe auf Bilddateien außerhalb der .jar Allgemeine Java-Themen 7
S Außerhalb der paintComp() färben Allgemeine Java-Themen 2
S grafische Textausgabe außerhalb eines Frames Allgemeine Java-Themen 5
A Methoden laufen im Konstruktor, außerhalb allerdings nicht Allgemeine Java-Themen 2
A kann nicht auf properties außerhalb jar zugreifen Allgemeine Java-Themen 3
J jar starten außerhalb der IDE Allgemeine Java-Themen 6
D Jar außerhalb Eclipse auf Stick oder CD starten Allgemeine Java-Themen 7
F Objekttyp in schleife angeben oder außerhalb? Allgemeine Java-Themen 8
S Klassen aus JDK 1.5. außerhalb von 1.5. nutzen Allgemeine Java-Themen 6
G Name des aktuellen Programms Allgemeine Java-Themen 7
Speed FariyDragon Startsituation des Programms Feststellen Allgemeine Java-Themen 1
Lukas2904 Automatisches starten des Programms Allgemeine Java-Themen 5
S Ausfuehrung eines Programms aufzeichnen..? Allgemeine Java-Themen 4
J Webstart Lizenz des entwickelten Java-Programms Allgemeine Java-Themen 5
S Fehlermeldungen erscheinen erst in der Ausführung des Programms Allgemeine Java-Themen 11
C -Verschiedene Versionen eines Programms verwalten Allgemeine Java-Themen 7
MineJoke "Config" Datein wir bei neustart des Programms neu erstellt? Allgemeine Java-Themen 0
X Skalierung von Bildern zum Start des Programms Allgemeine Java-Themen 3
R Instanzen eines Programms Allgemeine Java-Themen 8
H Copy Paste implementieren ausserhalb des Programms? Allgemeine Java-Themen 2
Fab1 Komponenten eines zweiten Java Programms auslesen Allgemeine Java-Themen 8
K Eclipse Fehler beim Ausführen meines Programms in Eclipse Allgemeine Java-Themen 11
M Umgebungsvariable Version des Programms Allgemeine Java-Themen 10
C Ablauf des Programms anhalten, bis.... Allgemeine Java-Themen 5
N Erste Schritte Neuschreiben eines C++ Programms in Java Allgemeine Java-Themen 4
L Richtige Dokumentation eines Java Programms Allgemeine Java-Themen 5
T Update eines Programms - Beenden eines anderen Prozesses überwachen Allgemeine Java-Themen 8
O Problem bei Darstellung der Laufzeit eines Programms Allgemeine Java-Themen 3
H Mehrfachen Start des Programms verhindern Allgemeine Java-Themen 6
E Standort des Programms herausfinden Allgemeine Java-Themen 4
P Sauberes Beenden des Programms beim Herunterfahren? Allgemeine Java-Themen 9
G Erweiterung eines Programms Allgemeine Java-Themen 29
G Konfiguration eines Java- Programms Allgemeine Java-Themen 20
G Speicherverbrauch eines Programms Allgemeine Java-Themen 2
P Start eines Programms scheitert an Java Allgemeine Java-Themen 9
A Nur eine Instanz eines Programms ausführen Allgemeine Java-Themen 3
B nur eine Instanz eines Programms laufen lassen Allgemeine Java-Themen 8
J Problem bei Ablauf des Programms DuddeDa Allgemeine Java-Themen 7
S Aufruf meines Programms Allgemeine Java-Themen 2
I Sprache zur Laufzeit des Programms ändern Allgemeine Java-Themen 3
G Laufzeit eines aus Java gestarteten Programms beobachten Allgemeine Java-Themen 3
P Priorität einen Programms erhöhen, wie mach ich das? Allgemeine Java-Themen 3
P Nur eine Instanz eines Programms zulassen, wie geht das? Allgemeine Java-Themen 15
M err oder alle Exceptions eines Programms abfangen Allgemeine Java-Themen 4
C Probleme beim Starten eines Java-Programms Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben