Input/Output Programmierung mithilfe der Robot Bibliothek

redacted

Aktives Mitglied
Hey🙂,

/*
vorab, bitte keine Vorschläge, wie ändere doch die Programmiersprache, da das in (Python, C#,C++) alles viel einfacher ist. Es geht mir hier ums Prinzip, dass das ganze in Java umsetzbar ist und es ist meine erste "komplexere Programmierung", auch wenn ich noch eher neu im Coden bin. Außerdem seid bitte freundlich zu allen hier, beleidigende Kommentare oder ähnliches helfen NICHT weiter. Aber jetzt los:
*/

Ich bin gerade dabei auf eigene Faust zu programmieren (Künstliche Intelligenz) und möchte jetzt die grundlagen für das spätere Programm schreiben. Das Programm, an dem ich im Moment arbeite soll später automatisch 500 Zeilen lange Programme erstellen, die dann ausgeführt werden und in einem Stresstest eine Stunde lang auf Abstürze überprüft werden. Dabei werden bestimmte Schreibmöglichkeiten vorgegeben, die zufällig zusammengesetzt werden sollen. Es werden 50 Programme parallel geschrieben. Nachdem jedes von ihnen getestet wurde, wird das Programm mit der kleinsten Absturzrate für einen zweiten Durchgang kopiert und dann auf Basis von dem, was ausgewählt wurde zum schreiben, zufällig die Schreibmöglichkeiten 49 mal neu ausgewählt. Wenn ihr jetzt verwirrt seit, verlinke ich euch ein Projektdiagramm, in dem das ganze anschaulicher aufgeschrieben ist (.pap Datei(gezipt), sonst der link für das .pap als einzelne Fotos:Seite 1, Seite 2, Seite 3, Seite 4). Die Programme, die entstehen werden, werden alle einzeln in einen Ordner gespeichert (als .txt Dateien). Um diese zu schreiben, habe ich mir die Robots Bibliothek zunutze gemacht(Code ist verlinkt). Nun habe ich eine Funktion entworfen, die die Tastatureingaben für einzelne Buchstaben faked, wenn diese in einem String gespeichert werden. Das funktioniert nun aber nur für einen einzigen Buchstaben. Sobald der String z.B. hi enthält wird nichts mehr ausgegeben(Ich habe versucht in einer for schleife immer 1 von dem String zu entfernen und dann einmal den Robot den Buchstaben schreiben lassen, aber das hat nicht so recht funktioniert). Außerdem wird Klammer auf und Klammer zu (()) von Java nicht erkannt und spuckt nur Fehler aus. Hier frage ich euch: Wie kann ich den Robot so kompatibel machen, dass mir nicht entweder immer nur ein Buchstabe oder ganz viele, bis der PC abstürtzt ausgeben wird und wie kann ich mit der Robot library Klammern, vorallendingen auch geschweifte Klammern ({}) und eckige Klammern ([]) schreiben.

Ich freue Mich auf euere Vorschläge!
~Redacted

Code:
package de.brain.java;

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.io.Console;
import java.io.IOException;
import java.util.logging.ConsoleHandler;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Date;
import java.util.Scanner;
import java.sql.Time;
import java.time.*;
import java.util.concurrent.TimeUnit;;

public class CoreOfBrain {
 
 
 
