JavaFX Robot alle Unicode-Zeichen schreiben lassen können

_user_q

Aktives Mitglied
Mein erster Ansatz war folgender:
Java:
switch (characterKey) {
case '\u0021' -> altNumpad(robot, "33");
case '\u0022' -> altNumpad(robot, "34");
case '\u0023' -> altNumpad(robot, "35");
case '\u0024' -> altNumpad(robot, "36");
...
}
einfach jeden Code abfragen.

Dann habe ich von jemanden diesen Ansatz:
Java:
 altNumpad(robot, "" + ((int) characterKey));
Hier wird einfach der characterKey in einen Integer umgewandelt (downcasting?). Dadurch muss ich nicht jeden numpadCode einzeln eintragen.

Problem ist jetzt aber, dass der selbst (z. B.) bei einem "ä" scheitert. Da kommt so ein schwarzes Rechteck raus, aber kein "ä". Einfache alphanumerische Zeichen funktionieren dennoch.

Mir fällt aber auf, dass ich mit
Java:
System.out.println((int) characterKey);
z. B. "246" ausgegeben bekomme, aber der Roboter "148" auf dem Numpad tippt:
Java:
case '\u00F6' -> altNumpad(autoTextRobot, "148");

Die altNumpad-Methode und Weiteres.

Was muss ich also tun?

Danke!
 

KonradN

Super-Moderator
Mitarbeiter
Also ich bin erst einmal von Deinen Ausführungen etwas verwirrt. Aber ich glaube ich habe verstanden, wo das Problem bei Dir ist.

Also erst einmal: Das, was Du hier nutzt, sind Unicode Zeichen.
0x00F6 ist 246 das 'ö' (nicht das 'ä' wie von Dir gesagt, das wäre 0x00E4)
Diese Codes kannst Du unter
https://en.wikipedia.org/wiki/List_of_Unicode_characters finden kann.
nachschauen.

Ist aber erst einmal egal - Du hast hier die Werte von Unicode Zeichen - das ist der wichtige Punkt.

Und nun habe ich verstanden, dass Du Zeichen über das Numpad (Also ALT + Zahl auf Numpad) eingeben willst. Hier ist jetzt wichtig, dass man unterschiedliche Zahlen angeben kann:
3-stellig (oder weniger) sind Codepoints von einem OEM encoded Zeichen. Diese sind keine Unicode Zeichen!
Wenn Du ein + und eine 4-stellig Zahl eingibst, dann sollte er Unicode Zeichen nehmen.

Das wäre das, was ich an Deiner Stelle einmal probieren würde.
 

_user_q

Aktives Mitglied
Also ich bin erst einmal von Deinen Ausführungen etwas verwirrt. Aber ich glaube ich habe verstanden, wo das Problem bei Dir ist.

Also erst einmal: Das, was Du hier nutzt, sind Unicode Zeichen.
0x00F6 ist 246 das 'ö' (nicht das 'ä' wie von Dir gesagt, das wäre 0x00E4)
Diese Codes kannst Du unter
https://en.wikipedia.org/wiki/List_of_Unicode_characters finden kann.
nachschauen.

Ist aber erst einmal egal - Du hast hier die Werte von Unicode Zeichen - das ist der wichtige Punkt.

Und nun habe ich verstanden, dass Du Zeichen über das Numpad (Also ALT + Zahl auf Numpad) eingeben willst. Hier ist jetzt wichtig, dass man unterschiedliche Zahlen angeben kann:
3-stellig (oder weniger) sind Codepoints von einem OEM encoded Zeichen. Diese sind keine Unicode Zeichen!
Wenn Du ein + und eine 4-stellig Zahl eingibst, dann sollte er Unicode Zeichen nehmen.

