我可以使用java在后台捕获键盘和鼠标事件吗?

时间:2014-08-09 10:19:04

标签: java events listener background-process

我想编写一个应用程序,它将在后台运行并等待客户端在任何地方按下某些键(浏览器,......),作为响应,应用程序将执行某些操作

可以在java中做到吗?如果是的话,我该怎么做?

6 个答案:

答案 0 :(得分:2)

是的,您可以使用JKeyMaster和JNA在后台捕获键盘输入。

https://github.com/tulskiy/jkeymaster

    provider.register(KeyStroke.getKeyStroke("shift"), listener);

这会让听众知道shift  被压了。

有关更多信息,请查看github文档。

确保您的侦听器实现HotKeyListener

class SampleListener implements HotKeyListener {

    @Override
    public void onHotkey() {
        // do your things here
    }
}

答案 1 :(得分:2)

试试https://code.google.com/p/jnativehook/。它似乎为Java提供了一个本机钩子API。 https://code.google.com/p/jnativehook/wiki/examples下有一些示例代码。祝你好运!

答案 2 :(得分:1)

在纯Java中:不可能。

当您的应用程序未处于焦点时,您需要一段本机代码来捕获键盘和鼠标事件。

答案 3 :(得分:0)

想在Ip ziet帖子上为下一个人添加信息:

我不记得他到底做了什么,但是他告诉我他不必使用太多的本机库,核心Java已经对OS事件(例如键盘,屏幕,应用程序,OS进程)提供了良好的支持。 ..etc ..

您可以使用java.awt.robot在Java中轻松编写KeyInput: https://docs.oracle.com/javase/7/docs/api/java/awt/Robot.html 快速且易于使用。而且没有JNA。

但是阅读是另一个需要JNA的主题。 也在寻找阅读解决方案。 如果我找到一个好的阅读解决方案,它将在这里: https://github.com/EloiStree/2020_02_09_OpenMacroInput/issues/26

答案 4 :(得分:0)

正如其他人所提到的,请使用JNativeHook。这是一个简短的示例:

import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;

import java.util.concurrent.CountDownLatch;

import static java.util.logging.Level.OFF;
import static java.util.logging.Logger.getLogger;
import static org.jnativehook.GlobalScreen.*;
import static org.jnativehook.keyboard.NativeKeyEvent.getKeyText;

public class Harness implements NativeKeyListener {
  // Terminate after 100 keystrokes.
  private final CountDownLatch mLatch = new CountDownLatch( 100 );

  @Override
  public void nativeKeyPressed( final NativeKeyEvent e ) {
    System.out.println( "Pressed: " + getKeyText( e.getKeyCode() ) );
    mLatch.countDown();
  }

  @Override
  public void nativeKeyReleased( final NativeKeyEvent e ) {
    System.out.println( "Released: " + getKeyText( e.getKeyCode() ) );
  }

  @Override
  public void nativeKeyTyped( final NativeKeyEvent e ) {
    System.out.println( "Typed: " + e );
  }

  private void start() throws InterruptedException {
    System.out.println("Awaiting keyboard events.");
    mLatch.await();
    System.out.println("All keyboard events have fired, exiting.");
  }

  public static void main( final String[] args )
      throws NativeHookException, InterruptedException {
    disableNativeHookLogger();
    registerNativeHook();

    final var harness = new Harness();
    addNativeKeyListener( harness );

    System.out.println( "Listener attached.");
    harness.start();

    System.out.println( "Listener detached.");
    removeNativeKeyListener( harness );
  }

  private static void disableNativeHookLogger() {
    final var logger = getLogger( GlobalScreen.class.getPackage().getName() );
    logger.setLevel( OFF );
    logger.setUseParentHandlers( false );
  }
}

答案 5 :(得分:-4)

只是,这是可能的。我看到我的朋友写了一个java程序,帮助他在睡觉时玩在线游戏......他的java应用程序能够读取一些简单的验证码......

我不记得他到底做了什么,但他告诉我他不必使用很多原生库,核心java已经很好地支持了OS事件,如键盘,屏幕,应用程序,操作系统进程..等..