Java - 키보드, 마우스 이벤트 받기 (이벤트 후킹)

최근 자바 프로그램을 만들면서, 키보드 이벤트를 받아서 처리해야할 일이 있었습니다.

JNativeHook라는 라이브러리를 이용하여 이벤트를 받았는데 사용하는 방법을 간단히 소개합니다.

1. JNativeHook 라이브러리 & 의존성 설정

JNativeHook는 GitHub에서 소스와 라이브러리를 제공합니다.

Maven 프로젝트의 경우, 다음과 같이 의존성을 추가할 수 있습니다.

<dependencies>
  <!--  https://mvnrepository.com/artifact/com.1stleg/jnativehook  -->
  <dependency>
    <groupId>com.github.kwhat</groupId>
    <artifactId>jnativehook</artifactId>
    <version>2.2.0</version>
  </dependency>
</dependencies>

GitHub에서 직접 jar를 다운로드받아 프로젝트에서 사용하셔도 됩니다.

2. 지원 환경

이 라이브러리는 다음 환경에서 지원된다고 합니다. Windows/MAC/Linux 는 모두 지원되는 것 같습니다. 저는 Windows에서 동작 확인하였습니다.

  • Java 1.8 - 17
  • 256 MB of RAM
  • Apple OS X 10.5 - 10.15
  • Windows 2000 - 10
  • Linux

3. 키보드 이벤트 받기

다음과 같이 키보드 이벤트에 대한 Listener를 등록하면 이벤트를 콜백받을 수 있습니다. 이벤트를 수신하려면 NativeKeyListener를 구현해야 합니다.

import com.github.kwhat.jnativehook.GlobalScreen;
import com.github.kwhat.jnativehook.NativeHookException;
import com.github.kwhat.jnativehook.keyboard.NativeKeyEvent;
import com.github.kwhat.jnativehook.keyboard.NativeKeyListener;

public class GlobalKeyListenerExample implements NativeKeyListener {

    public void nativeKeyPressed(NativeKeyEvent e) {
        System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));

        if (e.getKeyCode() == NativeKeyEvent.VC_ESCAPE) {
            try {
                GlobalScreen.unregisterNativeHook();
            } catch (NativeHookException nativeHookException) {
                nativeHookException.printStackTrace();
            }
        }
    }

    public void nativeKeyReleased(NativeKeyEvent e) {
        System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
    }

    public void nativeKeyTyped(NativeKeyEvent e) {
        System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode()));
    }

    public static void main(String[] args) {
        try {
            GlobalScreen.registerNativeHook();
        }
        catch (NativeHookException ex) {
            System.err.println("There was a problem registering the native hook.");
            System.err.println(ex.getMessage());

            System.exit(1);
        }

        GlobalScreen.addNativeKeyListener(new GlobalKeyListenerExample());
    }
}

4. 마우스 이벤트 받기

다음과 같이 마우스 이벤트에 대한 Listener를 등록하면 이벤트를 콜백받을 수 있습니다. 이벤트를 수신하려면 NativeMouseInputListener를 구현해야 합니다.

import GlobalScreen;
import NativeHookException;
import NativeMouseEvent;
import NativeMouseInputListener;

public class GlobalMouseListenerExample implements NativeMouseInputListener {

    public void nativeMouseClicked(NativeMouseEvent e) {
        System.out.println("Mouse Clicked: " + e.getClickCount());
    }

    public void nativeMousePressed(NativeMouseEvent e) {
        System.out.println("Mouse Pressed: " + e.getButton());
    }

    public void nativeMouseReleased(NativeMouseEvent e) {
        System.out.println("Mouse Released: " + e.getButton());
    }

    public void nativeMouseMoved(NativeMouseEvent e) {
        System.out.println("Mouse Moved: " + e.getX() + ", " + e.getY());
    }

    public void nativeMouseDragged(NativeMouseEvent e) {
        System.out.println("Mouse Dragged: " + e.getX() + ", " + e.getY());
    }

    public static void main(String[] args) {
        try {
            GlobalScreen.registerNativeHook();
        }
        catch (NativeHookException ex) {
            System.err.println("There was a problem registering the native hook.");
            System.err.println(ex.getMessage());

            System.exit(1);
        }

        // Construct the example object.
        GlobalMouseListenerExample example = new GlobalMouseListenerExample();

        // Add the appropriate listeners.
        GlobalScreen.addNativeMouseListener(example);
        GlobalScreen.addNativeMouseMotionListener(example);
    }
}

5. 마우스 휠 이벤트 받기

다음과 같이 마우스 휠 이벤트에 대한 Listener를 등록하면 이벤트를 콜백받을 수 있습니다. 이벤트를 수신하려면 NativeMouseWheelListener를 구현해야 합니다.

import GlobalScreen;
import NativeHookException;
import NativeMouseWheelEvent;
import NativeMouseWheelListener;

public class GlobalMouseWheelListenerExample implements NativeMouseWheelListener {

    public void nativeMouseWheelMoved(NativeMouseWheelEvent e) {
        System.out.println("Mosue Wheel Moved: " + e.getWheelRotation());
    }

    public static void main(String[] args) {
        try {
            GlobalScreen.registerNativeHook();
        }
        catch (NativeHookException ex) {
            System.err.println("There was a problem registering the native hook.");
            System.err.println(ex.getMessage());
            ex.printStackTrace();

            System.exit(1);
        }

        GlobalScreen.addNativeMouseWheelListener(new GlobalMouseWheelListenerExample());
    }
}
Loading script...
codechachaCopyright ©2019 codechacha