Java Keybinder

Status
Für weitere Antworten geschlossen.

GermanGhettos

Lt. Commander
Registriert
Apr. 2011
Beiträge
1.243
Hallo,

ich möchte mir einen kleinen Keybinder in Java programmieren.
Man könnte meinen, dass das recht fix und einfach ist,
aber irgendwie bin ich da etwas mit den Java Methoden verwirrt.

Ich möchte, dass das Programm den Text, den ich z.B. in eines der Textfelder eingebe
durch Tastendruck ausgegeben wird.
Ich bin z.B. im Spiel, drücke Num0 und das Programm soll dann die Taste "T" drücken, den Text mit "Strg+v" einfügen und mit Enter bestätigen.
Eigentlich keine große Sache, aber ich bin leicht verwirrt, wie ich das nun bei Java umsetze.
Habe schon gegoogelt, finde aber immer nur Codeschnipsel, mit denne ich nicht viel anfangen kann.

Kann da jemand viell. ein Beispiel zeigen? :D

Momentan sieht mein Code so aus (ist noch nichts implementiert):
Code:
public class KB extends JFrame {
  // Anfang Attribute
  // Ende Attribute
  
  public KB(String title) { 
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 600; 
    int frameHeight = 500;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Container cp = getContentPane();
    cp.setLayout(null);
    
    // Anfang Komponenten
    JTextField Feld1 = new JTextField("");
    JTextField Feld2 = new JTextField("");
    JTextField Feld3 = new JTextField("");
    JTextField Feld4 = new JTextField("");
    JTextField Feld5 = new JTextField("");
    JButton Start = new JButton(); 
    JButton Stop = new JButton(); 
   
    
    
    // Ende Komponenten
    setVisible(true);
    
    Feld1.setVisible(true);
    Feld1.setBounds(25,50,550,20);
    cp.add(Feld1);
    Feld2.setVisible(true);
    Feld2.setBounds(25,75,550,20);
    cp.add(Feld2);
    Feld3.setVisible(true);
    Feld3.setBounds(25,100,550,20);
    cp.add(Feld3);
    Feld4.setVisible(true);
    Feld4.setBounds(25,125,550,20);
    cp.add(Feld4);
    Feld5.setVisible(true);
    Feld5.setBounds(25,150,550,20);
    cp.add(Feld5);
    
    Start.setVisible(true);
    Start.setBounds(25,20,75,20);
    Start.setText("Start");
    cp.add(Start);
    
    Stop.setVisible(true);
    Stop.setBounds(500,20,75,20);
    Stop.setText("Stop");
    cp.add(Stop);
    
    
  } // end of public KB
  
  // Anfang Methoden
  

  // Ende Methoden
  
  public static void main(String[] args) {
    new KB("KB");

    
  } // end of main
  
} // end of class KB
 
Zuletzt bearbeitet:
Es geht um SA:MP.
Dort gibt es viele Befehle, die man per Keybinder leichter nutzen kann, damit man sie nicht immer mühseelig eintippen muss ^^
Sowas wie /engine um den Motor eines Autos zu starten.
 
Ich möchte keine fremden Keybinder nutzen, weil die oftmals Viren enthalten.
Gab leider schon genügend Fälle, wo Passwörter ausgelesen wurden.

Es muss ja eine Möglichkeit geben sowas selbst auch unter Java zu programmieren.
Mir hat mal jemand einen kleinen Keybinder geschrieben, der genau das macht.
Allerdings ist der unpraktisch, da er auf die normalen Zahlen gelegt ist und nicht auf Num und der wurde glaube ich in VisualBasic geschrieben.
Dann muss das doch auch in Java gehen?

Vielleicht findet sich ja noch jemand, der sich damit auskennt.
 
Schreib dir was mit AutoHotKey. Das übernimmt das senden der Befehle, du musst nur noch scripten was du brauchst.
 
Hab schon gesehen.
Schade eigentlich. Dachte mit Java geht das auch.
Dann hätte ich mir einen schönen Keybinder schreiben können ^^
Hätte nicht gedacht, dass das so umständlich ist.
 
