Zum Inhalt springen

String in einzelne KeyEvents umwandeln? Wie geht das?


Devilmarkus

Empfohlene Beiträge

Hallo,

ich möchte in einen Emulator "Autotype" implementieren.

Dazu möchte ich einen String auslesen und ihn in die einzelnen Buchstaben / Zeichen zerlegen.

Diese einzelnen Buchstaben sollen dann in KeyEvents umgewandelt werden.

Das Problem, was sich mir auch noch bietet ist, dass die Tastaturabfrage im gegensatz zur emulierten CPU recht träge reagiert und man so die CPU erst 20.000x "cyclen" lassen muss, bevor man die nächste Taste drücken kann.

Ein Beispiel, wo ich schonmal kleinere Befehle auf den Computer übertrage, habe ich (verkürzt) hier mal als Code:



    public int attyper = 0;

    public int cattyper = 0;

    public int cpmtyper = 0;

    public int rdtyper = 0;


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


  public void cycle() {

    this.gateArray.cycle();

    this.fdc.cycle();

    if ((this.audioCount += this.audioAdd / Switches.turbo) >= AUDIO_TEST) {

      this.psg.writeAudio();

      this.audioCount -= AUDIO_TEST;

    }

    if (attyper !=0){

        attyper++;

        if (attyper == 20000){

            keyboarda.keyReleased(KeyEvent.VK_OPEN_BRACKET);

            attyper = 0;

        }

    }


    if (cpmtyper !=0){

        cpmtyper++;

        if (cpmtyper == 20000){

            keyboarda.keyReleased(KeyEvent.VK_OPEN_BRACKET);

            keyboarda.keyPressed(KeyEvent.VK_C);

        }

        if (cpmtyper == 40000){

            keyboarda.keyReleased(KeyEvent.VK_C);

            keyboarda.keyPressed(KeyEvent.VK_P);

        }

        if (cpmtyper == 60000){

            keyboarda.keyReleased(KeyEvent.VK_P);

            keyboarda.keyPressed(KeyEvent.VK_M);

        }

        if (cpmtyper == 80000){

            keyboarda.keyReleased(KeyEvent.VK_M);

            keyboarda.keyPressed(KeyEvent.VK_ENTER);

        }

        if (cpmtyper == 100000){

            keyboarda.keyReleased(KeyEvent.VK_ENTER);

            keyboarda.keyReleased(KeyEvent.VK_SHIFT);

                    cpmtyper = 0;

        }

    }    

    if (rdtyper !=0){

        rdtyper++;

        if (rdtyper == 20000){

            keyboarda.keyReleased(KeyEvent.VK_R);

            keyboarda.keyPressed(KeyEvent.VK_U);

        }

        if (rdtyper == 40000){

            keyboarda.keyReleased(KeyEvent.VK_U);

            keyboarda.keyPressed(KeyEvent.VK_N);

        }

        if (rdtyper == 60000){

            keyboarda.keyReleased(KeyEvent.VK_N);

            keyboarda.keyPressed(KeyEvent.VK_2);

        }

        if (rdtyper == 80000){

            keyboarda.keyReleased(KeyEvent.VK_2);

            keyboarda.keyReleased(KeyEvent.VK_SHIFT);

                    rdtyper = 0;

        }

    }



    if (cattyper !=0){

        cattyper++;

        if (cattyper == 20000){

            keyboarda.keyReleased(KeyEvent.VK_C);

            keyboarda.keyPressed(KeyEvent.VK_A);

        }

        if (cattyper == 40000){

            keyboarda.keyReleased(KeyEvent.VK_A);

            keyboarda.keyPressed(KeyEvent.VK_T);

        }

        if (cattyper == 60000){

            keyboarda.keyReleased(KeyEvent.VK_T);

            keyboarda.keyPressed(KeyEvent.VK_ENTER);

        }

        if (cattyper == 80000){

            keyboarda.keyReleased(KeyEvent.VK_ENTER);

            keyboarda.keyReleased(KeyEvent.VK_SHIFT);

            cattyper = 0;

        }

    }

  }



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



  public void AtKey(){

          this.keyboarda.keyPressed(KeyEvent.VK_OPEN_BRACKET);

          attyper = 1;

    }  

  public void typeCat(){

          this.keyboarda.keyPressed(KeyEvent.VK_SHIFT);

          this.keyboarda.keyPressed(KeyEvent.VK_C);

          cattyper = 1;

    }  


  public void typeRun(){

          this.keyboarda.keyPressed(KeyEvent.VK_SHIFT);

          this.keyboarda.keyPressed(KeyEvent.VK_R);

          rdtyper = 1;

    }  


  public void bootCPM(){

          this.keyboarda.keyPressed(KeyEvent.VK_SHIFT);

          this.keyboarda.keyPressed(KeyEvent.VK_OPEN_BRACKET);

          cpmtyper = 1;

    }  

