Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Awt机器人按键延迟_Java_Awtrobot_Jintellitype - Fatal编程技术网

Java Awt机器人按键延迟

Java Awt机器人按键延迟,java,awtrobot,jintellitype,Java,Awtrobot,Jintellitype,我为一个游戏开发了一个小工具,比如热键,它处理用户按键事件的组合,并用Awt机器人模拟两次按键。问题是,被调用的方法ghostwark()只在第一次按下注册组合时按预期工作,第二次按下相同组合时,调用相同方法时,只模拟“robot.delay”之后的最后一个键。请阅读更多代码注释 import com.melloware.jintellitype.HotkeyListener; import com.melloware.jintellitype.JIntellitype; import java

我为一个游戏开发了一个小工具,比如热键,它处理用户按键事件的组合,并用Awt机器人模拟两次按键。问题是,被调用的方法ghostwark()只在第一次按下注册组合时按预期工作,第二次按下相同组合时,调用相同方法时,只模拟“robot.delay”之后的最后一个键。请阅读更多代码注释

import com.melloware.jintellitype.HotkeyListener;
import com.melloware.jintellitype.JIntellitype;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;

public class L {
int i = 160;

public static void main(String args[]){
    L l = new L();
    l.k();
}
public void k(){
    // Register keys combination
    JIntellitype.getInstance();
    JIntellitype.getInstance().registerHotKey(1, JIntellitype.MOD_ALT, (int)'D');
    JIntellitype.getInstance().registerHotKey(2, JIntellitype.MOD_ALT, (int)'J');
    JIntellitype.getInstance().registerHotKey(3, JIntellitype.MOD_ALT, (int)'K');
    JIntellitype.getInstance().addHotKeyListener(new HotkeyListener() {
        public void onHotKey(int aIdentifier) {
            // First indentifier Alt + D
            if (aIdentifier == 1) {
                System.out.println("Alt+D hotkey pressed");
                // Start new thread
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        L gh = new L();
                        gh.ghostWalk();
                    }
                }).start();
            }
            // Second indetifier
            else if(aIdentifier == 2){
                i += 10;
                System.out.println(i);
            }
            // Third
            else if(aIdentifier == 3){
                i -= 10;
                System.out.println(i);
            }
        }
    });
}
// Method called to simulate key press
/* So, first time when i press Alt + D in game after program runs
all work good, the keys are simulated  as expected but if I press again and again
the combination only key "d" are simulated which is after "delay(i), i = 160"
If program is restarted all again is the same, only first time when i press registered
combinations the program work as expected.
Second and others times program work only if there is delay "robot = new Robot();
                                                             robot.delay(100);"
 on 100 delay program work well on 40ms need to press very fast the combination
 so the program work as expected. How to fix it ? to simulate key press without
 delay like first time when program is run.
 P.s no matter in which window(game, notepad) you press combination to simulate key press
 still work good only first time.
Example of output when i press two times combinations in game
first time: qqwewwd
second time: d
 */
