3

コード:

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());
    }
}

これは、Googleコードでここに示されているものと同じコードです。プロジェクトでJNativeHostライブラリをダウンロードして使用しました。しかし、次のエラーが発生します。

Cannot find unregisterNativeHook,registerNativeHook. //(line 18,38)
The IDE also says GlobalKeyListenerExample is not abstract and doesn't override abstract method keyReleased. 

最初のエラーでは、メソッドはここで定義されており、ネイティブメソッドであり、GlobalScreenクラスもインポートしました。

そして、すでにそれをオーバーライドしているのに、なぜ2番目のエラーが発生するのですか?しかし、@Overrideそのメソッドの前にアノテーションを追加すると、IDEは、メソッドがスーパータイプからオーバーライドまたは実装しないというエラーを出します。

4

4 に答える 4

2

Eclipse を使用している場合は、次のような空のクラスから始めてみてください。

public class GlobalKeyListenerExample implements NativeKeyListener {
}

宣言でエラーが発生し、「抽象メソッドの実装」のクイック フィックスが利用できるはずです。クイック フィックスを実行し、後でコンパイルされるかどうかを確認します (通常はコンパイルされるはずです)。次に、ロジックを追加します。

于 2012-05-22T07:22:50.417 に答える
2
于 2012-05-22T07:26:41.307 に答える
0

ほとんどの場合、オーバーライドしたと言うメソッドは、基本クラスに存在するものとは異なる署名を持っています。したがって、メソッドはオーバーライドされているとは見なされませんが、完全に新しいオーバーロードされたバージョンです。メソッドの署名が正しいことを確認してください。

于 2012-05-22T06:36:26.663 に答える
0

JDK 1.5 を使用している場合、@Override は、インターフェースからメソッドを実装するときではなく、基本クラスからメソッドをオーバーライドするときにのみ使用できます。

于 2012-05-22T10:19:06.433 に答える