我想编写一个应用程序,它将在后台运行并等待客户端在任何地方按下某些键(浏览器,......),作为响应,应用程序将执行某些操作
可以在java中做到吗?如果是的话,我该怎么做?
答案 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事件,如键盘,屏幕,应用程序,操作系统进程..等..