2017-09-17 28 views
1

「ALT + A」と入力すると「/ ammo」と入力したいと思います。 プログラムは実行されますが、実行直後に停止するようです: alt + AまたはAを押してコードが何もしません。Java jnativehook文字列が入力されていない

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(); 
    } 
} 

答えて

1

[OK]を、今では働いています:

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

はまだあなたのコードにいくつかの問題があります。

if (NativeKeyEvent.getKeyText(e.getKeyCode()).equals("A")) { これは、Aキーを確認する正しい方法ではありません。これにより、AWTがそのキーのascii 'A'を生成するかどうかを確認します。これらの値は、実行時にJVMによってオーバーライドできます。 NativeKeyEvent.VK_A定数をチェックする必要があります。また、そのキーイベントのALTフラグをチェックすることもできません。以下のようなものがあなたが探しているものの多くです。

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

スレッドの安全性に関する注意事項。キー・コールバックの内部でAWTを使用していますが、このライブラリはデフォルトでAWTを使用してイベントを送出しません。スレッドセーフの例については、wikiのThread Safetyセクションを参照する必要があります。

便宜上、クラスをGlobalScreen.postNativeEvent(...)に置き換えて、Swing/AWTを省略することもできますが、必須ではありません。

イベントリスナーコールバックの内部のブロックに関する注意。この機能の内部をスリープまたはその他の長時間実行中のプロセスでブロックすると、OSによるキーイベント配信の遅延や、オペレーティングシステムによってはライブラリの削除が遅れることがあります。この削除は、ライブラリの制御の外にあり、OSによって制御されます。

関連する問題