2017-03-31 1 views
1

:로봇 - RGB 값으로 위치로 마우스를 이동 나는 현재 좌표에 마우스를 이동하는 자바 로봇 클래스를 사용하고

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 값을 사용하여 마우스를 이동하는 가장 좋은 방법 벡하지 않을 수 있음을 깨달았다

는 방법이있다 이 주변?

+2

JNA를 사용하여 창 위치를 얻은 다음 해당 위치를 사용하여 버튼의 위치를 ​​계산하거나 적어도 마우스 공간을 사용하여 해당 픽셀을 찾을 수 있습니다. –

답변

0

제가 생각한 유일한 해결책은 원하는 색상을 찾는 일종의 스크린 스캔이었습니다. 그런 다음 마우스 포인터가 움직여야하는 위치를 결정해야했습니다.

픽셀 단위로 스캔하는 데는 많은 시간이 걸리므로 일부 픽셀은 건너 뛸 수 있습니다. 다음은 내가 나온 해결책입니다.

//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)가 자신의 의견에서 제안한 것과 함께이 솔루션을 사용할 수 있습니다.

관련 문제