Java jnativehook无法找到如何触发关键事件
我一直在尝试jnativehook库和提供的示例,但我仍然无法触发密钥方法版本Java jnativehook无法找到如何触发关键事件,java,hook,Java,Hook,我一直在尝试jnativehook库和提供的示例,但我仍然无法触发密钥方法版本 package hookexample; import java.awt.EventQueue; import java.awt.Toolkit; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.util.ArrayList; import java.util.List; import java
package hookexample;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.AbstractExecutorService;
import java.util.concurrent.TimeUnit;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;
public class NativeHookDemo extends JFrame implements NativeKeyListener, WindowListener {
public NativeHookDemo() {
// Set the event dispatcher to a swing safe executor service.
GlobalScreen.getInstance().setEventDispatcher(new SwingExecutorService());
setTitle("JNativeHook Swing Example");
setSize(300, 150);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
addWindowListener(this);
setVisible(true);
}
public void windowOpened(WindowEvent e) {
//Initialze native hook.
try {
GlobalScreen.registerNativeHook();
}
catch (NativeHookException ex) {
System.err.println("There was a problem registering the native hook.");
System.err.println(ex.getMessage());
ex.printStackTrace();
System.exit(1);
}
GlobalScreen.getInstance().addNativeKeyListener(this);
}
public void windowClosed(WindowEvent e) {
//Clean up the native hook.
GlobalScreen.unregisterNativeHook();
System.runFinalization();
System.exit(0);
}
public void windowClosing(WindowEvent e) { /* Unimplemented */ }
public void windowIconified(WindowEvent e) { /* Unimplemented */ }
public void windowDeiconified(WindowEvent e) { /* Unimplemented */ }
public void windowActivated(WindowEvent e) { /* Unimplemented */ }
public void windowDeactivated(WindowEvent e) { /* Unimplemented */ }
public void nativeKeyReleased(NativeKeyEvent e) {
System.out.println("Key released!");
if (e.getKeyCode() == NativeKeyEvent.VC_SPACE) {
JOptionPane.showMessageDialog(null, "This will run on Swing's Event Dispatch Thread.");
}
}
public void nativeKeyPressed(NativeKeyEvent e) { /* Unimplemented */ }
public void nativeKeyTyped(NativeKeyEvent e) { /* Unimplemented */ }
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new SwingExample();
}
});
}
private class SwingExecutorService extends AbstractExecutorService {
private EventQueue queue;
public SwingExecutorService() {
queue = Toolkit.getDefaultToolkit().getSystemEventQueue();
}
public void shutdown() {
queue = null;
}
public List<Runnable> shutdownNow() {
return new ArrayList<Runnable>(0);
}
public boolean isShutdown() {
return queue == null;
}
public boolean isTerminated() {
return queue == null;
}
public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
return true;
}
public void execute(Runnable r) {
EventQueue.invokeLater(r);
}
}
}
package-hooke示例;
导入java.awt.EventQueue;
导入java.awt.Toolkit;
导入java.awt.event.WindowEvent;
导入java.awt.event.WindowListener;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.concurrent.AbstractExecutorService;
导入java.util.concurrent.TimeUnit;
导入javax.swing.JFrame;
导入javax.swing.JOptionPane;
导入javax.swing.SwingUtilities;
导入javax.swing.WindowConstants;
导入org.jnativehook.GlobalScreen;
导入org.jnativehook.NativeHookException;
导入org.jnativehook.keyboard.NativeKeyEvent;
导入org.jnativehook.keyboard.NativeKeyListener;
公共类NativeHookDemo扩展JFrame实现NativeKeyListener、WindowListener{
public NativeHookDemo(){
//将事件调度器设置为swing安全执行器服务。
GlobalScreen.getInstance().setEventDispatcher(新SwingExecutorService());
setTitle(“JNativeHook摆动示例”);
设置大小(300150);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
addWindowListener(此);
setVisible(真);
}
公共无效窗口已打开(WindowEvent e){
//初始化本机钩子。
试一试{
GlobalScreen.registerNativeHook();
}
捕获(本地钩子例外){
System.err.println(“注册本机钩子时出现问题”);
System.err.println(例如getMessage());
例如printStackTrace();
系统出口(1);
}
GlobalScreen.getInstance().addNativeKeyListener(此);
}
公共无效窗口关闭(WindowEvent e){
//清理本机钩子。
GlobalScreen.unregisterNativeHook();
System.runFinalization();
系统出口(0);
}
公共无效窗口关闭(WindowEvent e){/*未实现*/}
public void windowIconified(WindowEvent e){/*未实现*/}
public void windowdeconified(WindowEvent e){/*未实现*/}
public void windowActivated(WindowEvent e){/*未实现*/}
public void windowDeactivated(WindowEvent e){/*未实现*/}
公共无效nativeKeyReleased(NativeKeyEvent e){
System.out.println(“密钥已释放!”);
if(例如getKeyCode()==NativeKeyEvent.VC_空间){
showMessageDialog(null,“这将在Swing的事件调度线程上运行”);
}
}
public void nativeKeyPressed(NativeKeyEvent e){/*未实现*/}
public void nativeKeyTyped(NativeKeyEvent e){/*未实现*/}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
新SwingExample();
}
});
}
私有类SwingExecutorService扩展了AbstractExecutorService{
私有事件队列;
公共SwingExecutorService(){
queue=Toolkit.getDefaultToolkit().getSystemEventQueue();
}
公共空间关闭(){
队列=空;
}
公开列表关闭现在(){
返回新的ArrayList(0);
}
公共布尔值isShutdown(){
返回队列==null;
}
公共布尔值已取消(){
返回队列==null;
}
公共布尔等待终止(长超时,TimeUnit)抛出InterruptedException{
返回true;
}
public void execute(可运行的r){
调用器(r);
}
}
}
我只是简单地复制了上的示例,将类名与包名一起更改,并在nativekeyreased()中插入了系统print in console命令。添加了该库(JNativeHook v1.2.0-RC3)。当我运行代码时,它会在控制台中显示鼠标和按键事件的日志,但nativeKeyReleased()不会触发。我错过什么了吗 有人使用过这个插件吗?我注意到RC2不太稳定。试试beta2。是的,我降级了,工作很好。谢谢你的帮助。你测试过RC4吗?如果出现问题,请向github报告错误。