Es soll ja auch umständlich sein. Sonst würden die ganzen Kiddys alle Bots benutzen.

Keine Ahnung wie es bei deinem da ist (was ist SA:MP?), aber es gibt Spiele, die direkt die Hardware abfragen. Da hilft es auch nicht mehr im Treiber einzustellen, dass die Maus 10x klicken soll etc. Da müsste man dann schon Maus und Tastatur simulieren.

In vielen AGB's steht auch explizit drin, dass man solche Programme nicht nutzen darf. Das solltest du überprüfen, bevor du da gebannt wirst.

Ich weiß auch gar nicht in wie weit es erlaubt ist hier bei einem solchen Programm zu helfen.
Über Google findest du da allerdings so einiges, einfach nach „dx input“ suchen.
 
Ehm, ich bin auf dem Server Supporter und ich bin definitiv kein Kiddy, sondern berufstätig :D
Es geht hier nicht um Bots, Vorteile o.ä.
SA:MP ist GTA San Andreas Online und dort ist es etwas ganz normales, dass man Keybinder benutzt,
da es dort so viele Befehle zum eintippen gibt.
Das ist auch nicht verboten.

Autohotkey ist ja eine Methode, aber unschön.
Über VisualBasic hat mir bereits jemand einen kleinen Keybinder geschrieben.
Der ist aber wie gesagt recht spartanisch.
Aber auch dort kann man in Textfelder was eintippen und im Spiel dann den Text per Tastendruck ausgeben lassen. :)

Daher dachte ich mir, dass es auch mit Java machbar ist, wenn es mit VisualBasic geht.
Momentan scheint es mir aber so, dass von den hier Anwesenden keiner so richtig Ahnung von Keybindern i.V.m. Spielen hat.
Belehrungen brauche ich nicht. Ich suche nur jemanden, der sich damit auskennt und mir auch weiterhelfen kann.
So richtig geholfen wurde mir hier bisher nicht, schade.

Falls also jemand Ahnung hat, wäre ich für Hilfe dankbar, ansonsten belassen wir es dabei und ich schaue mich anderweitig um. :freaky:

Gruß
G.G.
 
GermanGhettos schrieb:
Momentan scheint es mir aber so, dass von den hier Anwesenden keiner so richtig Ahnung von Keybindern i.V.m. Spielen hat.
Ich habe schon Bots und Trainer für mehrere Spiele geschrieben, würde also schon sagen, dass ich Ahnung habe.
Wenn du zahlen kannst bastel ich dir deinen Keybinder, allerdings mit C++.

GermanGhettos schrieb:
Belehrungen brauche ich nicht. Ich suche nur jemanden, der sich damit auskennt und mir auch weiterhelfen kann.
So richtig geholfen wurde mir hier bisher nicht, schade.
Ich habe dir doch schon einen Tipp gegeben nach was du suchen kannst.
Oder willst du hier einfach nur eine fertige Lösung vorgesetzt bekommen?

Ich habe mit Java relativ wenig am Hut und weiß nicht es dort dafür eine Funktion an Board gibt, bezweifel es aber.
Schau dich halt mal nach Libs um die das evtl. können oder beschäftige dich etwas mit der Meterie und bastel selbst eine.

Du könntest deinen Freund da ja auch fragen ob er es dir anpasst bzw. den Code zur Verfügung stellt. Visual Basic ist schnell gelernt wenn du schon Java beherscht.

TheInterceptor schrieb:
Naja DirectInput hat man nicht erfunden um Bots umständlicher zu machen.
Stimmt schon. Trotzdem versuchen viele MP Games solche Dinge zu verhindern.
 
