Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen?

  • Themenstarter Themenstarter Gelöschtes Mitglied 67123
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 67123

Gast
Wenn man z. B. einen Text in ein TextField eingibt und dort verschiedenste Unicode-Zeichen drin sind (bspw. Sonderzeichen, Arabische, Griechische und Chinesische Zeichen) und dieser eingegebene Text dann vom Programm nachgeschrieben wird.

*Kein Copy and Paste, sondern Zeichen für Zeichen, so was wie Robot. Das Problem ist aber, dass Robot nur wenige Zeichen unterstützt.

Beispiel {
Im TextField steht jetzt هذا那是!äü>_ und diese Zeichen möchte ich vom Programm nachtippen lassen.
Ja, mit robot.keyPress(); usw. kann man Zeichen tippen lassen, aber die genannten und tausende andere Zeichen sind Unicodes, die Robot nur als "?" schreibt, da er diese Zeichen nicht kennt oder so.

Jemand hat mir diesen Code gegeben:
Java:
public static void TypeText(Robot r, int key_code)
{
    r.keyPress(KeyEvent.VK_ALT);

    for(int i = 3; i >= 0; --i)
    {
        // extracts a single decade of the key-code and adds
        // an offset to get the required VK_NUMPAD key-code
        int numpad_kc = key_code / (int) (Math.pow(10, i)) % 10 + KeyEvent.VK_NUMPAD0;

        r.keyPress(numpad_kc);
        r.keyRelease(numpad_kc);
    }

    r.keyRelease(KeyEvent.VK_ALT);
}
Nur weiß ich nicht, wie ich den key_code eines Zeichens bekomme, der in einem TextField steht und ich weiß nicht, ob die for-Schleife für mein Vorhaben richtig ist, da ich nicht alle möglichen Unicodes, die es gibt, schreiben lassen möchte, sondern nur das Zeichen, das als nächstes dran ist - und ich weiß nicht, was Math.pow() macht.

Hiermit übergebe ich die einzelnen Zeichen weiter:
Java:
for (char ch : textInput.toCharArray()) {
    new TypeText(gMI.r, ch);
}
} Ende vom Beispiel.

Danke.
 
Falls deine for-Schleife die Zeichen im Text durchgeht, dann wirst du auch genau die kriegen und nicht tausende überflüssiger Zeichen.

Die "?" heißen nicht, dass der Robot sie nicht kennt, sondern im Normalfall, dass der Empfänger sie nicht darstellen kann, kann auch am Font liegen.

Falls der Robot nur eine begrenzte Anzahl unterstützt, dann spalt den auszugebenden Text einfach auf und lass Robot mehrmals laufen.

Falls du nur Zeichen durchlassen willst, für die es einen VK_ ... Eintrag gibt, dann erstell erst mal ein Set von Ints, das alle Einträge enthält, dann prüfe ob das Zeichen darin enthalten ist.

Du kannst Sonderzeichen auch mit der entsprechenden Tastenkombination 'tippen' lassen. Dazu musst du nur den Code des Zeichens in die Dezimalstellen aufteilen, also z.B.
Alt[press],Num6[type],Num9[type],Num6[type],Alt[release].
Das hängt jetzt natürlich davon ab, ob die Empfängersoftware das akzeptiert.
 
Zuletzt bearbeitet:
Das Problem ist aber doch, dass mit der Num + 10er Tastatur nur eben die Eingaben simulieren, die der Tastaturtreiber bietet. Das ist IMMER nur ein Subset von Unicode.

Das war doch auch das, was wir im anderen Thread bereits ausgiebig behandelt hatten. Die Optionen hast Du ja alle abgelehnt:
  • Aktivierung der Eingabe von Unicode Zeichen um dann mit [ALT] + Numpad-[+] + Hexadezimalzahl (Was auch nicht richtig funktioniert wenn ALT A - ALT F andere Bedeutungen haben)
  • Nutzen der Zwischenablage

Wenn ich mich recht erinnere hatte ich zuletzt auch nach dem genauen Einsatzzweck gefragt und darauf keine Antwort erhalten.
 
Das Problem ist aber doch, dass mit der Num + 10er Tastatur nur eben die Eingaben simulieren, die der Tastaturtreiber bietet. Das ist IMMER nur ein Subset von Unicode.

Das war doch auch das, was wir im anderen Thread bereits ausgiebig behandelt hatten. Die Optionen hast Du ja alle abgelehnt:
  • Aktivierung der Eingabe von Unicode Zeichen um dann mit [ALT] + Numpad-[+] + Hexadezimalzahl (Was auch nicht richtig funktioniert wenn ALT A - ALT F andere Bedeutungen haben)
  • Nutzen der Zwischenablage

