gpt4 book ai didi

java - 如何按需停用jnativehook?

转载 作者:行者123 更新时间:2023-12-01 17:57:09 24 4
gpt4 key购买 nike

如果我的理解对我来说是正确的,可以使用这两个命令打开和关闭 jnativehook:

GlobalScreen.removeNativeKeyListener(this); //this shuts it down

GlobalScreen.addNativeKeyListener(this);//and this turns it back on again

按照这个逻辑,程序如下:

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() 将其添加回来时,程序会执行我在提供输入时按下的所有按键(以及它们调用的方法,在本例中为当按下“a”时的 run() )。为什么会出现这种行为?

最佳答案

您删除了按键监听器,但这并不能阻止库记录击键。

要停止记录,您应该这样做:

GlobalScreen.unregisterNativeHook();

关于java - 如何按需停用jnativehook?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60694783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com