# Tastendruck abfragen



## Donut (28. Jun 2004)

hiho

Ich will beim drücken der (z.b.) F2- taste ne Methode auslösen....
Und zwar auch, wenn das Fenster nicht aktiviert ist....
Wiem acht man das?


----------



## L-ectron-X (28. Jun 2004)

Die Informationen zu Deinem Problem sind recht dürftig. ???:L
Welches Fenster? Wie, nicht aktiviert? Willst Du KeyEvents abfangen? 
Meinst Du dann eventuell so etwas? Ich rate ungern so ins Blaue. :? 

```
public void keyPressed(KeyEvent ev) { 
  if (ev.getKeyCode() == KeyEvent.VK_F2) { 
    //tu was
  } 
}
```
Vermutlich kann aber ein deaktiviertes Fenster (Fenster ohne Focus) keine Events empfangen.


----------



## Donut (28. Jun 2004)

sorry für den informationsoverkill 

folgendes:
ich schreibe gerade einen bot, der ganz bestimmte Mausklicks immer wieder ausführt.
die soll aber passieren, wenn nicht das Java-Programm im vordergrund ist, sondern, wie in meinem Fall, ein Spiel.

Wenn ich also das spiel maximiert habe, will ich mit einem Tastendruck den Bot starten und ihn auch wieder unterbrechen....

(Es ist kein Cheatprogramm, falls das jetzt jemand denkt  )


----------



## thE_29 (29. Jun 2004)

Die Frage ist ob er den Tastendruck überhaupt bekommt da es ja nicht das aktive Programm ist!

In C wars leicht, weil da immer alles an die MESSAGE_MAP geschickt worden ist, wie das in Java ist, weiß ich nicht!

Musst du glaub ich das hier ausprobieren



```
public class DeinNichtCheatProgramm 
    implements AWTEventListener
{
  public DeinNichtCheatProgramm()
  {
//BLABALA
    long eventMask = AWTEvent.KEY_EVENT_MASK;
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    toolkit.addAWTEventListener(this, eventMask);
//BLABLABLA
  }
//BLABLABLA CODE!

 /**************************************************************************
   * Listener für die Abfrage auf Tastendrücke
   * @param event Event
   *************************************************************************/
  public void eventDispatched(AWTEvent event)
  {
    //holt sich die Event ID
    int ID = event.getID();
    //wenn überhaupt eine Taste gedrückt wird
    if (ID == KeyEvent.KEY_PRESSED)
    {
      //wenn die Taste F5 ist
      if (event.paramString().indexOf("F5") != -1)
      {
        //Windows Funktion
        if (strOSystem.compareTo("WINDOWS") == 0)
        {
          WindowsStartServices();
        }
        //Linuxfunktionen
        else
        {
          LinuxStartServices();
        }
      }
    }
   }
}
```

Musst schaun, aber so reagiert das Programm mal auf alle Tastenereignisse, auch wenn der Focus im Programm auf irgedwas anderem liegt![/code]


----------



## Donut (29. Jun 2004)

jo danke schoma ...
aber der Tastendruck bewirkt nichts, wenn der focus nicht auf dem Programmfenster ist....  :cry:


----------



## thE_29 (29. Jun 2004)

Wie schon gesagt 


Du könntest einen C Code in dein Java einbauen (geht glaub ich mt JNI oder sowas) und mit dem C Code kannst du auf alles abfragen, so müsste es funktionieren!

Weil mit C kannst du sowieso alles abfragen was im OS läuft


----------



## Donut (29. Jun 2004)

oh gott ... :shock: 
gibts irgendwo n tut dafür?  ???:L


----------



## Isaac (30. Jun 2004)

Dann kannst du das ganze Programm gleich in C++ schreiben weil dann die Plattformunabhängigkeit flöten gegangen ist. 

Aber ja, es gibt fürs JNI Tutorials

http://java.sun.com/docs/books/tutorial/native1.1/


----------



## thE_29 (30. Jun 2004)

die Frage ist ob er das Programm wegen Plattformunabhängigkeit in java schreibt, oder weil er einfach nur so in java schreibt 

Weil ich kaum glaube das er das mit dem Spiel (auch wenns kein trainer oder cheater ist) in Linux auch spielt 

Aber das ganze Prog in C schreiben wäre natürlich leichter


----------



## Donut (30. Jun 2004)

hmm nur kann ich leider kein C
Ich hab das programm in java geschrieben, weil das das einzige ist, was ich an Programmiersprachen kann....


----------



