在浏览器中使用来自applet的JNativeHook

时间:2014-04-24 20:42:05

标签: java javascript browser applet java-native-interface

我正在尝试使用浏览器applet中的JNativeHook来获取某个键盘事件。我得到一些奇怪的行为,它似乎没有工作。这是我到目前为止的代码:

    import java.awt.*;
import java.applet.Applet;
import netscape.javascript.*;
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;

public class Test extends Applet implements NativeKeyListener { 

    JSObject window;

    public void nativeKeyPressed(NativeKeyEvent e) {
        window.eval("console.log('"+NativeKeyEvent.getKeyText(e.getKeyCode()) + "');");
    }

    public void nativeKeyReleased(NativeKeyEvent e) {
    }

    public void nativeKeyTyped(NativeKeyEvent e) {
    }

    public void init() {
        window = JSObject.getWindow(this);
        window.eval("console.log('test');");
        try {
            GlobalScreen.registerNativeHook();
        }
        catch (NativeHookException ex) {
            window.eval("console.log('There was a problem registering the native hook.');");
            window.eval("console.log('"+ex.getMessage()+"');");
            System.exit(1);                
        }

//Construct the example object and initialze native hook.
        GlobalScreen.getInstance().addNativeKeyListener(this);
    }
}

理想情况下,我希望能够在全局按下某个键后回调到javascript函数。我已经阅读了一些关于权限和签名的内容,但我不确定这是否导致localhost测试问题(我必须点击警告)。

我对JNativeHook的内部运作也不是100%。我很想用JNI为每个平台编写一个小DLL,但是我想检查一下我是否遗漏了一些基本的东西。

1 个答案:

答案 0 :(得分:0)

可以从JNLP运行本机代码(JNativeHook),但您需要使用有效证书对代码进行签名。如果你想进行一些测试,你可以从没有一个的localhost运行。