# Tastendruck simulieren



## LoN_Nemesis (19. Jan 2006)

Hallo,

ich möchte gerne ein kleines Java Programm/Applet schreiben, welches ein anderes Programm "steuert". Ist dies überhaupt möglich? Also es geht darum, dass ich ein Spiel steuern möchte. Für den Anfang würde es mir schon reichen, alle x Sekunden die Taste K zu drücken.

Gibt es irgendwelche Denkanstösse? Wäre für jede Hilfe dankbar


----------



## clemson (19. Jan 2006)

das hilf dir glaub ich weiter...


----------



## LoN_Nemesis (19. Jan 2006)

Vielen Dank, schau mir das mal an und probiere es aus  Danke für die schnelle Antwort


----------



## L-ectron-X (20. Jan 2006)

Im Chat hatten wir vor einigen Tagen mal darüber gesprochen und Beispielcode gepostet.
http://www.java-forum.org/de/viewtopic.php?t=26621


----------



## LoN_Nemesis (20. Jan 2006)

Vielen Dank, also das war alles sehr hilfreich. Ich habe nun mit der Robot Klasse ein wenig rumgespielt und sie tut genau das was ich möchte, perfekt! Aber nun habe ich ein anderes Problem 

Und zwar möchte ein kleines GUI anbieten, in dem man die Zeit zwischen den Tastendrücken einstellen kann und ausserdem ein Start/Stop Knopf zum Starten und Anhalten des Programmes. Nun ist mein Problem folgendes: Ich weiss nicht wo ich die Robot Funktionalität unterbringen soll. Wenn ich in der Mainmethode erst das UI erstelle und dann eine Endlosschleife mache, dann steigt die CPU Auslastung auf 50%  Ausserdem weiss ich nicht, ob dann noch so Sachen wie ActionListener funktionieren, wenn man nur in dieser Endlosschleife feststeckt? Irgendwie mit Threads wohl, nur wie? Verstehe leider die Beispiele die ich mir angesehen habe nicht richtig.

Weiss jemand Rat?


----------



## André Uhres (20. Jan 2006)

```
/* 
* Game_Robot.java 
*/ 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
public class Game_Robot extends JFrame implements ActionListener{ 
    public Game_Robot() { 
        super("Game Robot"); 
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
        setAlwaysOnTop(true); 
        try { 
            robot = new Robot(); 
        } catch (AWTException ex) { 
            ex.printStackTrace(); 
        } 
        mainPanel = new JPanel(); 
        delayF = new JTextField("500"); 
        startB = new JToggleButton("Start"); 
        delayF.setPreferredSize(new Dimension(100, 20)); 
        mainPanel.add(delayF); 
        startB.addActionListener(new ActionListener() { 
            public void actionPerformed(ActionEvent evt) { 
                startBActionPerformed(evt); 
            } 
        }); 
        mainPanel.add(startB); 
        getContentPane().add(mainPanel, BorderLayout.CENTER); 
        pack(); 
    } 
    private void startBActionPerformed(ActionEvent evt) { 
        if(startB.isSelected()){ 
            //Die Alt-Tab Tastenkombination gibt den Focus wieder an den zu kontrollierenden Prozess: 
            robot.keyPress(KeyEvent.VK_ALT); 
            robot.keyPress(KeyEvent.VK_TAB); 
            robot.keyRelease(KeyEvent.VK_TAB); 
            robot.keyRelease(KeyEvent.VK_ALT); 

            timer = new Timer(Integer.parseInt(delayF.getText().trim()), this); 
            timer.start();//Timer startet. Alle "delay" Millisekunden, wird actionPerformed aufgerufen 
            delayF.setFocusable(false);  //Textfeld nicht fokusierbar, sonst würde es mit k's gefüllt wenn man drauf geht 
        }else{ 
            timer.stop();    //Timer stoppt
            delayF.setFocusable(true);    //Textfeld wieder fokusierbar um den delay ändern zu können 
        } 
    } 
    public void actionPerformed(ActionEvent e) { 
        //Alle "delay" Millisekunden, wird actionPerformed aufgerufen 
        //und die K-Taste gedrückt:
        robot.keyPress(KeyEvent.VK_K); 
        robot.keyRelease(KeyEvent.VK_K); 
    } 
    public static void main(String args[]) {new Game_Robot().setVisible(true);} 
    private JPanel mainPanel; 
    private JTextField delayF; 
    private JToggleButton startB; 
    private Timer timer; 
    private Robot robot; 
}
```


----------



## LoN_Nemesis (20. Jan 2006)

Wow, es funktioniert  Nur wenn ich ehrlich bin verstehe ich nicht warum 

Du startest einen Timer, ok, aber weiter? Wird jedesmal wenn der Timer "tickt" die Methode ActionPerformed aufgerufen? Und warum machst du das Fenster nicht fokusierbar?

Unendlichen Dank jedenfalls


----------



## André Uhres (20. Jan 2006)

Sobald "Start" gedrückt wird gibt die "Alt-Tab" Tastenkombination den Focus wieder an den 
zu kontrollierenden Prozess.
Der Timer startet. Alle "delay" Millisekunden, wird actionPerformed aufgerufen 
wo die K-Taste gedrückt wird.
Das Textfeld ist jetzt nicht mehr fokusierbar, sonst würde es mit k's gefüllt wenn man drauf geht.
Sobald "Start" wieder losgelassen wird, stoppt der Timer und das Textfeld wird wieder 
fokusierbar um den "delay" ändern zu können.

PS: Man kann natürlich auch einen FocusListener an das Textfeld hängen und bei focusGained
den Timer stoppen und den Button setSelected(false) setzen. Dann kann das Textfeld fokusierbar bleiben.
Das Ganze ist dann etwas bequemer zu bedienen:

```
delayF.addFocusListener(new FocusListener(){
            public void focusGained(FocusEvent e) {
                if(timer!=null && timer.isRunning()){
                    timer.stop();
                    startB.setSelected(false);
                }
            }
            public void focusLost(FocusEvent e) {
            }
        });
//Die beiden "delayF.setFocusable(..)"-Anweisungen entfernen !
```


----------