Das wäre das, was ich an Deiner Stelle einmal probieren würde.
Java:
if ((int) characterKey > 1000) {
            System.out.println("> 3");
            altNumpad(autoTextRobot, "" + ((int) characterKey));
        } else {
            switch (characterKey) {
                case '\u0021' -> altNumpad(autoTextRobot, "33");
                case '\u0022' -> altNumpad(autoTextRobot, "34");
                ...
   }
}
Ich habe leider noch nicht richtig verstanden, wie man das umsetzen soll. :/
Input: aäöÜختبار
Output: aäöÜ.*('1

Ich weiß, dass der Code nicht zum richtigen Ziel führt (lol, sieht doof aus), denn ich käme wieder auf tausende Zeilen Code, wenn ich jedes Zeichen schreiben lassen möchte ...
 

KonradN

Super-Moderator
Mitarbeiter
Also der Code der altNumpad Methode reicht nicht aus. Da musst Du jetzt noch mindestens einbauen, dass er auch das + des Numpad kennt.
(VK_ADD so es Konstanten vom KeyEvent sind). Das kann also ein einfaches case '+' -> VK_ADD; in dem switch innerhalb von getNumPad sein.

Und dann kann der Code, der übergeben wird, einfach sein: "+" + (int) characterKey
 

KonradN

Super-Moderator
Mitarbeiter
Und natürlich in der Validierung der Argumente muss es auch angepasst werden. Das ist laut der Webseite ja:
if (numpadCodes == null || !numpadCodes.matches("^\\d+$")) {`

Das könnte man zu folgendem Code umändern:
if (numpadCodes == null || !numpadCodes.matches("^[\\d+]+$")) {

(So jetzt im Forum geschrieben und daher ungetestet.)
 

_user_q

Aktives Mitglied
Und natürlich in der Validierung der Argumente muss es auch angepasst werden. Das ist laut der Webseite ja:
if (numpadCodes == null || !numpadCodes.matches("^\\d+$")) {`

Das könnte man zu folgendem Code umändern:
if (numpadCodes == null || !numpadCodes.matches("^[\\d+]+$")) {

(So jetzt im Forum geschrieben und daher ungetestet.)
Das ist meine aktuelle Klasse. Mir fehlt einfach die Grundlage dazu, das korrekt umzusetzen. Entweder gibt mir Windows einen Error-Sound oder die Unicodes werden als ganz andere Zeichen geschrieben.
 

KonradN

Super-Moderator
Mitarbeiter
Teste das, was der Robot eingeben soll, erst einmal. Ich habe hier nur einen Mac und kann daher diese Windows Spielereien nicht testen.

Ich habe mir noch einmal https://www.irongeek.com/alt-numpad-ascii-key-combos-and-chart.html angesehen und gelesen, dass die Zahl Hexadezimal angegeben werden soll.

Probier das doch einmal aus. Alt drücken und halten, dann das "+" auf der Zehnertastatur und dann 'F' und '6' und die Alt Taste los lassen. Kommt dann das ö?

Wenn das klappt, dann kann man den Code anpassen:
Statt dem ganzen switch hättest Du einfach nur:
altNumpad(autoTextRobot, String.format("+%x", (int)characterKey);

Wir lassen dann noch a-f zu:
if (numpadCodes == null || !numpadCodes.matches("^[\\d+a-f]+$")) {

Und wir müssen dann a-f auch noch zulassen:
Java:
case 'a' -> VK_A;
case 'b' -> VK_B;
case 'c' -> VK_C;
case 'd' -> VK_D;
case 'e' -> VK_E;
case 'f' -> VK_F;

Aber erst einmal testen, ob die Eingabe manuell funktionieren würde.
 

_user_q

Aktives Mitglied
Teste das, was der Robot eingeben soll, erst einmal. Ich habe hier nur einen Mac und kann daher diese Windows Spielereien nicht testen.

Ich habe mir noch einmal https://www.irongeek.com/alt-numpad-ascii-key-combos-and-chart.html angesehen und gelesen, dass die Zahl Hexadezimal angegeben werden soll.

Probier das doch einmal aus. Alt drücken und halten, dann das "+" auf der Zehnertastatur und dann 'F' und '6' und die Alt Taste los lassen. Kommt dann das ö?

Wenn das klappt, dann kann man den Code anpassen:
Statt dem ganzen switch hättest Du einfach nur:
altNumpad(autoTextRobot, String.format("+%x", (int)characterKey);

Wir lassen dann noch a-f zu:
if (numpadCodes == null || !numpadCodes.matches("^[\\d+a-f]+$")) {

Und wir müssen dann a-f auch noch zulassen:
Java:
case 'a' -> VK_A;
case 'b' -> VK_B;
case 'c' -> VK_C;
case 'd' -> VK_D;
case 'e' -> VK_E;
case 'f' -> VK_F;

Aber erst einmal testen, ob die Eingabe manuell funktionieren würde.
Also bei Alt + "+" + F + 6 kommt nischts.
Auch durch die weiteren Beispiele werden plötzlich die Menus aus der MenuBar (in Notepad++ getestet) durch das ganze Alt-Gedrücke anvisiert.
Scheint also noch nicht so ganz zu funktionieren.

Ich habe altNumpad(autoTextRobot, String.format("+%x", (int)characterKey); mal mit printf() ausgeben lassen:
Java:
System.out.printf("+%x\n", (int) characterKey);
Output: +62
In dem Falle war das ein "b".

Ich habe erst daran gedacht, durch solch eine Methode vielleicht diesen numpadCode (z. B. \u0060) zu kriegen.

Ich stelle mir so was so vor, wenn es denn richtig sei:
altNumpad(autoTextRobot, String.format("+%x", (int) characterKey);
Was in meinem Kopf dann so drin stehen soll:
altNumpad(autoTextRobot, "\u0060");
 

_user_q

Aktives Mitglied
Was ich jetzt gefunden habe: Diese Eingabe von Hex-Codes mit ALT + muss evtl. erst aktiviert werden, also den folgenden Registry Key anlegen:
[HKEY_CURRENT_USER\Control Panel\Input Method]
"EnableHexNumpad"="1"

Nach einer Neuanmeldung / Neustart kann man dann erneut testen, ob man die Unicode Zeichen nun eingeben kann.

(War in der FAQ in https://ladedu.com/how-to-input-unicode-characters-on-windows-10/ )
Wenn das funktioniert, müsste aber jeder, der mein Programm nutzt, diese Einstellung im Registry editor vornehmen. Ich möchte auch keine Datei ausführen lassen. Einen Code dazu habe ich aber schon hier.

Ich habe mal einen Code geschrieben, der meinen Gedanken widerspiegelt:
Java:
        // "key" bekommt den Integer von "characterKey"
        String key = String.valueOf((int) characterKey);

        char a, b;

        // Wenn der Integer von "key" gleich 2 oder 3 Zeichen lang ist, wird "\u00" vorn dran gehangen:
        // Z. B.:
        // "a" ist "61" als Integer -> Wird zu "\u0061" geändert
        if (key.length() == 2 || key.length() == 3) {
            a = String.format("\\u00%x\n", (int) characterKey);
        // Wenn der Integer von "key" gleich 4 Zeichen lang ist, wird "\u0" vorn dran gehangen:
        // Z. B.:
        // "ر" ist "631" als Integer -> Wird zu "\u0631" geändert
        } else if (key.length() == 4) {
            b = String.format("\\u0%x\n", (int) characterKey);
        }

        // Hier wird nach dieser escape sequenz (\u0000) gefragt
        // In dem Falle hat "char a" oder "char b" eine Sequenz zugewiesen bekommen.
        // In meiner Fantasie ein gleicher Schritt wie siehe unten >Wie es sonst funktioniert<
        switch (characterKey) {
            case a, b -> altNumpad(autoTextRobot, String.valueOf((int) characterKey));
            default -> altNumpad(autoTextRobot, "63");
        }


        // Wie es sonst funktioniert
        switch (characterKey) {
            case '\u0061' -> altNumpad(autoTextRobot, "97");
            default -> altNumpad(autoTextRobot, "63");
        }

Natürlich ist das falsch, was auch IntelliJ bemängelt, aber wenn das auf so eine Art möglich ist, wäre mein Coding-Problem auch behoben.

In meinem Kopf erscheint dies als logisch, aber ob man das auch so umsetzen kann?
 

KonradN

Super-Moderator
Mitarbeiter
Also ich verstehe generell nicht, was Du da überhaupt genau versuchst. Das sieht alle überkompliziert aus und ich vermute ein XY Problem:
Du willst X und hast Dir da als mögliche Lösung Y ausgesucht und das wird hier überkompliziert. WIr können jetzt an der Lösung Y rumbasteln und da viel Zeit verschwenden, aber vermutlich wird es sinnvoller, einfach einmal das Problem X zu betrachten um da eine bessere Lösung zu finden.

Vielleicht gibst Du uns einfach mal etwas mehr Details, was Du überhaupt vor hast?

Wenn Du Texte irgendwo einfügen willst, dann wäre ggf. eine Möglichkeit, die Zwischenablage zu nutzen:
  • Optional: Du merkst Dir die Zwischenablage
  • Du packst den Text in die Zwischenablage
  • Du simulierst Strg. V (Einfügen der Zwischenablage)
  • Optional: Du setzt die gemerkte Zwischenablage zurück

Aber selbst das ist schon ein Workaround. Wenn Du einen Text an eine Applikation senden willst, dann kannst Du das auch direkt machen. Das kannst Du prinzipiell auch direkt an ein Control. (Ok, Java ist da nicht wirklich optimal, aber JNI und Co machen sowas möglich)
 

_user_q

Aktives Mitglied
Also ich verstehe generell nicht, was Du da überhaupt genau versuchst. Das sieht alle überkompliziert aus und ich vermute ein XY Problem:
Du willst X und hast Dir da als mögliche Lösung Y ausgesucht und das wird hier überkompliziert. WIr können jetzt an der Lösung Y rumbasteln und da viel Zeit verschwenden, aber vermutlich wird es sinnvoller, einfach einmal das Problem X zu betrachten um da eine bessere Lösung zu finden.

Vielleicht gibst Du uns einfach mal etwas mehr Details, was Du überhaupt vor hast?

Wenn Du Texte irgendwo einfügen willst, dann wäre ggf. eine Möglichkeit, die Zwischenablage zu nutzen:
  • Optional: Du merkst Dir die Zwischenablage
  • Du packst den Text in die Zwischenablage
  • Du simulierst Strg. V (Einfügen der Zwischenablage)
  • Optional: Du setzt die gemerkte Zwischenablage zurück

Aber selbst das ist schon ein Workaround. Wenn Du einen Text an eine Applikation senden willst, dann kannst Du das auch direkt machen. Das kannst Du prinzipiell auch direkt an ein Control. (Ok, Java ist da nicht wirklich optimal, aber JNI und Co machen sowas möglich)
Ich habe kurz ein kurzes Video aufgenommen, das sollte mein jetziges Vorhaben besser erklären. :)
Man beachte lieber nicht die Fehler im Code.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Woher kommen die Bildschirmkoordinaten beim java Robot? Allgemeine Java-Themen 14
T Java Robot Class - Bot Allgemeine Java-Themen 3
R Input/Output Programmierung mithilfe der Robot Bibliothek Allgemeine Java-Themen 15
N Java Robot Printscreen in bestimmter Konstellation Allgemeine Java-Themen 2
E Robot Allgemeine Java-Themen 2
H Input/Output Robot Tastenereignisse Allgemeine Java-Themen 2
P Robot --> Keyevent --> ö, ä, ü, - Allgemeine Java-Themen 8
J Erklährung für Robot KeyEvent anweisungen Allgemeine Java-Themen 2
U String und Robot Allgemeine Java-Themen 19
G Screenshot mittels robot ausführen Allgemeine Java-Themen 4
S Alternative zu Robot (wegen Umlauten) Allgemeine Java-Themen 13
S Bestimmte Tasten mit der Robot Klasse? Allgemeine Java-Themen 4
Zrebna Wie ermittelt man alle testbaren (zu testenden) Klassen in seinem Maven-Projekt? Allgemeine Java-Themen 23
_user_q Alle Kombinationen von "0000" bis "FFFF" kompakt schrieben Allgemeine Java-Themen 13
S Bookmark HTML Datei einlesen, alle Links erhalten und manche editieren..? (aktuell JSoup) Allgemeine Java-Themen 4
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
Kingamadeus2000 Alle mehrfach vorkommenden Buchstaben rekursiv aus einem String entfernen. Allgemeine Java-Themen 6
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
8u3631984 Generelle Log4j.xml für alle Module Allgemeine Java-Themen 5
L Farbverlauf RGB alle Farben Allgemeine Java-Themen 28
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
S Alle Dateinamen ermitteln Allgemeine Java-Themen 22
F Wie bekommt man alle Filenamen eines Webserver Verzeichnisses Allgemeine Java-Themen 6
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
MaxG. Best Practice Alle Kombinationen berechnen Allgemeine Java-Themen 3
J Best Practice Objekt an alle Klassen verteilen ( Discord Bot ) Allgemeine Java-Themen 7
C BufferedReader/BufferedWriter schreibt nicht alle Bytes Allgemeine Java-Themen 2
J Alle Unit Tests in Maven Modul Projekt ausführen Allgemeine Java-Themen 7
S Anwendung die alle Abhaengigkeiten einer Library listet..? Allgemeine Java-Themen 5
T Alle Kombinationen aus zwei Arrays Allgemeine Java-Themen 8
K Nicht alle class-Dateien im JRE? Allgemeine Java-Themen 2
I Alle logs von Logger bekommen Allgemeine Java-Themen 3
U javax.mail.Folder.list() zeigt nicht alle Ordner Allgemeine Java-Themen 5
K Classpath Alle Classen aus einem Package lesen Allgemeine Java-Themen 7
L Alle möglichen Additionen (Rekursiv) Allgemeine Java-Themen 3
KaffeeFan Methoden replace alle Buchstaben Allgemeine Java-Themen 3
S Alle Methodenaufrufe eines Threads notieren..? Allgemeine Java-Themen 7
U Koordinaten alle Pixel eines Dreiecks zeichnen ausgeben Allgemeine Java-Themen 5
Z Eclipse hängt sich alle paar Sekunden auf (Keine Rückmeldung). Allgemeine Java-Themen 4
Seikuassi Alle Escape-Sequenzen in einem String ersetzen Allgemeine Java-Themen 4
F Java Spintax: Alle Kombinationen Erzeugen Allgemeine Java-Themen 2
Sogomn Klassen Alle in eine Klasse Allgemeine Java-Themen 11
P Methoden Alle Kombinationen aus 2 Karten berechnen Allgemeine Java-Themen 2
B Threads Barrier mit wait()/notify() aber nicht alle Prozesse terminieren Allgemeine Java-Themen 2
S .jar hat nicht alle Klassen ??? Allgemeine Java-Themen 10
T Wie kann ich alle existierenden Java-Klassen anzeigen lassen? Allgemeine Java-Themen 10
M Zufälligen String generieren und alle 5 Minuten ändern Allgemeine Java-Themen 2
M RegEx alle Matches ausgeben Allgemeine Java-Themen 5
A Applet Alle Threads beim schließen des Applets beenden Allgemeine Java-Themen 8
C SwingWorker.cancle(true) tötet alle Worker Allgemeine Java-Themen 3
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
T Alle Instancen einer Klasse auflisten Allgemeine Java-Themen 13
S Programm das alle aufgerufenen Methoden ausgibt..? Allgemeine Java-Themen 6
S Alle Kombinationen aus ArrayList - Potenzmenge Allgemeine Java-Themen 7
D Alle Variablen final setzen ? Allgemeine Java-Themen 26
brunothg Alle Kombiationen von n Ziffern Allgemeine Java-Themen 2
M Erste Schritte alle xmlFiles in zugehörige pdfFiles einlesen Allgemeine Java-Themen 4
B Variablen Alle RenderingHints.Keys (KEY_*) in Array + alle RenderingHints.Keys (VALUE_*) in Object[] Allgemeine Java-Themen 8
D generische Klasse für alle Maps (nicht Collections :-)) Allgemeine Java-Themen 11
E Logger loggt nicht alle Level Allgemeine Java-Themen 2
S Aus einer Liste<Oberklasse> alle Elemente die eine bestimmte Unterklasse von Oberklasse haben filter Allgemeine Java-Themen 8
K String: alle X Zeichen Zeilenumbruch Allgemeine Java-Themen 3
F Alle Exceptions abfangen Allgemeine Java-Themen 4
nrg JS als ScriptEngine - alle Punkte ersetzen Allgemeine Java-Themen 4
A Bildschirmauflösung geändert - alle Bildschirminhalte verschoben - was tun? Allgemeine Java-Themen 7
C Alle Klassen eines Packages lesen und instanzieren? Allgemeine Java-Themen 9
B Alle Exceptions auf einmal abfangen Allgemeine Java-Themen 4
S Warum packt er nicht alle Dateien? Allgemeine Java-Themen 13
J Alle Tage eines Jahres Allgemeine Java-Themen 2
AlexSpritze Alle Domains oder FQDN von einem Server erfragen? Allgemeine Java-Themen 2
Spot84 alle kombinationen einer string arraylist Allgemeine Java-Themen 2
S Alle Elemente von zwei Listen vergleichen Allgemeine Java-Themen 10
J Konstrukt um alle Paare und Tripel einer Punkte-Menge bilden Allgemeine Java-Themen 12
B Alle möglichen Buchstabenkombinationen in einem String Allgemeine Java-Themen 7
P alle zusammanhaengenden teilgraphen Allgemeine Java-Themen 7
A alle nicht-dplikate finden Allgemeine Java-Themen 14
M Wie kann ich alle System.out Strings in ein log window umleiten? Allgemeine Java-Themen 6
E Alle unter Prozesse der beim schließen mit schließen Allgemeine Java-Themen 3
A An alle Cracks: Anwendung beenden mit ShutdownHook? Allgemeine Java-Themen 13
J Logger gibt nicht alle Level aus Allgemeine Java-Themen 3
M alle möglichen Zahlenkombinationen Allgemeine Java-Themen 5
B in welchem verzeichnis liegen alle installierten klassen? Allgemeine Java-Themen 6
hdi Für alle fleissigen Helfer! Allgemeine Java-Themen 15
N Alle Fehler ausgeben? Allgemeine Java-Themen 4
J Zweiter Prozess der alle x Sekunden etwas abfragen soll Allgemeine Java-Themen 2
O Auf alle Events reagieren Allgemeine Java-Themen 3
B J-Unit Tests. Alle Tests eines Package einsammen. Allgemeine Java-Themen 4
U alle Dateien eines Ordners innerhalb einer JAR auflisten Allgemeine Java-Themen 6
S toString() für alle Member einer Klasse. Allgemeine Java-Themen 6
G Alle möglichen Konfigurationen eines Baumes Allgemeine Java-Themen 4
C Alle Möglichen Substrings der Länge k aus String extrahieren Allgemeine Java-Themen 9
C Alle Bilder eines binären Arrays ausgeben Allgemeine Java-Themen 3
G Alle möglichen Permutationen einer Folge n Allgemeine Java-Themen 3
V Alle Klassen eines Package auflisten? Allgemeine Java-Themen 6
H JTable Löschen [Alle Zeilen aufeinmal Löschen] Allgemeine Java-Themen 6
@ RegEx: Alle Sonderzeichen ausser dem Punkt Allgemeine Java-Themen 4
G Alle Möglichen Kombinationen einer Liste Allgemeine Java-Themen 11
H Alle möglichen Hochkommata ausschließen Allgemeine Java-Themen 6
M Gibt es ein Jar - das alle Componente Automatisch anpasst? Allgemeine Java-Themen 14

Ähnliche Java Themen

Neue Themen


Oben