cycle() läuft also ständig und dort kann man einen Timer ansetzen.

Die 4 Befehle danach stellen 4 verschiedene "automatische" Keyboard - Eingaben dar.

Mein Ziel ist es, einen String festzulegen, diesen in die einzelnen Buchstaben zu zerlegen und diese als Tastenkette an den Computer weiterzugeben.

Bitte helft mir!!!!!!!!!!!!!!!!

Gruss, Markus

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du müßtest den String in ein Array aus VK_-Werten umwandeln. Dann kannst Du so:


if (cpmtyper !=0){

  cpmtyper++;

  if (cpmtyper % 20000 == 0) {

    keyboarda.keyReleased(eventArray[cpmtyper/20000 - 1]);

    keyboarda.keyPressed(eventArray[cpmtyper/20000 - 1]);

  }

}
die Befehle ausführen. Wie Du allerdings am geschicktesten den String in VK_-Events umwandelst, weiß ich auch nicht, sorry. Im Prinzip läuft es allerdings so:

String cmd = "RUN\n";

int[] eventArray = new int[cmd.length()];

for(int i = 0; i < cmd.length(); i++) {

  eventArray[i] = convertCharToVK(cmd.charAt(i));

}

Ich weiß nicht, ob in irgendeiner Bibliothek (oder gar in der Java API) solch eine Konvertierung existiert. Notfalls müßte man sie halt selbst schreiben, wobei man da eben nochmal die Spezialfälle wie Steuerzeichen überprüfen sollte.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Newlukai,

leider funktioniert Dein Vorschlag nicht.

Er fragt nach convertCharToVK (ist nicht definiert)

Und er schreibt, dass incompatible types gefunden wurden.

(Required int, found convertCharToVK)

Trotzdem danke für Deine Mühe.

Vielleicht gibt es ja noch eine andere Lösung...

(Die For-Schleife im cycle() ist auf jeden Fall ein guter Ansatz)

Gruss, Markus

Edit:

Hier könnt Ihr das Applet mal als Webstart-Application testen:

popup

Die 4 Knöpfe oben rechts dienen der automatischen Befehlseingabe...

Ziel ist, soetwas aus einem Parameter lesen zu können, und z.B. nach dem Start ein RUN"DISC" ausführen zu können.

Den kompletten Source-Code gibt es für interessierte hier: SourceForge.net: JavaCPC - Amstrad CPC emulator in JAVA

Link zu diesem Kommentar
Auf anderen Seiten teilen

leider funktioniert Dein Vorschlag nicht.

Er fragt nach convertCharToVK (ist nicht definiert)

Und er schreibt, dass incompatible types gefunden wurden.

(Required int, found convertCharToVK)

Äh ... logisch. Vielleicht habe ich mich nicht klar genug ausgedrückt, sorry. Aber die Methode "convertCharToVK()" wäre von Dir zu implementieren. Darin sollte eine Konvertierung von einem char zu einer VK-Konstanten erfolgen:

public static convertCharToVK(char in) {

  switch(in) {

    case 'A':

    case 'a':

      return VK_A;

      break;

    case 'B':

    case 'b':

      return VK_B;

      break;

//...

  }

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Newlukai,

Dein Ansatz war echt gut!

Habe dank ein paar Veränderungen das erreichen können, was ich brauchte.

Man kann nun in der javacpc.ini den Wert 'autoload' angeben. Dann startet der Emulator genau dieses Programm, wenn es sich auf der eingelegten Disk (Image) befindet!

Klasse!

Danke Dir nochmal!

Zum Probieren:

Nochmal die Webstart Application öffnen.

Download dieses Disk-Images:

http://cpc.devilmarkus.de/clevsma.dsk

Dieses durch Mausklick auf "Local File" öffnen... Dann nochmal den Emulator schliessen.

Nun einfach mal die 'javacpc.ini" mit nem Texteditor bearbeiten und folgende Zeile hinzufügen:

autoload=clever

Nun nochmal die Webstart Application starten.

Anmerkung: javacpc.ini wird bei Benutzung mit dem IE auf den Desktop geschrieben.

Bei Firefox-Benutzern findet man diese in c:\programme\mozilla firefox\

Nach einmaligem Aufruf dieses "autoloads" wird es gelöscht.

(Ich möchte die Funktion für ein externes Programm nutzen, welches Disk-Images in Emulatoren einbindet und per autoload-funktion eben ein Programm gestartet werden kann)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...