Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hey,
hab mal eine Frage. Hab mir die letzten Tag ein kleines Macro tool geschrieben. Bei Sachen wie Word funktioniert es auch recht gut, nur bei Full-Screen Anwendungen funktioniert das Tool nicht mehr. Hat das vielleicht damit zu tun, dass es nicht mehr im Vordergrund steht? Gibt es da vielleicht eine Lösung für? Ich denke nicht das in meiner Methode ein Fehler ist, man kann aber nie wissen:
Java:
import java.awt.AWTException;
import java.awt.Robot;
public class TastenSenden {
private Robot robot;
public TastenSenden() {
try {
robot = new Robot();
} catch (AWTException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Das int Array behinhaltet die verschiedenen Keycodes der einzelnen Tasten
public void pressKeys(int[] keys, int sleep) {
for (int i = 0; i < keys.length; i++) {
robot.keyPress(keys[i]);
robot.delay(sleep);
}
}
}
Die Java-Anwendung muss auf jedenfall sichtbar und aktiv sein, sonst ignoriert die JVM alle Eingaben bzw. bekommt sie nicht übermittelt und anders rum.
Die Java-Anwendung muss auf jedenfall sichtbar und aktiv sein, sonst ignoriert die JVM alle Eingaben bzw. bekommt sie nicht übermittelt und anders rum.
Aber, bei welchen Fullscreen Apps funktioniert was nicht? Die Robot-Klasse macht ja nur MouseMovements und Tastendrücke. Ob "darunter" (wo sich die Maus bewegt oder die Tasten hingeschickt werden) eine Java Anwendung ist oder was anderes, sollte komplett egal sein..
Naja. Ich hab 2 Macros gemacht. 1) Für ein Word Dokument in dem ich sehr oft die selbe Zahlenreihe verwenden muss und eins für ein Game, das den Chat öffnet und etwas hineinschreiben soll.
Beim Word dokument funktioniert das alles Problemlos, nur beim Game nicht. Das Programm besteht aus keinem Frame. Es ist einfach nur eine Endloschleife die Prüft ob ein bestimmter Key gedrückt worden ist und dann die entsprechende Robot Methode aufruft die ich schon weiter oben gepostet habe (natürlich gibt es eine beenden Taste etc.).
wow ... ich bin mal wieder über die unfähigkeit ein problem zu erfassen und zu begriefen sowas von erstaunt das ich mir nur denke : und ihr wollte jemanden helfen ? ...
um es noch mal klar zu sagen : das problem von TO ist das Robot zwar so normal KeyEvents ans system feuert ... und es z.b. bei Word auch ankommt ... aber das es mit FULLSCREEN anwendungen nicht mehr geht ...
das hat hier NICHTS mit irgendwelchen listenern oder focus zu tun ... und selbst wenn : um global zu reagieren hat er bereits n native global listener ... hat er geschrieben ...
@TO
keyPress() alleine reicht nicht .. du musst die "taste auch wieder loslassen" : keyRelease()
Auf Windows nutzt die Robot Klasse sun.awt.windows.WRobotPeer. Der native Code der dabei zugrunde liegt ist awt_Robot.cpp. Der lässt sich hier auch finden: Results : awt_Robot.cpp - Ohloh Code Search
Events werden über win32 Aufrufe realisiert. Es gibt viele Spiele die solche Calls ignorieren und direkt mit dem Treiber kommunizieren. Besonders bei MMOs (Bot Protection).
um es noch mal klar zu sagen : das problem von TO ist das Robot zwar so normal KeyEvents ans system feuert ... und es z.b. bei Word auch ankommt ... aber das es mit FULLSCREEN anwendungen nicht mehr geht ...
das hat hier NICHTS mit irgendwelchen listenern oder focus zu tun ... und selbst wenn : um global zu reagieren hat er bereits n native global listener ... hat er geschrieben ...
Events werden über win32 Aufrufe realisiert. Es gibt viele Spiele die solche Calls ignorieren und direkt mit dem Treiber kommunizieren. Besonders bei MMOs (Bot Protection).
Es sind auch nicht die Spiele, die diese Calls ignorieren, sondern Prozess-Manager, welche der Fullscreen-Anwendung fast ihre gesammte Aufmerksamkeit schenken. Und gerade Eingabegeräte sind am meisten davon betroffen. Was denkt ihr wohl, wo ich diesen Text hinschreiben würde, wenn mich irgend ein Robot in ein Notepad-Fenster klickt? Also noch mal... die Anwendung muss aktiv und sichtbar sein. Damit eine Anwendung aktiv und sein kann, muss auf jeden Fall erst mal der Screen, auf welchem sie sich befindet aktiv sein. Sollte es heutzutage noch irgendwelche Ausnahmen geben, sind diese mit Sicherheit am BS (bzw. am Prozessmanager) vorbei entwickelt und Robot (bzw. Java) gehört nicht dazu.
Es sind auch nicht die Spiele, die diese Calls ignorieren, sondern Prozess-Manager, welche der Fullscreen-Anwendung fast ihre gesammte Aufmerksamkeit schenken.
Schon klar, dass es idR. nicht direkt die Spiele sind. HackShield, GameGuard, XTrap usw.
Deren Hooks erkennen und verwerfen solche Events. Manche kicken einen sogar aus dem Spiel.
Wenn es kein geschütztes Spiel ist, ist unter Umständen immer noch DirectX dazwischen, welches auch direkt auf die Hardware Events reagiert und nicht auf die vom BS bereitgestellten. Da muss man dann wohl oder übel über low level API calls gehen.
Fullscreen ist hier also nicht zwingend das Problem.
Das die Anwendung den Fokus haben muss ist denke ich klar.
Low Level APIs musst du über Java mit JNA (oder JNI) aufrufen.
Denke das Ganze sprengt das Thema vielleicht ein wenig und die Verwendung von einem anderen Tool wäre vorzuziehen? Gibt ja fertige wie z.B. AutoIt.
Danke. AutoIt ist ja eine auf C++ basierende Scriptsprache. Habe mich damit auch schon beschäftigt nur ist die Quellcode umstellung enorm und an sich finde ich diese Sprache irgendwie hässlich.
Werde micht trotzdem mal darum bemühen.
Funktionieren tut es, jedoch nicht bei Anwendungen die den kompletten Screen (Spiele etc.) verwenden. Der Grund dafür hat AngryDev. auch schon gut erklärt, ergibt auch irgendwie Sinn.
Weil wenn du auf Taste X wartest, das du dann Taste A-Z rausspamt
Bei einer VollscreenApp?
Nachtrag: Gut, mit einem 3t Programm/Library wird das auch klappen..
Und bei der VollscreenApp: wartest du auch auf Tastendruck X um Tasten ans Programm zu senden? War das dein einziger Versuch?
Ansonsten bau einfach ein Thread.sleep() ein und leg dein Progamm für 10-30 secs schlafen.
Dann sagst du im Programm, dass nach den 10-30secs irgendwelche Tasten (eventuell chat öffnen, was schreiben, wieder enter, etc.) gedrückt werden sollen. AUTOMATISCH (nicht auf Tastendruck warten).
Jetzt startest du dein Java Programm und danach das Spiel und schau ob Eingaben ankommen oder nicht..
Wir müssen ja auch ausschließen, dass der globale Keylistener nicht etwa versagt..
Eigentlich eine coole Sache mit diesen "simulierten" Inputs, habt ihr vielleicht einen Namen oder einen Link, an den ich mich wenden kann bezüglich....
Events werden über win32 Aufrufe realisiert. Es gibt viele Spiele die solche Calls ignorieren und direkt mit dem Treiber kommunizieren.