Java Buchstaben zu keycodes?
Hallo zusammen :)
Ich hoffe ich werde dies verständlich formulieren, dass es jeder versteht. Ich schreibe in Java, beherrsche jedoch auch JavaScript. Ich programmiere noch nicht so lange, also habt erbarmen :^). Ich nutze die Klasse Robot in Java ( KeyPress, KeyRelease ), um eine "Tastatur-Simulation" zu nutzen (für Spiele). Jedoch möchte ich nun eine Methode erstellen, die einen Buchstaben ( der im Code steht ) umwandelt in einen Keycode und dann die Robot klasse aufgerufen wird. Hierfür habe ich bereits eine "send" Methode, die den Chat öffnet.
Hierfür ein Beispiel : Ich möchte die Nachricht "hallo" senden. Hierfür rufe ich zuerst die Methode "send" auf. Danach erstelle ich eine Methode, die "hallo" tippt, und zwar keycode für keycode (72, 65, 76, 76, 79) und rufe diese auf. Doch nun möchte ich eine Methode erstellen, in diese ich ( in den Code) "hallo" schreibe und diese sollte die Buchstaben durch keycodes an die Robot klasse senden.
Meine frage ist nun, ob es bereits eine Methode gibt, die man übernehmen könnte ( z.b auf Github) oder auf einer bestimmten Seite dazu mehr Infos gäbe ?
Schönen Abend noch :)
1 Antwort
Das solltest du so lösen können:
void enterWord(String word) {
char[] letters = word.toCharArray();
for (char letter : letters) {
robot.keyPress(letter);
}
}
Um nun noch den Fall abzufedern, dass du große Buchstaben eingeben möchtest, solltest du vor dem Drücken des Buchstabens die Shift-Taste aktivieren:
if (Character.isUpperCase(letter)) {
robot.keyPress(KeyEvent.VK_SHIFT);
}
und am Ende der Iteration die Taste via keyRelease wieder freisetzen.
Ich habe mein obiges Beispiel nochmal geringfügig modifiziert und eine Testanwendung dazu gebaut:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class RobotEnterText {
private final Robot robot;
public RobotEnterText() throws AWTException {
robot = new Robot();
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame();
JTextField field = new JTextField();
field.setFocusable(true);
frame.add(field);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowOpened( WindowEvent e) {
field.requestFocus();
try {
RobotEnterText app = new RobotEnterText();
app.enterWord("Hello");
}
catch (AWTException ex) {
ex.printStackTrace();
}
}
});
frame.setVisible(true);
});
}
public void enterWord(String word) {
char[] letters = word.toCharArray();
for (char letter : letters) {
if (Character.isUpperCase(letter)) {
robot.keyPress(KeyEvent.VK_SHIFT);
}
robot.keyPress(Character.toUpperCase(letter));
if (Character.isUpperCase(letter)) {
robot.keyRelease(KeyEvent.VK_SHIFT);
}
robot.delay(100);
}
}
}
Die Verzögerung ist offensichtlich notwendig, damit doppelt aufeinanderfolgende Buchstaben wie hier das l nicht verschluckt werden.
Hey :)
Erstmal danke dir ! Jedoch gibt mir diese Methode nicht die Java Keycodes ( a =65, b = 66, usw.) sondern nur a = 1, b = 1.
Jedoch sollte wenn mein "word" z.b Hallo wäre, sollte die Methode dieses wort auch tippen.