   public static boolean Zeit() {
       int Sekunden = 0;
       while(true){
           Sekunden= Sekunden + 1;
           try {
               TimeUnit.SECONDS.sleep(1);
           } catch (InterruptedException e) {
        
               e.printStackTrace();
           }
    
           System.out.println(Sekunden);
       }
 
   }
 
 
public static int random() {
 
 
 
   int d=(int) ((Math.random()*1000)%101);
        System.out.println(d);
    

       return d;
 
 
   }
public static void stringify(String s) throws AWTException {
   /*
  Method yet only implemented for letters a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,
  . and spacebar
  */
   Robot r = new Robot();
 
 
   Scanner scanner = new Scanner(System.in);
 
   for(int o=s.length(); o>0; o--){
   String character= s.trim();
   String u = character;
 
       //String u=s;
 
   if(u.contains(" "))
   {
       r.keyPress(KeyEvent.VK_SPACE);
       r.keyRelease(KeyEvent.VK_SPACE);
   }
 
   if(u.contains("a"))
   {
       r.keyPress(KeyEvent.VK_A);
       r.keyRelease(KeyEvent.VK_A);
   }
 
   if(u.contains("b"))
   {
       r.keyPress(KeyEvent.VK_B);
       r.keyRelease(KeyEvent.VK_B);
   }
 
   if(u.contains("c"))
   {
       r.keyPress(KeyEvent.VK_C);
       r.keyRelease(KeyEvent.VK_C);
   }
 
 
   if(u.contains("d"))
   {
       r.keyPress(KeyEvent.VK_D);
       r.keyRelease(KeyEvent.VK_D);
   }
 
   if(u.contains("e"))
   {
       r.keyPress(KeyEvent.VK_E);
       r.keyRelease(KeyEvent.VK_E);
   }
 
 
   if(u.contains("f"))
   {
       r.keyPress(KeyEvent.VK_F);
       r.keyRelease(KeyEvent.VK_F);
   }
 
 
   if(u.contains("g"))
   {
       r.keyPress(KeyEvent.VK_G);
       r.keyRelease(KeyEvent.VK_G);
   }
 
 
   if(u.contains("h"))
   {
       r.keyPress(KeyEvent.VK_H);
       r.keyRelease(KeyEvent.VK_H);
   }
 
 
   if(u.contains("i"))
   {
       r.keyPress(KeyEvent.VK_I);
       r.keyRelease(KeyEvent.VK_I);
   }
 
 
   if(u.contains("j"))
   {
       r.keyPress(KeyEvent.VK_J);
       r.keyRelease(KeyEvent.VK_J);
   }
 
 
   if(u.contains("k"))
   {
       r.keyPress(KeyEvent.VK_K);
       r.keyRelease(KeyEvent.VK_K);
   }
 
 
   if(u.contains("l"))
   {
       r.keyPress(KeyEvent.VK_L);
       r.keyRelease(KeyEvent.VK_L);
   }
 
 
   if(u.contains("m"))
   {
       r.keyPress(KeyEvent.VK_M);
       r.keyRelease(KeyEvent.VK_M);
   }
 
 
   if(u.contains("n"))
   {
       r.keyPress(KeyEvent.VK_N);
       r.keyRelease(KeyEvent.VK_N);
   }
 
   if(u.contains("o"))
   {
       r.keyPress(KeyEvent.VK_O);
       r.keyRelease(KeyEvent.VK_O);
   }
 
   if(u.contains("p"))
   {
       r.keyPress(KeyEvent.VK_P);
       r.keyRelease(KeyEvent.VK_P);
   }
 
   if(u.contains("q"))
   {
       r.keyPress(KeyEvent.VK_Q);
       r.keyRelease(KeyEvent.VK_Q);
   }
 
   if(u.contains("r"))
   {
       r.keyPress(KeyEvent.VK_R);
       r.keyRelease(KeyEvent.VK_R);
   }
 
   if(u.contains("s"))
   {
       r.keyPress(KeyEvent.VK_S);
       r.keyRelease(KeyEvent.VK_S);
   }
 
   if(u.contains("t"))
   {
       r.keyPress(KeyEvent.VK_T);
       r.keyRelease(KeyEvent.VK_T);
   }
 
   if(u.contains("u"))
   {
       r.keyPress(KeyEvent.VK_U);
       r.keyRelease(KeyEvent.VK_U);
   }
 
   if(u.contains("v"))
   {
       r.keyPress(KeyEvent.VK_V);
       r.keyRelease(KeyEvent.VK_V);
   }
 
   if(u.contains("w"))
   {
       r.keyPress(KeyEvent.VK_W);
       r.keyRelease(KeyEvent.VK_W);
   }
 
   if(u.contains("x"))
   {
       r.keyPress(KeyEvent.VK_X);
       r.keyRelease(KeyEvent.VK_X);
   }
 
   if(u.contains("y"))
   {
       r.keyPress(KeyEvent.VK_Y);
       r.keyRelease(KeyEvent.VK_Y);
   }
 
   if(u.contains("z"))
   {
       r.keyPress(KeyEvent.VK_Z);
       r.keyRelease(KeyEvent.VK_Z);
   }
 
   if (u.contentEquals("("))
   {
       r.keyPress(KeyEvent.VK_OPEN_BRACKET);
       r.keyRelease(KeyEvent.VK_OPEN_BRACKET);
   }
 
   if (u.contentEquals(")"))
   {
       r.keyPress(KeyEvent.VK_CLOSE_BRACKET);
       r.keyRelease(KeyEvent.VK_CLOSE_BRACKET);
   }
 
   if (u.contentEquals("."))
   {
       r.keyPress(KeyEvent.VK_PERIOD);
       r.keyRelease(KeyEvent.VK_PERIOD);
   }
 
 
 
 
   }
   scanner.close();
   }
 
 
 
 



/*
public static void zero() throws AWTException {
 
 
}
*/



public static void main(String[] args) throws AWTException{
   try {
       Runtime.getRuntime().exec("notepad");
   } catch (IOException e) {
       e.printStackTrace();
        System.err.println("Caught IOException: " +  e.getMessage());
   }
 
   stringify("..");
 
   /*
   random(999999);
   if (System.out.append((char) 0) != null){zero();}
 
   */
}


 
 
 
}
Screenshot_1.png