Wenn ich mich recht erinnere hatte ich zuletzt auch nach dem genauen Einsatzzweck gefragt und darauf keine Antwort erhalten.
Ich fand den Weg ineffizient und kam nicht mehr weiter. Ich möchte auch nicht, dass die Zwischenablage zugespammt wird.

Und geantwortet hatte ich schon, ich habe den Tab sogar mehrere Tage offen gelassen, um eine Antwort gleich zu sehen. Ich habe ein Video aufgenommen, habe es aber wieder runtergenommen. 🤔
 
Falls deine for-Schleife die Zeichen im Text durchgeht, dann wirst du auch genau die kriegen und nicht tausende überflüssiger Zeichen.

Die "?" heißen nicht, dass der Robot sie nicht kennt, sondern im Normalfall, dass der Empfänger sie nicht darstellen kann, kann auch am Font liegen.

Falls der Robot nur eine begrenzte Anzahl unterstützt, dann spalt den auszugebenden Text einfach auf und lass Robot mehrmals laufen.

Falls du nur Zeichen durchlassen willst, für die es einen VK_ ... Eintrag gibt, dann erstell erst mal ein Set von Ints, das alle Einträge enthält, dann prüfe ob das Zeichen darin enthalten ist.

Du kannst Sonderzeichen auch mit der entsprechenden Tastenkombination 'tippen' lassen. Dazu musst du nur den Code des Zeichens in die Dezimalstellen aufteilen, also z.B.
Alt[press],Num6[type],Num9[type],Num6[type],Alt[release].
Das hängt jetzt natürlich davon ab, ob die Empfängersoftware das akzeptiert.
Nur weiß ich nicht, wie ich den key_code eines Zeichens bekomme und ich weiß nicht, was Math.pow() macht.
Wenn ich "(int) ch" (siehe meine for-Schleife in der Frage) mache, um den KeyCode zu bekommen, ist der KeyCode in fast allen Fällen falsch.
 
Die Zwischenablage wird ja nicht zugespammt. Du kannst diese ggf. sichern, nutzen und dann wieder zurück setzen.

Aber paralleler Betrieb eine Automatisierung zusammen mit den Benutzer ist in jedem Fall immer sehr kritisch zu sehen. Das geht nur, wenn Du nicht die normalen Eingaben nutzt sondern direkt auf die App zugreifst. Das geht prinzipiell auch - unter dem Strich sendest Du dann halt die Events, die durch Tastatur und Maus vom System erzeugt werden selbst an die entsprechenden Fenster / Controls.
 
Wenn ich "(int) ch" (siehe meine for-Schleife in der Frage) mache, um den KeyCode zu bekommen, ist der KeyCode in fast allen Fällen falsch.
Keycode hat auch nicht direkt etwas mit dem Zeichen zu tun! Du hast eine Tastatur mit Tasten. Diese generieren Keycodes. Wenn Du also eine Tastatur mit 126 Tasten hast, dann hat jede dieser Tasten einen Keycode. Paar Tasten haben noch spezielle Funktionalität - sie dienen als Modifier. Damit kannst Du anderen Tasten andere Bedeutung geben.

Welche Bedeutung eine Taste (oder Tastenkombination) hat, kannst Du aber nicht wissen! Es gibt Standard Belegungen - dann hast Du eine z.B. deutsche Tastatur. Dann ist die Taste mit dem Ü halt ein 'Ü'. Die gleiche Tastatur nur mit einem anderen Setting und schon ist es ein '[' oder so.

Und wenn jemand da seine eigene Belegung gemacht hat, dann ist das wieder irgend etwas anderes.

Somit gibt es da keinen wirklichen Zusammenhang. Und es wird auch klar: mit der üblichen Anzahl Tasten bekommst Du nie alle Unicode Zeichen abgedeckt.
 
Nur weiß ich nicht, wie ich den key_code eines Zeichens bekomme und ich weiß nicht, was Math.pow() macht.
Wenn ich "(int) ch" (siehe meine for-Schleife in der Frage) mache, um den KeyCode zu bekommen, ist der KeyCode in fast allen Fällen falsch.
So z.B., kurz gegoogelt.
int keyCode = KeyEvent.getExtendedKeyCodeForChar(charCode);

Natürlich muss es für das Zeichen auch einen Key geben (wenn auch nicht zwingend physikalisch vorhanden, Software ist geduldig).
 
So z.B., kurz gegoogelt.
int keyCode = KeyEvent.getExtendedKeyCodeForChar(charCode);

