Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.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 为什么机器人鼠标点击赢了';当鼠标聚焦在全屏程序上时不工作?_Java_Fullscreen_Awtrobot_Mouseclick Event - Fatal编程技术网

Java 为什么机器人鼠标点击赢了';当鼠标聚焦在全屏程序上时不工作?

Java 为什么机器人鼠标点击赢了';当鼠标聚焦在全屏程序上时不工作?,java,fullscreen,awtrobot,mouseclick-event,Java,Fullscreen,Awtrobot,Mouseclick Event,我有一个程序,可以持续监控屏幕的中心像素。如果中心像素的颜色发生变化,它将使用Robot类触发基本上是一次单击。我可以分别通过F9/F10打开/关闭它。当我运行程序时,它运行得非常好 我的问题是,当我运行程序并ALT+TAB到全屏程序(例如PC游戏)时,点击停止工作。知道为什么会这样吗 public class PixelBot implements NativeKeyListener{ private final Robot colorBot; private boolea

我有一个程序,可以持续监控屏幕的中心像素。如果中心像素的颜色发生变化,它将使用
Robot
类触发基本上是一次单击。我可以分别通过F9/F10打开/关闭它。当我运行程序时,它运行得非常好

我的问题是,当我运行程序并ALT+TAB到全屏程序(例如PC游戏)时,点击停止工作。知道为什么会这样吗

public class PixelBot implements NativeKeyListener{

    private final Robot colorBot;

    private boolean running = true;

    private int lastPixelValue = 0;

    public static void main(String[] args) throws Exception {
        GlobalScreen.registerNativeHook();
        GlobalScreen.getInstance().addNativeKeyListener(new PixelBot());
    }

    public PixelBot() throws AWTException {
        this.colorBot = new Robot();
        this.runInBackground();
    }

    private void checkPixel() throws AWTException {
        Rectangle areaOfInterest = getAreaOfInterest();
        BufferedImage image = colorBot.createScreenCapture(areaOfInterest);

        int clr = image.getRGB(0, 0);
        if (clr != lastPixelValue) {
            int red = (clr & 0x00ff0000) >> 16;
            int green = (clr & 0x0000ff00) >> 8;
            int blue = clr & 0x000000ff;
            System.out.println("\nPixel color changed to: Red: " + red + ", Green: " + green + ", Blue: " + blue);
            Toolkit.getDefaultToolkit().beep();
            lastPixelValue = clr;
            Robot robot = new Robot();
            robot.mousePress(InputEvent.BUTTON1_MASK);
            robot.mouseRelease(InputEvent.BUTTON1_MASK);
        } else {
            System.out.print(".");
        }
    }

    private Rectangle getAreaOfInterest() {
        // screen size may change:
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        // half of center of screen, minus 1 pixel to be captured:
        int centerPointX = (int)(screenSize.getWidth() / 2 - 1);
        int centerPointY = (int)(screenSize.getHeight() / 2 - 1);
        Point centerOfScreenMinusOnePixel = new Point(centerPointX, centerPointY);
        //System.out.println(centerPointX + " "  + centerPointY);
        return new Rectangle(centerOfScreenMinusOnePixel, new Dimension(1, 1));
    }

    private void runInBackground() {
        new Thread(new Runnable() {

            @Override
            public void run() {
                while (true) {
                    if(running){
                        try {
                            checkPixel();
                        } catch (AWTException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        }
                        try {
                            Thread.sleep(1);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }).start();
    }

    public void stop() {
        this.running = false;
    }

    public void start() {
        this.running = true;
    }

    @Override
    public void nativeKeyPressed(NativeKeyEvent e) {
        // TODO Auto-generated method stub
         System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
         if(NativeKeyEvent.getKeyText(e.getKeyCode()).equals("F9")){
             stop();
         }
         else if(NativeKeyEvent.getKeyText(e.getKeyCode()).equals("F10")){
             start();
         }
    }
}

点击应该发生在游戏内部吗?理论上我认为它应该发生在任何地方,所以你已经调试过你的程序了吗?它是否检测到改变的像素?它能否成功模拟点击(没有被聚焦程序识别),或者是否存在异常?如果你的游戏处于窗口模式,你的游戏会得到模拟的鼠标点击吗?那么,你会在游戏上做更多的测试。也许这就像@jkeuhlen说的:问题在于游戏,而不是你的程序。顺便说一句:你不应该在按下鼠标键后立即释放它。有些程序可能需要一些时间(以我的经验,大约30到60毫秒)来注册鼠标点击。与@Tom所说的相同,如果你试图在游戏中使用鼠标点击来“作弊”,游戏可能有保护措施阻止你使用模拟鼠标。点击应该发生在游戏内部吗?理论上我认为应该发生在任何地方,所以你已经调试过你的程序了吗?它是否检测到改变的像素?它能否成功模拟点击(没有被聚焦程序识别),或者是否存在异常?如果你的游戏处于窗口模式,你的游戏会得到模拟的鼠标点击吗?那么,你会在游戏上做更多的测试。也许这就像@jkeuhlen说的:问题在于游戏,而不是你的程序。顺便说一句:你不应该在按下鼠标键后立即释放它。有些程序可能需要一些时间(以我的经验,大约30到60毫秒)来注册鼠标点击。与@Tom所说的相同,如果你试图在游戏中使用它来“作弊”,游戏可能会有保护措施阻止你使用模拟鼠标。