Screenshot_2.png

Screenshot_4.png

Screenshot_5.png
 

Anhänge

Zuletzt bearbeitet:
Java:
String character= s.trim();
Damit willst du immer ein Zeichen entfernen? Trim macht nichts anderes als Leerzeichen am Anfang/Ende zu entfernen um valide Eingaben zu erhalten. Bei Benutzereingaben sind z.B. noch ungewünschte Leerzeichen enthalten. Für einzelne Zeichen in einem String gibt es die charAt() Methode. Du musst den String auch nicht verkleinern.
---
Reduzier die if's! z.B. könnte man den Ansatz wählen:
VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A)
VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39)
---
Java:
for(int o=s.length(); o>0; o--)
Was in die eine Richtung so funktioniert, funktioniert nur bedingt genauso in die andere. Vermutlich wird dich das eher ans Ziel führen
Java:
for(int o=s.length()-1; o>=0; o--)
---
Java:
           if (u.contentEquals("("))
           {
               r.keyPress(KeyEvent.VK_OPEN_BRACKET);
               r.keyRelease(KeyEvent.VK_OPEN_BRACKET);
           }
     
           if (u.contentEquals(")"))
           {
               r.keyPress(KeyEvent.VK_CLOSE_BRACKET);
               r.keyRelease(KeyEvent.VK_CLOSE_BRACKET);
           }
( und ) sind aber keine Brackets. Brackets sind [ und ]. Du suchst eher nach Paranthesis anstatt Brackets. Wenn du hier https://docs.oracle.com/javase/7/docs/api/java/awt/event/KeyEvent.html nach "Brace" suchst, findest du bestimmt auch { und }.
---
PS.: Beleidigende Kommentare sehe ich in der Regel nur, wenn man mit den Wünschen die Ethik herausfordert (z.B. fertiger Code um in der Uni zu bestehen) oder mehr als ungenügend Informationen liefert um irgendwie helfen zu können. Ich sehe bei dir soweit keinen Grund warum jemand ausfällig werden könnte 🙂
 
Zuletzt bearbeitet:
VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A)
VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39)
---
Das verstehe ich leider nicht ganz. Gibt es da eine Funktion für, die die ifs ersetzt, weil das sieht nicht nach für Java kompilierbarem Code aus? Oder meinst du, z.B. eine for schleife zu setzten und dann die ASCII Zeichen mit den jeweiligen Zahlen der for Schleife gleichsetzten, damit dann danach das zugeordnet werden kann?

Danke auf jeden Fall für deine Antworten, ich probiere das mal aus!
Den Absatz zu den Beleidigungen habe ich hauptsächlich geschrieben, da ich gesehen habe, wie viele Forendiskussionen auf unsachlicher Ebene eskalieren, wobei dies reine Zeitverschwendung ist.
 
Zuletzt bearbeitet:
Das war ein Zitat aus der Doku. In anderen Worten sofern sich dein Buchstabe innerhalb der angegeben Range befindet kannst du ihn ohne KeyEvent direkt an Robot geben. Aber Achtung a-z ist nicht A-Z
 
bedeutet an Robot geben denn auch, dass die Taste dann auch gedrückt wird, bzw geschrieben? Darum geht es mir ja im Prinzip: Automatisch schreiben lassen.

Die Fehlermeldung bleibt leider, wenn ich versuche eine Klammer auszugeben. Auch mit Parenthesis.

Fehlermeldung:

