마우스 좌표를 얻어오기위한 코드입니다.
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;
}
}
저기 궁금한게 있는데
답글삭제저런 라이브러리안의 클래스들의 설명은 어디에 나오죠?
api 가 있다면 api 참고 하시면되고. api 를 따로 못찾는경우는 메소드명보고 대충 이런거 하겟구나 싶어 테스트 해보고 코딩 하시면될거 같습니다.
삭제