public void ghostWalk(){
    Robot robot = null;
    try {
        robot = new Robot();
        //robot.delay(100);
        robot.keyPress(KeyEvent.VK_Q);
        robot.keyRelease(KeyEvent.VK_Q);
        robot.keyPress(KeyEvent.VK_Q);
        robot.keyRelease(KeyEvent.VK_Q);
        robot.keyPress(KeyEvent.VK_W);
        robot.keyRelease(KeyEvent.VK_W);
        robot.keyPress(KeyEvent.VK_R);
        robot.keyRelease(KeyEvent.VK_R);
        robot.keyPress(KeyEvent.VK_W);
        robot.keyRelease(KeyEvent.VK_W);
        robot.keyPress(KeyEvent.VK_W);
        robot.keyRelease(KeyEvent.VK_W);
        robot.delay(i);
        robot.keyPress(KeyEvent.VK_D);
        robot.keyRelease(KeyEvent.VK_D);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

}
编辑:我无法理解在第一次调用ghostWalk方法后所做的更改,我应该使用延迟,以便我的程序按预期工作

Edit2:在我的情况下,当
setAutoWaitForIdle
设置为true时,代码开始工作,如果介于 按键是一个延迟,就像我的例子中的延迟(i),i=160,那么启动延迟应该是60~。(如果启动延迟为40,则不总是工作良好,需要非常快地按注册键组合idk为什么,如果启动延迟小于40-60,则在我的情况下,仅模拟延迟(i)之后的最后一次按键“D”。)

如果要在第一次注册热键事件时删除robot.setAutoWaitForIdle(true)和
robot.delay(60)
,则工具将按预期工作,第二次、第三次等-不。在第一个JIntellitype事件之后,仅此代码有效

public void ghostWalk(){
    Robot robot = null;
    try {
        robot = new Robot();
        robot.setAutoWaitForIdle(true);
        robot.delay(60);
        robot.keyPress(KeyEvent.VK_Q);
        robot.keyRelease(KeyEvent.VK_Q);
        robot.keyPress(KeyEvent.VK_Q);
        robot.keyRelease(KeyEvent.VK_Q);
        robot.keyPress(KeyEvent.VK_W);
        robot.keyRelease(KeyEvent.VK_W);
        robot.keyPress(KeyEvent.VK_R);
        robot.keyRelease(KeyEvent.VK_R);;
        robot.delay(i);
        robot.keyPress(KeyEvent.VK_D);
        robot.keyRelease(KeyEvent.VK_D);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

你应该考虑使用自动延迟设置。

如果及时发布输入事件,您的操作系统很可能在处理输入事件时遇到问题。尝试50毫秒或25毫秒延迟,看看会发生什么

另一件你可以尝试的事情是在每次按键前添加


编辑:对于体育运动,我尝试了以下代码片段,但效果相对较好。我测试了在(
ctrl-Q
)中按热键,它会一直打印出
tt
。但是我必须快速释放热键,否则记事本++开始将热键解释为其他内容(
ctrl-Q
已经是记事本++中其他内容的快捷方式)

使用机器人不是一门精确的科学。我不得不将机器人延迟150毫秒,然后在让机器人按键之前等待空闲时间。否则事情就搞砸了。没有必要设置自动延迟

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import com.melloware.jintellitype.HotkeyListener;
import com.melloware.jintellitype.JIntellitype;

public class TestKeys {
    private HotkeyListener listener = new HotkeyListener() {
        @Override
        public void onHotKey(final int hotKeyId) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    JIntellitype.getInstance().removeHotKeyListener(listener);
                    handleHotKey(hotKeyId);
                    JIntellitype.getInstance().addHotKeyListener(listener);
                }
            }).start();
        }
    };

    public void registerHotKeys() {
        JIntellitype instance = JIntellitype.getInstance();
        instance.registerHotKey(1, JIntellitype.MOD_CONTROL, 'Q');
        instance.registerHotKey(2, JIntellitype.MOD_CONTROL, 'J');
        instance.addHotKeyListener(listener);
        System.out.println("Hotkeys registered");
    }

    private static void handleHotKey(int hotKeyId) {
        switch(hotKeyId) {
            case 1:
                System.out.println("Pressing some keys now!");
                pressSomeKeys();
                break;
            case 2:
                System.out.println("Bailing out, cya!");
                System.exit(0);
                break;
        }
    }

    private static void pressSomeKeys() {
        Robot r;
        try {
            r = new Robot();
        } 
        catch (AWTException e) {
            System.out.println("Creating robot failed");
            System.exit(2);
            return;
        }
        r.setAutoWaitForIdle(true);
        r.delay(150);
        r.waitForIdle();
        r.keyPress(KeyEvent.VK_T); r.keyRelease(KeyEvent.VK_T);
        r.keyPress(KeyEvent.VK_T); r.keyRelease(KeyEvent.VK_T);
        r.keyPress(KeyEvent.VK_SPACE); r.keyRelease(KeyEvent.VK_SPACE);
        r.keyPress(KeyEvent.VK_R); r.keyRelease(KeyEvent.VK_R);
        r.keyPress(KeyEvent.VK_O); r.keyRelease(KeyEvent.VK_O);
        r.keyPress(KeyEvent.VK_C); r.keyRelease(KeyEvent.VK_C);
        r.keyPress(KeyEvent.VK_K); r.keyRelease(KeyEvent.VK_K);
        r.keyPress(KeyEvent.VK_S); r.keyRelease(KeyEvent.VK_S);
    }

    public static synchronized void main(String[] args) {
        System.out.println("TestKeys started");
        TestKeys k = new TestKeys();
        k.registerHotKeys();
        try { 
            TestKeys.class.wait();
        } 
        catch (InterruptedException e) {
        }
    }
}

你应该考虑使用自动延迟设置。

如果及时发布输入事件,您的操作系统很可能在处理输入事件时遇到问题。尝试50毫秒或25毫秒延迟,看看会发生什么

另一件你可以尝试的事情是在每次按键前添加


编辑:对于体育运动,我尝试了以下代码片段,但效果相对较好。我测试了在(
ctrl-Q
)中按热键,它会一直打印出
tt
。但是我必须快速释放热键,否则记事本++开始将热键解释为其他内容(
ctrl-Q
已经是记事本++中其他内容的快捷方式)

使用机器人不是一门精确的科学。我不得不将机器人延迟150毫秒,然后在让机器人按键之前等待空闲时间。否则事情就搞砸了。没有必要设置自动延迟

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import com.melloware.jintellitype.HotkeyListener;
import com.melloware.jintellitype.JIntellitype;

