从浏览器中的小程序使用JNativeHook

Using JNativeHook from an applet in browser

本文关键字:JNativeHook 程序 浏览器      更新时间:2023-09-26

我正试图从浏览器小程序中使用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测试出现问题(我必须点击警告)。

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

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