Das Problem ist.
Scheinbar kennst du dich mit Java nicht aus.
Der Thread füllt sich also immer weiter mit Vermutungen, die eigentlich nicht hier hingehören :D
Entweder du weißt, dass es mit Java nicht geht, oder du weißt es nicht.
So werden Threads ohne echte Hilfe zerbombt, weil jeder mal seinen Senf dazugeben wollte, aber helfen konnte am Ende keiner weil
Ich habe mit Java relativ wenig am Hut und weiß nicht es dort dafür eine Funktion an Board gibt, bezweifel es aber.

Ist wirklich nicht böse gemeint, aber es geht um Java, weil ich Java einigermaßen beherrsche und nur auf diesem Gebiet nicht fit bin.
Wenn jemand, der sich mit Java auskennt, definitiv weiß, dass das damit nicht machbar ist und ich dafür
C++ oder VisualBasic nutzen müsste (wobei ich nicht wüsste, warum es mit VB gehen soll und mit Java nicht),
dann wäre es eine hilfreiche Aussage.
Ich brauche natürlich keinen fertigen Code, aber ein Beispielcode, wie ich das realisieren könnte, wäre schön gewesen.

Da sich das ganze offenbar schwierig gestaltet, werde ich dann wohl auf Autohotkey ausweichen
und mich ein anderes mal selbst noch mal damit beschäftigen, falls keiner mehr die bahnbrechende Lösung hat :)


Trotzdem danke.


Gruß
G.G.
 
Ich glaube ich kenne mich mit Java wesentlich besser aus als du.

Ich habe es innerhalb von 3 Minuten geschafft nach einer Möglichkeit zu suchen, diese umzusetzen und auch zu testen (ja, in Java).
Nur weiß ich nicht ob es auch bei deinem GTA funktioniert. Hat bei mir jedenfalls bei allen getesteten Spielen (alle DX11 glaube ich) funktioniert.
 
In "reinem" Java ist es nicht möglich globale Tastaturereignisse abzufangen. Mit einer nativen Erweiterung, die das Win32 API verwendet kann man das mit etwas Aufwand aber auch in Java erreichen.

Hier ein Beispiel mit der JNA library: https://github.com/java-native-acce...keyhook/com/sun/jna/contrib/demo/KeyHook.java
Library download: jna-4.2.2.jar jna-platform-4.2.2.jar

Hier sind noch Stichworte für das Suchen nach weiterer Lösungen/Beispielen: java windows global keyboard hook

Das Erzeugen von Tastatureingaben sollte dann mit "new java.awt.Robot().keypress/keyrelease(KeyEvent)" funktionieren.
 
Zuletzt bearbeitet:
S.Kara schrieb:
Ich glaube ich kenne mich mit Java wesentlich besser aus als du.

Ich habe es innerhalb von 3 Minuten geschafft nach einer Möglichkeit zu suchen, diese umzusetzen und auch zu testen (ja, in Java).
Nur weiß ich nicht ob es auch bei deinem GTA funktioniert. Hat bei mir jedenfalls bei allen getesteten Spielen (alle DX11 glaube ich) funktioniert.

Ich programmiere jetzt seit ca. 2 Jahren mit Java.
Kann also nicht sagen, wie das im Vergleich bei dir aussieht und wollte mich hier auch nicht "Messen" :p
Ich weiß nur, dass du mir oben nicht konkret weitergeholfen hast und folgendes geschrieben hast.
Ich habe mit Java relativ wenig am Hut und weiß nicht es dort dafür eine Funktion an Board gibt, bezweifel es aber.
Jetzt sagst du aber, dass du dich mit Java "wesentlich" besser auskennst.
Das soll ja kein Angriff sein, aber wenn du selbst sagst, dass du mit Java nichts am Hut hast, kannst du ja nicht erwarten,
dass ich dann glaube, dass du es kannst :D
Wenn du sagst, dass du damit nichts am Hut hast, glaube ich das natürlich erstmal.

Was hast du denn für eine Möglichkeit gefunden?
Vielleicht ist es ja wirklich hilfreich, dann wäre ich natürlich auch dankbar dafür. :)


