1

I'm using JNativeHook for global keyboard listen, but the nativeKeyTyped method is never fired on windows 10. The nativeKeyPressed and nativeKeyReleased methods are always fired. All methods work perfectly well on linux. Can someone help me with this problem ?

import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.logging.Level;

import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class KeyLogger implements NativeKeyListener {

    private static final Path file = Paths.get("keys.txt");
    private static final Logger logger = LoggerFactory.getLogger(KeyLogger.class);

    public static void main(String[] args) {

        logger.info("Key logger has been started");

        init();

        try {
            GlobalScreen.registerNativeHook();
        } catch (NativeHookException e) {
            logger.error(e.getMessage(), e);
            System.exit(-1);
        }

        GlobalScreen.addNativeKeyListener(new KeyLogger());
    }

    private static void init() {

        // Get the logger for "org.jnativehook" and set the level to warning.
        java.util.logging.Logger logger = java.util.logging.Logger.getLogger(GlobalScreen.class.getPackage().getName());
        logger.setLevel(Level.WARNING);

        // Don't forget to disable the parent handlers.
        logger.setUseParentHandlers(false);
    }

    public void nativeKeyPressed(NativeKeyEvent e) {
                System.out.println("nativeKeyPressed -> getKeyCode " + e.getKeyCode());
                System.out.println("nativeKeyPressed -> getKeyChar " + e.getKeyChar());
                System.out.println("nativeKeyPressed -> getRawCode " + e.getRawCode());
    }

    public void nativeKeyReleased(NativeKeyEvent e) {
                System.out.println("nativeKeyReleased -> getKeyCode " + e.getKeyCode());
                System.out.println("nativeKeyReleased -> getKeyChar " + e.getKeyChar());
                System.out.println("nativeKeyReleased -> getRawCode " + e.getRawCode());
    }

    public void nativeKeyTyped(NativeKeyEvent e) {
                System.out.println("nativeKeyTyped -> getKeyCode " + e.getKeyCode());
                System.out.println("nativeKeyTyped -> getKeyChar " + e.getKeyChar());
                System.out.println("nativeKeyTyped -> getRawCode " + e.getRawCode());
    }
}
araraujo
  • 613
  • 2
  • 8
  • 17

1 Answers1

0

It is working perfectly fine. Here is output when I ran your program and type in 'p'

nativeKeyPressed -> getKeyCode 25
nativeKeyPressed -> getKeyChar 
nativeKeyPressed -> getRawCode 35
nativeKeyTyped -> getKeyCode 0
nativeKeyTyped -> getKeyChar p
nativeKeyTyped -> getRawCode 35
nativeKeyReleased -> getKeyCode 25
nativeKeyReleased -> getKeyChar 
nativeKeyReleased -> getRawCode 35

Remember that

Key down and up events produce "codes" and key typed events produce "chars." 
Key down/up events will always have a char of CHAR_UNDEFINED and key typed 
events will always have a code of VK_UNDEFINED. This should match the behaviour 
of Java's KeyEvent.
Pramod
  • 768
  • 1
  • 12
  • 27