代码:
package keylogger;
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.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.VK_ESCAPE) {
try {
GlobalScreen.unregisterNativeHook(); // LINE 18
}
catch (NativeHookException ex) {
System.err.println("You cannot call unregisterNativeHook() from the native dispatch thread.");
}
}
}
public void nativeKeyReleased(NativeKeyEvent e) {
System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
}
public void nativeKeyTyped(NativeKeyEvent e) {
System.out.println("Key Typed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
}
public static void main(String[] args) {
try {
GlobalScreen.registerNativeHook(); // LINE 38
}
catch (NativeHookException ex) {
System.err.println("There was a problem registering the native hook.");
System.err.println(ex.getMessage());
ex.printStackTrace();
}
//Construct the example object and initialze native hook.
GlobalScreen.getInstance().addNativeKeyListener(new GlobalKeyListenerExample());
}
}
这与给定here on google code的代码相同。我下载了然后在我的项目中使用了JNativeHost library。但我得到以下错误:
Cannot find unregisterNativeHook,registerNativeHook. //(line 18,38)
The IDE also says GlobalKeyListenerExample is not abstract and doesn't override abstract method keyReleased.
到第一个错误the methods are defined here and they are native methods,我也导入了GlobalScreen类。
当我已经超越了那个时,为什么我会得到第二个错误? 但是当我在该方法之前添加@Override
注释时,IDE会发出错误消息,指出该方法不会覆盖或实现超类型。
答案 0 :(得分:2)
如果你正在使用eclipse,请尝试从这样的空类开始:
public class GlobalKeyListenerExample implements NativeKeyListener {
}
您应该在声明中出现错误,并且应该提供快速修复“实现抽象方法”。执行快速修复,看看它是否在之后编译(通常应该)。然后,您可以继续添加逻辑。
答案 1 :(得分:2)
一切都很好!我认为可能有问题的一件事是您可能使用的库版本与您复制和粘贴的代码有关!使用下面标记的库。 You can download it from here
从评论中我猜你正在使用netbeans。将此jar文件添加到您的库中。
答案 2 :(得分:0)
您说重写的方法很可能与基类中存在的签名不同。因此,您的方法不被视为被覆盖,而是一个新的重载版本。验证方法签名是否正确。
答案 3 :(得分:0)
如果您使用的是JDK 1.5,则只能在从基类重写方法时使用@Override,而不能在从接口实现方法时使用。