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.
Ich möchte ein Java Programm schreiben, welches in der Konsole (bash, Linux) ausgeführt wird und nichts anderes macht als einmal die Enter Taste zu drücken.
Wie kann ich in Java das drücken der Enter Taste simulieren?
ich kenne die genauen Befehle zwar nicht auswendig, aber schau dir mal die Robot Klasse von Java an. Diese hat einen keyPress oder sowas, mit dem du Key-Events simulieren kannst (auch außerhalb von Java).
Du wirst aber dich selber drum kümmern müssen, wer den Event bekommt. Das heißt, Robot kann nur Enter simulieren, nicht direkt an ein Programm. Das heißt, du musst dich drum kümmern, dass auch das richtige Programm das Enter bekommt / das richtige Programm gerade den Focus hat.
Und habe den Code übernommen um zu sehen was passiert:
Java:
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
public class enter_key {
public static void main(String[] args) {
try {
Robot robot = new Robot();
// Creates the delay of 5 sec so that you can open notepad before
// Robot start writting
robot.delay(5000);
robot.keyPress(KeyEvent.VK_H);
robot.keyPress(KeyEvent.VK_I);
robot.keyPress(KeyEvent.VK_SPACE);
robot.keyPress(KeyEvent.VK_B);
robot.keyPress(KeyEvent.VK_U);
robot.keyPress(KeyEvent.VK_D);
robot.keyPress(KeyEvent.VK_Y);
} catch (AWTException e) {
e.printStackTrace();
}
}
}
javac enter_key.java gibt keine Fehlermeldung aus, doch danach gebe ich java enter_key ein und erhalte:
Code:
java.awt.AWTException: headless environment
at java.awt.Robot.<init>(Robot.java:97)
at enter_key.main(enter_key.java:10)
paar Sachen:
1. robot.keyPress simuliert wirklich das drücken - und gedrückt halten - einer Taste. Das heißt, wenn du normale tippen möchtest (was bei dem kleinen Test-Proggy der Fall zu sein scheint), solltest du immer auch ein entsprechendes robot.keyRelease aufrufen (das kannst du sofort nach dem Befehl aufrufen können)
2. muss ich zugeben, dass ich interessanter Weise Probleme hatte dein Programm laufen zu lassen. Nicht wegen der von dir beschriebenen Exception, sondern weil Robot schlicht weg bei mir nichts tun wollte. Die createScreenCaputre funktioniert einwandfrei, allerdings die Key und Mouse events werden scheinbar ignoriert... Da bin ich momentan auch etwas ratlos
3. Die Headless-exception bekommst du vermutlich weil Robot auf deine Graphic Device nicht zugreifen kann (warum auch immer). Was für ein Betriebssystem hast du? Bzw könntest du versuchen den Robot mit einem Graphics Device zu initialisieren. Du kannst diese wie folgt besorgen:
Java:
GraphicsEnvironment ge = GraphicsEnvironment.
getLocalGraphicsEnvironment();
GraphicsDevice[] gs = ge.getScreenDevices();
Falls du eine Lösung dafür findest, oder weitere Indizien mit denen man was anfangen kann, dann poste bitte nochmal
mmmh, also das mit dem key-released habe ich zwar auch in der Beschreibung der Methode gelesen, kann das aber nicht bestätigen!
Wenn du -wie empfohlen- einen Editor, oder irgendein Textbearbeitungsprogramm öffnest, schreibt er mir sauber "hi budy" hin, würde das mit dem key-released so sein, sollte ja zumindest der letzte Buchstabe unendlich oft geschrieben werden?! so ist es zumindest wenn ich tatsächlich einen key gedrückt halte.
@jgh: find ich ehrlich gesagt zwar etwas komisch, aber kann ich mir auch gut vorstellen. Getestet habe ich es zwar nich, aber ich denke mir dass solange du den key nicht releaset, du auch nich den selben key nochmal senden kannst (zb "aa" schreiben ohne release - mit schon).
Im Zweifelsfall lieber an die javadoc-Empfehlung halten
@Lara_B: ja, Robot braucht eine graphische Oberfläche.
Also 'ne andere Möglichkeit als Robot oder JNI wüsste ich auch nicht. Bei letzterem kann man's ja gleich ganz in C realisieren.
Aber zumindest könntest du mal testen, wie Robot reagiert, wenn man Java nebst AWT im Headless-Mode (mit Parameter [c]-Djava.awt.headless=true[/c] startet.
[EDIT]Wenn alle Stricke reissen... Xvfb - Wikipedia, the free encyclopedia[/EDIT]
Ich habe auch schon mal versucht mit Robot ein Programm zu schreiben, dass im Hintergrund ständig einen Tastendruck simuliert.
Damals hatte ich dass Problem, dass das ganze eigentlich wie gesagt im Hintergrund laufen sollte, aber der Tastendruck wurde nur simuliert, wenn das Swing Fenster der Anwendung gerade ausgewählt im Vordergrund war und nicht, wenn das Fenster minimiert war. Außerdem wurde die Robot Klasse eigentlich nur zum Testen von Grafischen Oberflächen in Java erstellt. Demnach denke ich, dass es mit Java kaum möglich sein wird das ohne grafische Oberfläche im Hintergrund zu machen.