2017-09-17 2 views
1

Je voudrais taper: "/ ammo" quand je tape ALT + A. Le programme s'exécute mais il semble que vous vous arrêtez immédiatement après l'exécution: J'appuie sur alt + A ou A et le code ne fait rien du tout.Java jnativehook taper une chaîne ne fonctionne pas

package jnativehook01; 

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 org.jnativehook.GlobalScreen; 
import org.jnativehook.NativeHookException; 
import org.jnativehook.keyboard.NativeKeyEvent; 
import org.jnativehook.keyboard.NativeKeyListener; 

public class Example implements NativeKeyListener { 
    public void nativeKeyPressed(NativeKeyEvent e) { 

     if (NativeKeyEvent.getKeyText(e.getKeyCode()).equals("A")) { 
      try { 
       GlobalScreen.unregisterNativeHook(); 

       Robot bot; 
       try { 
        bot = new Robot(); 

        String text = "/ammo"; 
        StringSelection stringSelection = new StringSelection(text); 
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
        clipboard.setContents(stringSelection, stringSelection); 

        //type: /ammo 
        bot.keyPress(KeyEvent.VK_T); 
        bot.keyRelease(KeyEvent.VK_T); 


       } catch (AWTException e1) { 

       } 




      } catch (NativeHookException e1) { 
      } 
     } 
    } 

    public void nativeKeyReleased(NativeKeyEvent e) { 
     System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode())); 
    } 

    public void nativeKeyTyped(NativeKeyEvent e) { 
     System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode())); 
    } 

    public static void main(String[] args) { 

     new Example(); 
    } 
} 

Répondre

1

Ok, maintenant il fonctionne:

package jnativehook01; 

import org.jnativehook.GlobalScreen; 
import org.jnativehook.NativeHookException; 
import org.jnativehook.keyboard.NativeKeyEvent; 
import org.jnativehook.keyboard.NativeKeyListener; 
import java.util.logging.*; 
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.awt.event.InputEvent; 

public class Example implements NativeKeyListener { 
    public void nativeKeyPressed(NativeKeyEvent e) { 
     if (NativeKeyEvent.getKeyText(e.getKeyCode()).equals("A")) { 
      Robot bot; 
      try { 
       String text = "/ammo"; 
       StringSelection stringSelection = new StringSelection(text); 
       Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
       clipboard.setContents(stringSelection, stringSelection); 

       bot = new Robot(); 

       for (int i = 0; i < 10; i++) { 
        //t 
        bot.keyPress(KeyEvent.VK_T); 
        bot.delay(100); 
        bot.keyRelease(KeyEvent.VK_T); 

        bot.delay(500); 

        bot.keyPress(KeyEvent.VK_CONTROL); 
        bot.keyPress(KeyEvent.VK_V); 
        bot.keyRelease(KeyEvent.VK_V); 
        bot.keyRelease(KeyEvent.VK_CONTROL); 

        bot.delay(500); 

        //Enter 

        bot.keyPress(KeyEvent.VK_ENTER); 
        bot.keyRelease(KeyEvent.VK_ENTER); 

        bot.delay(1000); 

        bot.keyPress(KeyEvent.VK_ENTER); 
        bot.keyRelease(KeyEvent.VK_ENTER); 

        bot.delay(400); 
       } 

      } catch (AWTException e1) { 
      } 

     } 
    } 

    public void nativeKeyReleased(NativeKeyEvent e) { 

    } 

    public void nativeKeyTyped(NativeKeyEvent e) { 

    } 

    public static void main(String[] args) { 
     Example ex = new Example(); 
     try { 
      GlobalScreen.registerNativeHook(); 
      Logger logger = Logger.getLogger(GlobalScreen.class.getPackage().getName()); 
      logger.setLevel(Level.OFF); 
     } catch (NativeHookException eb) { 
      System.out.println(eb.getMessage()); 

     } 
     GlobalScreen.addNativeKeyListener(ex); 
    } 

} 
1

Il y a encore quelques problèmes avec votre code.

if (NativeKeyEvent.getKeyText(e.getKeyCode()).equals("A")) { Ce n'est pas la manière correcte de vérifier la clé A. Cela vérifiera si AWT produit l'ascii 'A' pour cette clé. Ces valeurs pourraient être remplacées par la JVM lors de l'exécution. Vous devriez vérifier la constante NativeKeyEvent.VK_A. Vous ne parvenez pas à vérifier l'indicateur ALT sur cet événement clé. Quelque chose comme ce qui suit est plus de ce que vous cherchez.

if (e.getKeyCode() == NativeKeyEvent.VC_A && e.getModifiers() & NativeInputEvent.ALT_MASK) {

Une note sur la sécurité de fil. Vous comptez sur AWT à l'intérieur du rappel de clé, cependant, cette bibliothèque n'utilise pas AWT pour répartir les événements par défaut. Vous devez jeter un coup d'oeil à la section Thread Safety du wiki pour des exemples de Thread Safe.

Vous pouvez choisir de remplacer la classe Robots par GlobalScreen.postNativeEvent(...) pour plus de commodité, pour omettre Swing/AWT, mais ce n'est pas obligatoire.

Une remarque sur le blocage à l'intérieur du rappel de l'écouteur d'événement. Si vous bloquez à l'intérieur de cette fonction, via la mise en veille ou un autre processus long, vous risquez de retarder la livraison des événements clés par le système d'exploitation ou, pire, la suppression de la bibliothèque par certains systèmes d'exploitation. Cette suppression est hors du contrôle de la bibliothèque et contrôlée par le système d'exploitation.