# Mausklick außerhalb des Programms erzeugen?



## Samuel (28. Jul 2006)

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


----------



## Wildcard (28. Jul 2006)

java.sun.com/j2se/1.5.0/docs/api/java/awt/Robot.html


----------



## André Uhres (29. Jul 2006)

Samuel hat gesagt.:
			
		

> ..kann Java auf die API von Windows zugreifen und dort einen Mausklick simulieren?..




```
//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.");
    }
}
```


----------



## Samuel (29. Jul 2006)

Hallo, entschuldigt bitte, es kam keine Mailbenachrichtigung.

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

Danke


----------



## Leroy42 (29. Jul 2006)

@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.


----------



## Leroy42 (29. Jul 2006)

Samuel hat gesagt.:
			
		

> aber kann dieer Robot Direct X Mausklicks ausführen?



Was,  um Himmels willen, ist ein "Direct X Mausklick"?  :shock:


----------



## Samuel (29. Jul 2006)

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 (29. Jul 2006)

Leroy42 hat gesagt.:
			
		

> @André
> 
> Das ist ja mal ein lustiges Programm?  :lol:
> 
> ...


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 (29. Jul 2006)

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.


----------



## Samuel (29. Jul 2006)

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


----------



## Leroy42 (29. Jul 2006)

Samuel hat gesagt.:
			
		

> reagiert der Click nicht mehr


 :shock: 
_Was meinen mit dieser Buchstabenfolge? _
_Bewirkt_ der Click nichts(das Falsche) oder was?


----------



## Samuel (29. Jul 2006)

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


----------



## Leroy42 (29. Jul 2006)

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!


----------



## Samuel (29. Jul 2006)

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 (29. Jul 2006)

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?


----------



## Samuel (29. Jul 2006)

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


----------



## Samuel (29. Jul 2006)

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


----------



## Samuel (31. Jul 2006)

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?


----------



## Mario_H (31. Jul 2006)

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.


----------



## Samuel (31. Jul 2006)

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?)


----------



## Gast (31. Jul 2006)

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).


----------



## Samuel (31. Jul 2006)

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


----------



## Mario_H (31. Jul 2006)

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.


----------



## Der_Unwissende (31. Jul 2006)

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


----------

