2015년 10월 21일 수요일

[java] jnativehook 을 이용한 단축키로 마우스 커서 좌표 얻어오기

매크로 프로그램 개발중 사용한 클래스로 마우스 좌표 2개를 자동 클릭 해줘야 할때
마우스 좌표를 얻어오기위한 코드입니다.

java 에서 글로벌 listener 를 , 즉 프레임 외부에서 마우스클릭및 키보드 이벤트를 감지하기위해선 jnativehook 라이브러리를 사용합니다.
저는 jnativehook-2.0.2.jar 를 사용했습니다.

2.0.0 을 사용할경우 GlobalScreen 객체에 NativeKeyListener 등록이 안되더군요

다운로드경로는 검색하시면 나올것이고 다운받아 압축 풀고 jar 폴더 가서
 jnativehook-2.0.2.jar 파일을 이클립스 에서 프로젝트 자바 빌드패스에 추가해줍니다.



import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;

import java.awt.MouseInfo;
import java.awt.PointerInfo;
import java.util.HashMap;
/**
 * 클래스 설명 : 마우스 네이티브 이벤트 관련하여 이벤트를 시작 중지하거나.
 * 마우스 좌표 값을 얻어서 저장 반환하는 클래스
 */
public class JavaNativeListener implements NativeKeyListener {

//글로벌스크린리스너 상태를 확인하기위한 변수
protected Boolean listenerStatus = false;

        //좌표
protected HashMap<String,String> point = new HashMap<String,String>();

/*
* 작성자 : 김태경
* 기능 : 네이티브 리스터 상태를 리턴한다.
*/
protected Boolean getListenerStatus(){

return this.listenerStatus;
}

/*
* 작성자:김태경
* 기능 : 저장된 좌표값들을 반환한다.
*/
protected HashMap<String,String> getCoordinates(){

return this.point;
}
/*
* 작성자 : 김태경
* 기능 : 첫번째 좌표를 셋팅한다.
*/
private void setFirstCoordinate(String first_Coordinate){

point.put("first_Coordinate", first_Coordinate);

}
/*
* 작성자 : 김태경
* 기능 : 두번째 좌표를 셋팅한다.
*/
private void setSecondCoordinate(String second_Coordinate){

point.put("second_Coordinate", second_Coordinate);
}


@Override
public void nativeKeyPressed(NativeKeyEvent e) {}

@Override
public void nativeKeyReleased(NativeKeyEvent e) {}
/*
* 작성자 : 김태경
* 기능 : 1,2 키보드 입력을 감지하여 입력시점에 마우스 좌표를 설정한다.
*/
@Override
public void nativeKeyTyped(NativeKeyEvent e) {

switch  (e.getKeyChar()){

case '1' :

HashMap<String,Double> first_Coordinate = getMouseXYLocation();

String x1 = first_Coordinate.get("X_Location").toString();
String y1 = first_Coordinate.get("Y_Location").toString();

setFirstCoordinate(x1+","+y1);

case '2' :

HashMap<String,Double> second_Coordinate = getMouseXYLocation();

String x2 = second_Coordinate.get("X_Location").toString();
String y2 = second_Coordinate.get("Y_Location").toString();

setSecondCoordinate(x2+","+y2);

}
}

/*
* 작성자 : 김태경
* 기능 : 글로벌 스크린에 네이티브 훅을 연결하고 상태값을 설정한다.
*/
public void startNativeKeyListener(){
try {

                GlobalScreen.registerNativeHook();

                //라이브러리 배포 사이트 예제와 와 다름.
                //글로벌 스크린에 직접 현재 클래스에서
                //작성한 NativeKeyListener 객체를 파라미터로 넣어주도 이벤트를 등록한다.

    GlobalScreen.addNativeKeyListener(this);
         
   }catch (NativeHookException ex) {
           System.err.println("There was a problem registering the native hook.");
           System.err.println(ex.getMessage());
         
           System.exit(1);
    }

listenerStatus = true;

}
/*
* 작성자 : 김태경
* 기능 : 글로벌 스크린에 네이티브 훅 연결을 해제하고 상태값을 설정한다.
*/
public void endKeyListener(){

try {
GlobalScreen.unregisterNativeHook();
} catch (NativeHookException e) {
e.printStackTrace();
}
listenerStatus = false;
}
/*
* 작성자 : 김태경
* 기능 : 현재 마우스의 x,y 좌표를 리턴한다.
*/

public HashMap<String,Double> getMouseXYLocation(){

HashMap<String,Double> point_XY = new HashMap<String,Double>();
PointerInfo pf = MouseInfo.getPointerInfo();
point_XY.put("X_Location", pf.getLocation().getX());
point_XY.put("Y_Location", pf.getLocation().getY());

return point_XY;
}

}

댓글 2개:

  1. 저기 궁금한게 있는데
    저런 라이브러리안의 클래스들의 설명은 어디에 나오죠?

    답글삭제
    답글
    1. api 가 있다면 api 참고 하시면되고. api 를 따로 못찾는경우는 메소드명보고 대충 이런거 하겟구나 싶어 테스트 해보고 코딩 하시면될거 같습니다.

      삭제

[lunux]리눅스 폴더별 용량 확인

리눅스 폴더별 용량 확인 조회 하고자 하는 디렉토리 리스트가있는 경로로 이동후 du -h --max-depth=1