【问题标题】:Robot - Move Mouse to Position with RGB Value机器人 - 将鼠标移动到具有 RGB 值的位置
【发布时间】:2017-04-03 22:16:08
【问题描述】:

我目前正在使用 Java Robot 类将鼠标移动到坐标:

Robot bot = new Robot();

bot.mouseMove(x, y);

问题是我需要将鼠标移动到一个坐标才能单击弹出窗口中的特定按钮,并且窗口每次出现时都可以从一个位置移动到另一个位置(它并不总是在同一个位置) . (在我的具体情况下,我将Ctrl + P 发送到记事本,然后单击弹出窗口中的“打印”按钮)。

我正在考虑通过以下方式检索我想要点击的按钮的 RGB 值:

Color color = bot.getPixelColor( MouseInfo.getPointerInfo().getLocation().x 
                    , MouseInfo.getPointerInfo().getLocation().y);


System.out.println(color.getRGB());

然后以某种方式将鼠标移动到具有给定 RGB 值的位置,但我不确定如何实现。

或者有没有我没有想到的替代解决方案?

谢谢!

更新:

我意识到使用 RGB 值移动鼠标可能不是最好的解决方案,因为如果有多个坐标具有相同的 RGB 值,它可能会检测到错误的点。有没有办法解决这个问题?

【问题讨论】:

  • 我会使用 JNA 获取窗口位置,然后使用该位置计算哪个是按钮的位置,或者至少有较小的空间来使用 mouseMove 来查找该像素。

标签: java awtrobot


【解决方案1】:

我认为唯一的解决方案是一种屏幕扫描,寻找所需的颜色,然后你必须决定鼠标指针必须移动到哪里。

但逐个像素扫描会花费大量时间,因此您可能希望跳过一些像素。这是我提出的解决方案:

//Look for some color on Screen, skiping or not a value of pixels
    public static void scanScreen(Color matchColor, int skipPixel){

        try {
            Robot r = new Robot();

            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            double width = screenSize.getWidth();
            double height = screenSize.getHeight();

            //Scan the screen pixel by pixel
            for(int pixelX = 0; pixelX<= width;pixelX = pixelX + skipPixel){
                for(int pixelY = 0; pixelY<=height;pixelY = pixelY + skipPixel){


                    Color currentColor = r.getPixelColor(pixelX, pixelY);
                    System.out.println(pixelX+","+pixelY+": " + currentColor.getRGB());
                    if(matchColor.getRGB()==currentColor.getRGB()){
                        //TODO Do whatever you want with the location found

                        System.out.println("Found color: " + matchColor.getRGB() + " at "+ pixelX + ","+pixelY);
                    }


                }
            }
        } catch (AWTException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


public static void main(String[] args) {
            Color c = new Color(-1972490);
            scanScreen(c, 100);
    }

希望对您有所帮助。祝你好运!

EDIT1:您可以将此解决方案与 Jorge Campos 在他的评论中建议的内容一起使用。

【讨论】:

    猜你喜欢
    • 2011-07-17
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 2011-10-04
    • 2011-06-12
    相关资源
    最近更新 更多