Nolag schrieb:
In "reinem" Java ist es nicht möglich globale Tastaturereignisse abzufangen. Mit einer nativen Erweiterung, die das Win32 API verwendet kann man das mit etwas Aufwand aber auch in Java erreichen.

Hier ein Beispiel mit der JNA library: https://github.com/java-native-acces...o/KeyHook.java
Library download: jna-4.2.2.jar jna-platform-4.2.2.jar

Hier sind noch Stichworte für das Suchen nach weiterer Lösungen/Beispielen: java windows global keyboard hook

Das Erzeugen von Tastatureingaben sollte dann mit "new java.awt.Robot().keypress/keyrelease(KeyEvent)" funktionieren.

Danke für die Info, also muss man doch den Weg drum herum gehen :D
Ich schaue mir das mal an.
Sieht auf den ersten Blick allerdings doch recht komplex aus. :evillol:
 
Mein "relativ wenig am Hut" sollte nicht heißen dass ich mich damit nicht auskenne, sondern eher mit anderen Sprachen unterwegs bin. :)
Das liegt auch daran, dass ich Java nicht sonderlich mag. Programmiere (leider :D) trotzdem schon seit Jahren immer wieder in Java.

Das was Nolag geschrieben hatte war auch meine Lösung:
Code:
Robot r = new Robot();

for (;;) {
	r.keyPress(KeyEvent.VK_ESCAPE);
	Thread.sleep(50);
	r.keyRelease(KeyEvent.VK_ESCAPE);
	Thread.sleep(2000);
}
Das hatte bei mir in jedem Spiel funktioniert gehabt.
 
Das mit dem "Robot" sieht schon interessanter aus.
Irgendwie mag mich Java aber nicht :D

Immer wenn ich "public Robot robo = new Robot();" einsetze, erhalte ich:
"KB.java:36:5: error: illegal start of expression"

Hab ich was übersehen?

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.awt.Robot;


public class KB extends JFrame {
  // Anfang Attribute
  // Ende Attribute
  
  public KB(String title) { 
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 600; 
    int frameHeight = 500;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Container cp = getContentPane();
    cp.setLayout(null);
    
    // Anfang Komponenten
    JTextField Feld1 = new JTextField("");
    JTextField Feld2 = new JTextField("");
    JTextField Feld3 = new JTextField("");
    JTextField Feld4 = new JTextField("");
    JTextField Feld5 = new JTextField("");
    JButton Start = new JButton(); 
    JButton Stop = new JButton(); 
    public Robot robo = new Robot();
    
    
    
    // Ende Komponenten
    setVisible(true);
    
    Feld1.setVisible(true);
    Feld1.setBounds(25,50,550,20);
    cp.add(Feld1);
    Feld2.setVisible(true);
    Feld2.setBounds(25,75,550,20);
    cp.add(Feld2);
    Feld3.setVisible(true);
    Feld3.setBounds(25,100,550,20);
    cp.add(Feld3);
    Feld4.setVisible(true);
    Feld4.setBounds(25,125,550,20);
    cp.add(Feld4);
    Feld5.setVisible(true);
    Feld5.setBounds(25,150,550,20);
    cp.add(Feld5);
    
    Start.setVisible(true);
    Start.setBounds(25,20,75,20);
    Start.setText("Start");
    cp.add(Start);
    
    Stop.setVisible(true);
    Stop.setBounds(500,20,75,20);
    Stop.setText("Stop");
    cp.add(Stop);
    
    
  } // end of public KB
  
  // Anfang Methoden
  
  
  // Ende Methoden
  
  public static void main(String[] args) {
    new KB("KB");
    if (robo.keyPress(KeyEvent.VK_F2)) {
      System.out.print("hi");
    }
    
  } // end of main
  
} // end of class KB
 
Zeile 36 ändern in
Code:
public Robot robo;

Dann in der Main:
Code:
robo = new Robot();

Das müsste dann funktionieren.

Edit:
Sehe gerade, dass das in einer extra Klasse steht. Ich spare mir jetzt mal das "warum". ^^
Füge einen Konstruktor hinzu.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben