Как отключить jnativehook по требованию? - PullRequest
0 голосов
/ 15 марта 2020

Если мое понимание мне подходит, правильный jnativehook можно включить и выключить с помощью этих двух команд:

GlobalScreen.removeNativeKeyListener (this); // это отключает

GlobalScreen.addNativeKeyListener (this); // и снова включает его

по этой логике c в программе ниже:

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

import java.util.Scanner; 
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;


public class GlobalKeyListenerExample implements NativeKeyListener {

public void nativeKeyPressed(NativeKeyEvent e) {


    System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
    String s = NativeKeyEvent.getKeyText(e.getKeyCode());
    handle(s);




    Logger logger = Logger.getLogger(GlobalScreen.class.getPackage().getName());
    logger.setLevel(Level.OFF);


    logger.setUseParentHandlers(false);
    if (e.getKeyCode() == NativeKeyEvent.VC_ESCAPE) {
        try {
            GlobalScreen.unregisterNativeHook();
        } catch (NativeHookException ex) {
            ex.printStackTrace();
        }
    }
}



public void nativeKeyReleased(NativeKeyEvent e) {
}

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






public void handle(String k) {
    if (k == "A") {//close nativeKeylistener and execute run()
        GlobalScreen.removeNativeKeyListener(this);
        run();

        run2();//turn keylistener back on
    }

}

public void run() {
    System.out.println("Hello there!");
    System.out.print("Write something, please: ");
    Scanner lukija = new Scanner(System.in);
    String str = lukija.nextLine();
    System.out.println("you wrote: "+str);
}

public void run2() {
    GlobalScreen.addNativeKeyListener(this);

}





public static void main(String[] args) {
    Logger logger = Logger.getLogger(GlobalScreen.class.getPackage().getName());
    logger.setLevel(Level.OFF);


    logger.setUseParentHandlers(false);
    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());
}

}

Насколько я понимаю, он должен напечатать что-то вроде этого.

kKey Pressed: K
Key Pressed: J
jKey Pressed: G
gKey Pressed: U
uKey Pressed: Y
yKey Pressed: T
tKey Pressed: H
hKey Pressed: V
vKey Pressed: B
bKey Pressed: N
nKey Pressed: H
hKey Pressed: G
gKey Pressed: A
Hello there!
Write: i am a robot
i am a robot

Вместо этого я получаю это:

kKey Pressed: K
Key Pressed: J
jKey Pressed: G
gKey Pressed: U
uKey Pressed: Y
yKey Pressed: T
tKey Pressed: H
hKey Pressed: V
vKey Pressed: B
bKey Pressed: N
nKey Pressed: H
hKey Pressed: G
gKey Pressed: A
Hello there!
Write: i am a robot
i am a robot
Key Pressed: Backspace
Key Pressed: I
Key Pressed: Space
Key Pressed: A
Hello there!
Write: test
test
Key Pressed: M
Key Pressed: Space
Key Pressed: A
Hello there!
Write: test
test
Key Pressed: Space
Key Pressed: R
Key Pressed: O
Key Pressed: B
Key Pressed: O
Key Pressed: T
Key Pressed: Enter
Key Pressed: T
Key Pressed: E
Key Pressed: S
Key Pressed: T
Key Pressed: Enter
Key Pressed: T
Key Pressed: E
Key Pressed: S
Key Pressed: T

Что происходит, когда nativehook продолжает перерегистрацию всех входных данных даже если я использовал команду

GlobalScreen.removeNativeKeyListener (this);

и когда я добавляю его обратно с помощью run2 (), программа проходит все нажатия клавиш, которые я давал при вводе (и методы, которые они вызывают, в этом случае run () при нажатии «a»). Почему это поведение?

1 Ответ

0 голосов
/ 15 марта 2020

Вы удаляете прослушиватель ключей, но это не мешает библиотеке регистрировать нажатия клавиш.

Чтобы остановить ведение журнала, вы должны выполнить:

GlobalScreen.unregisterNativeHook();
...