Java jnativehook键入字符串无效

Java jnativehook键入字符串无效,java,eclipse,robot,jnativehook,Java,Eclipse,Robot,Jnativehook,我想在键入ALT+A时键入“/ammo”。 程序运行,但似乎在运行后立即停止: 我按下alt+A或A,代码什么也不做 package jnativehook01; import java.awt.AWTException; import java.awt.Robot; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; imp

我想在键入ALT+A时键入“/ammo”。 程序运行,但似乎在运行后立即停止: 我按下alt+A或A,代码什么也不做

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();
    }
}
好了,现在它开始工作了:

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

}
包装jnativehook01;
导入org.jnativehook.GlobalScreen;
导入org.jnativehook.NativeHookException;
导入org.jnativehook.keyboard.NativeKeyEvent;
导入org.jnativehook.keyboard.NativeKeyListener;
导入java.util.logging.*;
导入java.awt.AWTException;
导入java.awt.Robot;
导入java.awt.Toolkit;
导入java.awt.datatransfer.Clipboard;
导入java.awt.datatransfer.StringSelection;
导入java.awt.event.KeyEvent;
导入java.awt.event.InputEvent;
公共类示例实现了NativeKeyListener{
公共无效nativeKeyPressed(NativeKeyEvent e){
if(NativeKeyEvent.getKeyText(e.getKeyCode()).equals(“A”)){
机器人机器人;
试一试{
字符串text=“/ammo”;
StringSelection StringSelection=新StringSelection(文本);
剪贴板剪贴板=Toolkit.getDefaultToolkit().getSystemClipboard();
剪贴板.设置内容(stringSelection,stringSelection);
bot=新机器人();
对于(int i=0;i<10;i++){
//t
bot.keyPress(KeyEvent.VK_T);
延迟(100);
bot.keyrease(KeyEvent.VK_T);
误期(500);
bot.keyPress(KeyEvent.VK_控件);
bot.keyPress(KeyEvent.VK_V);
bot.keyrease(KeyEvent.VK_V);
bot.keyrease(KeyEvent.VK_控制);
误期(500);
//进入
bot.keyPress(KeyEvent.VK_ENTER);
bot.keyerelease(KeyEvent.VK_ENTER);
误期(1000);
bot.keyPress(KeyEvent.VK_ENTER);
bot.keyerelease(KeyEvent.VK_ENTER);
延迟(400);
}
}捕获(AWTEXE1){
}
}
}
公共无效nativeKeyReleased(NativeKeyEvent e){
}
公共无效nativeKeyTyped(NativeKeyEvent e){
}
公共静态void main(字符串[]args){
Example ex=新示例();
试一试{
GlobalScreen.registerNativeHook();
Logger Logger=Logger.getLogger(GlobalScreen.class.getPackage().getName());
记录器设置电平(电平关闭);
}捕获(本地钩子异常eb){
System.out.println(eb.getMessage());
}
GlobalScreen.addNativeKeyListener(ex);
}
}

您的代码仍然存在一些问题

if(NativeKeyEvent.getKeyText(e.getKeyCode()).equals(“A”){
这不是检查A键的正确方法。这将检查AWT是否为该键生成ascii“A”。这些值可能会在运行时被JVM覆盖。您应该检查NativeKeyEvent.VK_A常量。您还无法检查该键事件上的ALT标志。类似于以下内容的内容是您所了解的更多内容为王

if(e.getKeyCode()==NativeKeyEvent.VC\u A和&e.getModifiers()&NativeInputEvent.ALT\u掩码){

关于线程安全的注意事项。您依赖于键回调内部的AWT,但是,默认情况下,此库不使用AWT来分派事件。您需要查看wiki部分中的线程安全示例

为了方便起见,您可以选择将
Robots
类替换为
GlobalScreen.postNativeEvent(…)
,以省略Swing/AWT,但这不是必需的

关于阻止事件侦听器回调内部的注意事项。如果通过睡眠或其他长时间运行的进程阻止此函数内部,可能会导致操作系统延迟密钥事件传递,或者更糟的是,某些操作系统会删除库。此删除不受库的控制,由操作系统控制