## Silkstring (26. Dez 2004)

Hallo erstmal,

ich wollte nur schreiben das der code von thE_29 genau das ist was ich für ein Programm von mir gesucht habe.
da ich allerdings noch nicht besonders viel erfahrung mit java habe ist mir der Ablauf etwas unklar.

nun ich verstehe zum beispiel nicht wann die Methode "eventDispatched(AWTEvent event)" aufgerufen wird, bei jedem Tastendruck? Wie müsste ich die Methode aufrufen?

Desweiteren ist mir völlig unklar wozu

```
Toolkit toolkit = Toolkit.getDefaultToolkit(); 
toolkit.addAWTEventListener(this, eventMask);
```
da ist.

Ähm ja.. eigentlich ist mir alles bis Zeile 12 größtenteils unklar 

Wenn jemand einwenig Zeit hätte, ich würde mich sehr über eine Erklärung freuen.. ich möchte Java wirklich lernen also möchte ich in mein Programm nichts einbinden was ich nicht zu 100% verstehe. 

mit freundlichem Gruß,
Anton M.


----------



## Illuvatar (27. Dez 2004)

Silkstring hat gesagt.:
			
		

> Wenn jemand einwenig Zeit hätte, ich würde mich sehr über eine Erklärung freuen.. ich möchte Java wirklich lernen also möchte ich in mein Programm nichts einbinden was ich nicht zu 100% verstehe.



Gute Einstellung :toll: 

Mit Toolkit#addAWTEventListener kannst du einen Listener hinzufügen, dessen Methode eventDispatched immer aufgerufen wird, wenn ein Java ein Event mitkriegt, das in der eventMask eingestellt wurde, in deinem Fall ruft das Toolkit also bei jedem KEY_EVENT deine Methode eventDispatched auf.


----------



## Silkstring (27. Dez 2004)

danke sehr!

ahja und könnte man so einen listener auch einfach in ein applet einbauen? oder braucht dies je nach system wieder besondere erweiterungen?


----------



## Silkstring (10. Jan 2005)

was mir noch so unklar ist; angenommen ich habe eine main methode von der aus mein programm aufgerufen wird - wie sollte ich von der main methode auf die methode eventDispatched(AWTEvent event) kommen? ich meine ich muss mein programm ja mit einer main-methode ausstatten damit es beginnt - aber wie bringe ich diese main-methode dazu nicht einfach durchzulaufen sondern an einer bestimmten stelle, nämlich da wo nach der taste abgefragt werden soll, anzuhalten und eben zu warten?
ich habe es auch schon mit einer endlosschleife probiert, aber da ist er beim debuggen garnicht erst in die eventDispatched methode reingelaufen nachdem ich überhaupt eine taste gedrückt habe  ???:L 
ich hab das gefühl das ich mich wirklich blöd anstell im moment aber ich habe leider garkeine vorstellung wie der code verarbeitet wird :|

mit freundlichem gruß


----------



## KSG9|sebastian (10. Jan 2005)

also, bei ner endlos-schleife reagiert dein programm nicht, da es in einer , wie der name schon sage, endlosen schleife hängt und wärend der  zeit geht nichts, höchstens du benutzt einen Thread.

Wenn du nur ne Main Methode hast, dann stimmt deine aussage, das programm läuft 1x durch und wird beendet. Wenn du aber ein Frame erzeugst, dann läuft dein Programm solange bis das Frame geschlossen wird.
Und wenn du irgendwo auf das Formular klickst reagiert der eventDispatcher, vorrausgesetzt das Fenster ist aktiv / im Vordergrund.


----------



## Silkstring (10. Jan 2005)

ah.. ähm danke für deine schnelle antwort; bei meinem programm handelt es sich um ein applet und das fenster soll von vornherein aktiv sein - brauche ich da auch einen thread?
warum ich gerade auf main-methode gekommen bin, ich hab daheim zurzeit kein internet und habe nur die möglichkeit von der arbeit aus das forum zu besuchen, da habe ich leider den quellcode meines applets nicht und musste eben mit einer improvisation rumprobieren 

(achja übrigens wer sich das mal angucken mag einfach mal melden, es könnte für gitarrenspieler recht nützlich sein, ich weiß nur gerade nicht ob ich links hier rein posten darf)

mit freundlichem gruß


----------



## Silkstring (11. Jan 2005)

so ein mist ich habs mal eingefügt und scheinbar verträgt sich der awteventlistener nicht mit applets; ich kriege eine exception zwecks security und access denied


----------

