[JAVA] Robot 사용하기

Posted by 김성철

JAVA - robot 사용하기

API  
	https://docs.oracle.com/javase/7/docs/api/java/awt/Robot.html  
참고 사이트  
	https://velog.io/@nkstar00/Java%EB%A1%9C-Macro%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EC%9E%90  
  
키보드 버튼 값 매핑  
	https://stackoverflow.com/questions/15313469/java-keyboard-keycodes-list/31637206  
  
https://github.com/kkimsungchul/study/tree/master/JAVA%26Spring/%5BJAVA%5D%20Robot%20%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0  
  
자바로도 매크로가 만들어 지나 테스트 해봄  
  
keyPress 키보드를 누름  
keyRelease 키보드를 땜  
delay 지연시간 (단위 ms)  
==================================================================================================================================================  
		Robot robot = new Robot();  
		int macroKey = "65";  
		robot.keyPress(macroKey);  
		robot.keyRelease(macroKey);  
		robot.delay(100);  
==================================================================================================================================================  
  
65는 키보드 A 임  
대문자를 입력해야 할 경우, 대문자의 앞 뒤에 shift 를 넣어주면됨  
, 로 구분하여서 특정문자들은 순서대로 입력하도록 설정하였음  
==================================================================================================================================================  
  
String macroWord = "windows,c,m,d,enter,i,p,shift,c,o,n,shift,f,i,g,enter";  
  
==================================================================================================================================================  

마우스 클릭 이벤트

======================================================================================================  
    try{  
        Robot robot = new Robot();  
        robot.mouseMove(605, 85);  
        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);//좌클릭 다운  
        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);//좌클릭 업  
        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);//좌클릭 다운  
        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);//좌클릭 업  
  
    }catch(Exception e) {  
        System.out.println("실패");  
        e.printStackTrace();  
    }  
======================================================================================================  

자동사냥 매크로

메이플월드에서 빨코3에서 사용하려고 만든 매크로  
좌우이동 / 버프 / 제네시스를 사용하도록 키세팅을 해놓앗음  
==========================================================================  
package org.example;  
  
import java.awt.*;  
import java.awt.event.KeyEvent;  
import java.util.ArrayList;  
import java.util.List;  
import java.util.logging.Logger;  
  
public class Main {  
	static Robot robot;  
	public static void main(String[] args) {  
  
		List<String> macroList = new ArrayList<>();  
		macroList.add("A");  
  
		try {  
			robot = new Robot();  
			try {  
  
				Thread teleportThread = new Thread(() -> {  
					try {  
						while(true){  
							move("LEFT");  
							move("RIGHT");  
						}  
					} catch (Exception e) {  
						e.printStackTrace();  
					}  
				});  
  
				Thread genesisThread = new Thread(() -> {  
					try {  
						while(true){  
							pressKey("A");  
							releaseKey("A");  
							Thread.sleep(3500);  
						}  
  
					} catch (InterruptedException e) {  
						e.printStackTrace();  
					}  
				});  
  
				Thread buffThread = new Thread(() -> {  
					try {  
						while(true){  
							pressKey("END");  
							releaseKey("END");  
							Thread.sleep(500);  
							pressKey("HOME");  
							releaseKey("HOME");  
							Thread.sleep(60000);  
						}  
  
					} catch (InterruptedException e) {  
						e.printStackTrace();  
					}  
				});  
  
				// 각 스레드 시작  
				teleportThread.start();  
				genesisThread.start();  
				buffThread.start();  
  
				// 메인 스레드는 아래의 스레드가 모두 종료될 때까지 대기  
				teleportThread.join();  
				genesisThread.join();  
				buffThread.join();  
  
				System.out.println("Both threads are finished.");  
			} catch (InterruptedException e) {  
				e.printStackTrace();  
			}  
		} catch (Exception e) {  
			e.printStackTrace();  
		}  
	}  
  
	private static void move(String directionWord){  
  
		try{  
			if(directionWord.equalsIgnoreCase("LEFT")){  
				pressKey("LEFT");  
				Thread.sleep(5000);  
				releaseKey("LEFT");  
  
			}else if (directionWord.equalsIgnoreCase("RIGHT")){  
				pressKey("RIGHT");  
				Thread.sleep(7000);  
				releaseKey("RIGHT");  
			}  
		}catch (Exception e) {  
			System.err.println("teleport error");  
			e.printStackTrace();  
		}  
	}  
  
	private static void teleport(String directionWord){  
  
		try{  
			if(directionWord.equalsIgnoreCase("UP")){  
				pressKey("UP");  
				pressKey("PAGE_DOWN");  
				Thread.sleep(500);  
				releaseKey("PAGE_DOWN");  
				releaseKey("UP");  
  
			}else if (directionWord.equalsIgnoreCase("DOWN")){  
				pressKey("DOWN");  
				pressKey("PAGE_DOWN");  
				Thread.sleep(500);  
				releaseKey("PAGE_DOWN");  
				releaseKey("DOWN");  
			}  
		}catch (Exception e) {  
			System.err.println("teleport error");  
			e.printStackTrace();  
		}  
	}  
	private static void pressKey(String key) {  
		int keyCode = getKeyCode(key);  
		robot.keyPress(keyCode);  
	}  
  
	private static void releaseKey(String key) {  
		int keyCode = getKeyCode(key);  
		robot.keyRelease(keyCode);  
	}  
  
	private static int getKeyCode(String key) {  
		switch (key.toUpperCase()) {  
			case "A":  
				return KeyEvent.VK_A;  
			case "B":  
				return KeyEvent.VK_B;  
			case "SHIFT":  
				return KeyEvent.VK_SHIFT;  
			case "CTRL":  
				return KeyEvent.VK_CONTROL;  
			case "ALT":  
				return KeyEvent.VK_ALT;  
			case "DOWN":  
				return KeyEvent.VK_DOWN;  
			case "UP":  
				return KeyEvent.VK_UP;  
			case "LEFT":  
				return KeyEvent.VK_LEFT;  
			case "RIGHT":  
				return KeyEvent.VK_RIGHT;  
			case "PAGE_DOWN":  
				return KeyEvent.VK_PAGE_DOWN;  
			case "END":  
				return KeyEvent.VK_END;  
			case "HOME":  
				return KeyEvent.VK_HOME;  
  
			// 다른 키들도 필요에 따라 추가하세요.  
			default:  
				return KeyEvent.getExtendedKeyCodeForChar(key.charAt(0));  
		}  
	}  
  
}  
  
==========================================================================