public class TestKeys {
    private HotkeyListener listener = new HotkeyListener() {
        @Override
        public void onHotKey(final int hotKeyId) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    JIntellitype.getInstance().removeHotKeyListener(listener);
                    handleHotKey(hotKeyId);
                    JIntellitype.getInstance().addHotKeyListener(listener);
                }
            }).start();
        }
    };

    public void registerHotKeys() {
        JIntellitype instance = JIntellitype.getInstance();
        instance.registerHotKey(1, JIntellitype.MOD_CONTROL, 'Q');
        instance.registerHotKey(2, JIntellitype.MOD_CONTROL, 'J');
        instance.addHotKeyListener(listener);
        System.out.println("Hotkeys registered");
    }

    private static void handleHotKey(int hotKeyId) {
        switch(hotKeyId) {
            case 1:
                System.out.println("Pressing some keys now!");
                pressSomeKeys();
                break;
            case 2:
                System.out.println("Bailing out, cya!");
                System.exit(0);
                break;
        }
    }

    private static void pressSomeKeys() {
        Robot r;
        try {
            r = new Robot();
        } 
        catch (AWTException e) {
            System.out.println("Creating robot failed");
            System.exit(2);
            return;
        }
        r.setAutoWaitForIdle(true);
        r.delay(150);
        r.waitForIdle();
        r.keyPress(KeyEvent.VK_T); r.keyRelease(KeyEvent.VK_T);
        r.keyPress(KeyEvent.VK_T); r.keyRelease(KeyEvent.VK_T);
        r.keyPress(KeyEvent.VK_SPACE); r.keyRelease(KeyEvent.VK_SPACE);
        r.keyPress(KeyEvent.VK_R); r.keyRelease(KeyEvent.VK_R);
        r.keyPress(KeyEvent.VK_O); r.keyRelease(KeyEvent.VK_O);
        r.keyPress(KeyEvent.VK_C); r.keyRelease(KeyEvent.VK_C);
        r.keyPress(KeyEvent.VK_K); r.keyRelease(KeyEvent.VK_K);
        r.keyPress(KeyEvent.VK_S); r.keyRelease(KeyEvent.VK_S);
    }

    public static synchronized void main(String[] args) {
        System.out.println("TestKeys started");
        TestKeys k = new TestKeys();
        k.registerHotKeys();
        try { 
            TestKeys.class.wait();
        } 
        catch (InterruptedException e) {
        }
    }
}

你是说如果你增加延迟,你的程序会按预期工作,但你不想延迟吗?是的。。例如,在steam或其他软件中,当您按alt键时不会改变焦点。这项工作如预期,然后我按alt D键。没有延迟,没有问题。所有工作正常。首先,我想这可能是一些游戏限制,但第一次工作完美+我有一个不是我写的工具,它可以像我想在我的工具中做的那样与游戏一起工作。你是说如果你增加延迟,你的程序会按预期工作,但你不想延迟吗?是的。。例如,在steam或其他软件中,当您按alt键时不会改变焦点。这项工作如预期,然后我按alt D键。没有延迟,没有问题。所有工作正常。首先,我想这可能是一些游戏的限制,但第一次工作完美+我有一个工具,这不是我写的,它与游戏一样,我想在我的工具。好吧,idk为什么当机器人。setAutoDelay(50);第一个q不是写作,所有其他的工作都很慢。@N.A井50ms只是一个例子;25毫秒也可以。我用另一个建议更新了我的答案(
waitForIdle
)。如果这不起作用,也许你可以添加一个假按键,如果它总是第一次被忽略。TT。谢谢你的帮助。请再看一次我编辑他的主要帖子,如果你对此有一些想法,请告诉我,如果不只是告诉我像“不,thx”这样的话,我可以接受你的答案,我只是不知道如果我现在接受你的答案,你或我是否还可以在这个帖子中发表评论。@N.A我已经用一个在我的系统上运行得比较好的代码片段更新了我的答案。如果你按得很快,你的代码在开始延迟150或100甚至60的情况下运行得很好,但你和我的代码之间没有区别,两者都可以在启动延迟超过60秒的情况下工作。如果您在代码中将延迟减少到5或10,并在steam store search文本框中尝试,您可以重现我的问题。在steam中,当您按Alt或Ctrl键时,文本框中的焦点不会移出。您可能会在第一个注册的热键事件中看到代码工作得很好,“tt rocks”正在按预期编写,但在第二个事件中,无论您尝试了多少次,只有空格是write;第一个q不是写作,所有其他的工作都很慢。@N.A井50ms只是一个例子;25毫秒也可以。我用另一个建议更新了我的答案(
waitForIdle
)。如果这不起作用,也许你可以添加一个假按键,如果它总是第一次被忽略。TT。谢谢你的帮助。请再看一次我编辑他的主要帖子,如果你对此有一些想法,请告诉我,如果不只是告诉我像“不,thx”这样的话,我可以接受你的回答,我只是不知道你或我是否还可以发表评论