Natürlich muss es für das Zeichen auch einen Key geben (wenn auch nicht zwingend physikalisch vorhanden, Software ist geduldig).
Das führt wieder auf ein IllegalArgumentException hinaus, wenn andere Zeichen als abc... usw. geschrieben werden sollen. Mit dieser Methode bin ich bis jetzt am weitesten gekommen, jedoch bräuchte man dafür tausende Zeilen mit case.
 
Das führt wieder auf ein IllegalArgumentException hinaus, wenn andere Zeichen als abc... usw. geschrieben werden sollen. Mit dieser Methode bin ich bis jetzt am weitesten gekommen, jedoch bräuchte man dafür tausende Zeilen mit case.
Java:
 autoTextRobot.keyPress(KeyEvent.VK_ALT);

        for (int i = 3; i >= 0; --i) {
            // extracts a single decade of the key-code and adds
            // an offset to get the required VK_NUMPAD key-code
            int numpad_kc = (int) characterKey / (int) (Math.pow(10, i)) % 10 + KeyEvent.VK_NUMPAD0;

            autoTextRobot.keyPress(numpad_kc);
            autoTextRobot.keyRelease(numpad_kc);
        }

        autoTextRobot.keyRelease(KeyEvent.VK_ALT);
ist die Lösung für das Meiste. Es unterstützt jetzt einiges mehr, aber so was wie Chinesisch schreibt der immer noch nicht, aber es ist definitiv besser. Aber ich weiß immer noch nicht, was Math.pow() macht.
 
Die Begründung wurde Dir ja auch bereits mehrfach geliefert, wieso es ja nicht geht. Daher finde ich interessant, dass Du weiter versuchst etwas zu erreichen, von dem mehrfach begründet wurde, dass es nicht gehen kann.
Aber ich weiß immer noch nicht, was Math.pow() macht.
Da bietet sich immer an, einfach in die Dokumentation zu schauen:

Das Math.pow(10,i) rechnet also 10 hoch i aus.

Bei der Methode werden also von dem characterKey einfach die letzten 3 Stellen genommen und dann über die 10er Tastatur eingegeben.

Und auch da sollte deutlich werden, dass es eben nicht gehen kann: Du kannst keine Unicode Zeichen (so viele, dass 4 Bytes braucht, um alle darzustellen!) mit nur 1000 Möglichkeiten (0-999 in der gegebenen Methode) ausdrücken.

Du hast mehrere Ebenenen:

  • Du hast eine Menge an definierten Zeichen (Unicode) / Ggf. hast Du eine eigene Definition von validen Zeichen (Charset / Codepage bei Windows)
  • Du hast eine Tastatur, die einfache Signale an den Rechner sendet (Taste gedrückt / losgelassen) und dieser wertet dies über ein Keyboardlayout aus und weist so ein Zeichen zu.

Vielleicht hilft es Dir ja beim Verständnis dieser Thematik, wenn Du da etwas tiefer rein schnupperst. http://www.kbdedit.com/ wäre z.B. eine Software, mit der Du eigene Tastatur-Layout entwickeln kannst.
 
Die Begründung wurde Dir ja auch bereits mehrfach geliefert, wieso es ja nicht geht. Daher finde ich interessant, dass Du weiter versuchst etwas zu erreichen, von dem mehrfach begründet wurde, dass es nicht gehen kann.

Da bietet sich immer an, einfach in die Dokumentation zu schauen:

Das Math.pow(10,i) rechnet also 10 hoch i aus.

Bei der Methode werden also von dem characterKey einfach die letzten 3 Stellen genommen und dann über die 10er Tastatur eingegeben.

Und auch da sollte deutlich werden, dass es eben nicht gehen kann: Du kannst keine Unicode Zeichen (so viele, dass 4 Bytes braucht, um alle darzustellen!) mit nur 1000 Möglichkeiten (0-999 in der gegebenen Methode) ausdrücken.

Du hast mehrere Ebenenen:

  • Du hast eine Menge an definierten Zeichen (Unicode) / Ggf. hast Du eine eigene Definition von validen Zeichen (Charset / Codepage bei Windows)
  • Du hast eine Tastatur, die einfache Signale an den Rechner sendet (Taste gedrückt / losgelassen) und dieser wertet dies über ein Keyboardlayout aus und weist so ein Zeichen zu.

Vielleicht hilft es Dir ja beim Verständnis dieser Thematik, wenn Du da etwas tiefer rein schnupperst. http://www.kbdedit.com/ wäre z.B. eine Software, mit der Du eigene Tastatur-Layout entwickeln kannst.
Manchmal versuche ich einfach mehr als nötig 🤷‍♂️.
Danke.
 

Zurück
Oben