Exception in thread "main" java.lang.IllegalArgumentException: Invalid key code
at sun.awt.windows.WRobotPeer.keyPress(Native Method)
at java.awt.Robot.keyPress(Unknown Source)
at de.brain.java.CoreOfBrain.stringify(CoreOfBrain.java:251)
at de.brain.java.CoreOfBrain.main(CoreOfBrain.java:297)
 
Zuletzt bearbeitet:
So, ich habe das ganze jetzt mal versucht zu verbessern...und tatsächlich: die if abfragen waren komplett unnötig. Ich fasse den Code hier einmal ohne die auskommentierten Zeichen zusammen:
Code:
public static void stringify(String s) throws AWTException {
    Robot r = new Robot();
   
   
    for(int o=1; o<=s.length();o++)
    {
    r.keyPress(s.charAt(o));
    r.keyPress(s.charAt(o));
        }
}

public static void main(String[] args) throws AWTException{
    try {
        Runtime.getRuntime().exec("notepad");
    } catch (IOException e) {
        e.printStackTrace();
        System.err.println("Caught IOException: " +  e.getMessage());
    }
   
    stringify("da");

Leider ist der Output in Notepad dann nur
, aber immerhin werden Punkte richtig geschrieben (auch in der Anzahl).
 
Du hast jetzt in der Schleife aber wieder den Dreher drin. Vorwärts beginnst du immer bei null.
Java:
for(int o=0; o<s.length();o++)
Rückwärts muss es anders aussehen!

Und das direkt Übergeben funktioniert eben auch nur für 0-9 und A-Z (nicht a-z). Eventuell vereinzelt auch andere Zeichen wie Punkt das weiß ich nicht genau. a-Z Könntest du aber in A-Z umwandeln. Ganz auf Ifs wirst du wahrscheinlich nicht verzichten können aber eben deutlich reduzieren
 
ich hatte es auch einmal mit
Code:
for(int o=s.length(); o<=0; o--)

Das hat genauso wenig funktioniert. Ebenfalls geht es nicht wenn es große Buchstaben sind. Der Punkt bleibt (leider) das einzige Zeichen, dass sich damit bis jetzt schreiben lässt. Ich wundere mich auch darüber, dass Java es einem so schwer macht, Tastatureingaben zu faken.
 
Zuletzt bearbeitet:
So ich habe hierran jetzt über 2 Stunden gearbeitet, es immer wieder verworfen und neu geschrieben und bin letztlich zu folgendem gekommen:
Code:
public static void main(String[] args) throws AWTException{
    try {
        Runtime.getRuntime().exec("notepad");
    } catch (IOException e) {
        e.printStackTrace();
        System.err.println("Caught IOException: " +  e.getMessage());
    }
 
    Robot r = new Robot();
    String schreiben="Jaaaaaaaaaaaaaaa";
    char[] lel=schreiben.toCharArray();
    for(int i=0; i>=schreiben.length();i++){
    r.keyPress(KeyStroke.getKeyStroke(lel[i]).getKeyCode());
    r.keyRelease(KeyStroke.getKeyStroke(lel[i]).getKeyCode());
    }

Ich weiß nicht, warum es nicht funktioniert, immerhin habe ich die chars schonmal alle einzeln in einem Array names "lel" gespeichert. Darüber lässt sich im Printstream auch problemlos iterieren mit
Code:
System.out.println(lel[integerFürDenBuchstabenDenManAnsprechenWill]);

Die for Schleife lasse ich von 0 auf die Länge des Strings in chars zulaufen, da mir dann die Buchstaben in der richtigen Reihenfolge ausgegeben werden. Ich möchte ja nicht alle Wörte vom Robot rückwärts schreiben lassen und sehe auch keinen Sinn darin, oder eventuelle Performanceschübe, die for Schleife rückwärts laufen zu lassen. Generell ist mir die Performance des Programms eigentlich egal, insofern eine .txt Datei mit dem Writer keine Stunde braucht um 500 Zeilen Code zu schreiben. Ich möchte lediglich wissen, wie ich den Robot korrekt zu laufen bringe.
 
Ah ich glaube ich habs...der Robot nimmt ja nur Großbuchstaben an. Vielleicht ließe sich da ja eine funktion schreiben, die die großBuchstaben für den Robot faked...ich bin jetzt aber langsam müde, gehe erstmal schlafen. Kanns ja später mal reinposten, wenn ich das umgesetzt habe
 
Bei der Rückwärtsschleife fängst du bei length-1 an.

Ich habe mich auch ein wenig zu Robot belesen. Robot ist nicht wirklich intelligent ich habe mich davor nie damit auseinandergesetzt. Manche Zeichen kannst du über Tastaturkombinationen Faken, du musst also 2 Tasten simulieren
 
ich bin jetzt auf ein anderes Design gestoßen, dass schonmal für A-Z,a-z und 0-9, sowie leerzeichen und Punkt funktioniert. Versuche gerade das ganze noch für {}[]~| zu implementieren...und auch andere sonderzeichen

die Frage ist ob man über ein charArray mit .equals("}") z.B. iterieren kann, dass dann in eine if abfrage. Bzw. ich habe {[]}~| in einen String geschrieben und den dann mit .toCharArray in einzelne Buchstaben überführt
 
Zuletzt bearbeitet:
Das mit der Rückwärtsschleife verstehe ich leider nicht. Ist etwas aufwändiger als gedacht sonderzeichen zu coden. Das Grundgerüst habe ich allerdings aus einer anderen Diskussion auf dieser Seite
 
Das Problem ist jetzt ein für alle mal gelöst und das für alle Zeichen jeder Tastatur 😀 da hätte ich echt früher drauf kommen sollen, aber naja ich bin froh jetzt endlich das am laufen zu haben...😛🙂🙂🙂😀

was basically passiert, ist, dass der den String den ich schreiben will in den Zwischenspeicher kopiert und der Robot dann für mich strg+v (oder auch einfügen) drückt xD...so einfach gehts
Code:
public static void main(String[] args) throws AWTException{
    try {
        Runtime.getRuntime().exec("notepad");
       
        String text = "public static void main(String[] args) throws AWTException{}";
        StringSelection stringSelection = new StringSelection(text);
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        clipboard.setContents(stringSelection, stringSelection);

        Robot robot = new Robot();
       
        synchronized (robot)
        {
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_V);
        }
       
        robot.keyRelease(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_CONTROL);
    } catch (IOException e)
    {
       
        e.printStackTrace();
        System.err.println("Caught IOException: " +  e.getMessage());
    }
 
soweit ich verstehe, dass die Tasten gleichzeitig gedrückt werden/die eine gedrückt gehalten, bis die andere auch gedrückt wird. Warum denn? Bin jetzt wieder auf ein Problem gestoßen. Ich kriege es nicht hin, hintereinander die Strings in einem Array an das clipboard zu übertragen, damit der das reinpasten kann. bei mir kommt dann immer nur folgende fehlermeldung:
Exception in thread "main" java.lang.IllegalStateException: cannot open system clipboard
at sun.awt.windows.WClipboard.openClipboard(Native Method)
at sun.awt.datatransfer.ClipboardTransferable.<init>(Unknown Source)
at sun.awt.datatransfer.SunClipboard.getContents(Unknown Source)
at de.brain.java.CoreOfBrain.main(CoreOfBrain.java:42)


das hier ist mein aktueller Code:

Code:
package de.brain.java;







import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

public class CoreOfBrain extends Schreibmöglichkeiten {       

public static int random()
    {
        int d=(int) ((Math.random()*1000)%101);
        System.out.println(d);
        return d;       
    }



public static void main(String[] args) throws AWTException
    {
    try
        {
            Runtime.getRuntime().exec("notepad");

           
            String[] myArray = new String[]{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "Ü", "ü", "Ö", "ö", "Ä", "ä", "€", "@", " ", "|", "<", ">", "~", "*", "+", "'", "#", ".", ":", ",", ";", "_", "-", "\\", "}", "]", "{", "[", "ß", "?", "=", "(", ")", "/", "&", "%", "$", "§", "\"", "!", ""};
            for(String s:myArray){
                StringSelection stringSelection = new StringSelection(s);
                Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
                clipboard.setContents(stringSelection, stringSelection);

            Robot robot = new Robot();
       
        synchronized (robot)
            {   
            robot.keyPress(KeyEvent.VK_CONTROL);
            robot.keyPress(KeyEvent.VK_V);
            }
        synchronized (robot)
            {
            robot.keyRelease(KeyEvent.VK_V);
            robot.keyRelease(KeyEvent.VK_CONTROL);
            }
        }
        }
    catch (IOException e)
        {
            e.printStackTrace();
            System.err.println("Caught IOException: " +  e.getMessage());
        }
           
            random();
    }   
}
 

Zurück
Oben