Java鼠标捕获

3
如何在Java应用程序中捕获鼠标,以便Java应用程序可以看到所有鼠标事件(即使鼠标移动到应用程序窗口之外)?这类似于Windows的SetCapture函数。
4个回答

3

你不能这样做;JVM,更具体地说是AWT,在Windows发送输入事件时才生成输入事件,并且JVM仅注册在其窗口中发生的事件。

您可能可以使用JNI来实现它,但也可能不行 - 这将取决于您是否能够获得底层API所需的信息。由于这很可能是一个窗口句柄,即使从JNI调用该API,您也无法获得所需的内容。


1

你需要在操作系统级别挂钩鼠标。Windows(Swing,AWT,MFC等)只知道其范围内的鼠标移动。如果您需要一种访问鼠标当前位置的方法,而不管鼠标在屏幕上的位置如何,您需要编写一个输入挂钩:输入挂钩。然后,您可以使用JNI或从设计为使用输入挂钩将鼠标事件/位置转发到Java代码的win32控制台应用程序中读取STDOUT。我在一些用户界面测试用例中成功地使用了后一种方法。


0

我也需要这样做!

在搜索了网络之后,我发现可以使用java.awt.Robot中的moveMouse。

基本上使用Robot将鼠标移动到框架的中心。如果用户移动它:检查移动量并将其移回中心。

不需要额外的数据包或JNI(我的演示使用JOGL和vecmath,但那是为了图形)。这足够好吗?尝试一下演示,它在这里:

http://www.eit.se/hb/misc/java/examples/FirstPersonJavaProtoGame/

如果以上方案不够好,也许lwjgl是您所需要的:

http://www.lwjgl.org/javadoc/org/lwjgl/input/Mouse.html

/亨里克·比约克曼


0

只需使用在gitHub上可用的system-hook库https://github.com/kristian/system-hook

这仅适用于基于Windows的系统,但实现起来非常简单。

示例用法

import lc.kra.system.keyboard.GlobalKeyboardHook;
import lc.kra.system.keyboard.event.GlobalKeyAdapter;
import lc.kra.system.keyboard.event.GlobalKeyEvent;

public class GlobalKeyboardExample {
    private static boolean run = true;
    public static void main(String[] args) {
        // might throw a UnsatisfiedLinkError if the native library fails to load or a RuntimeException if hooking fails 
        GlobalKeyboardHook keyboardHook = new GlobalKeyboardHook();

        System.out.println("Global keyboard hook successfully started, press [escape] key to shutdown.");
        keyboardHook.addKeyListener(new GlobalKeyAdapter() {
            @Override public void keyPressed(GlobalKeyEvent event) {
                System.out.println(event);
                if(event.getVirtualKeyCode()==GlobalKeyEvent.VK_ESCAPE)
                    run = false;
            }
            @Override public void keyReleased(GlobalKeyEvent event) {
                System.out.println(event); }
        });

        try {
            while(run) Thread.sleep(128);
        } catch(InterruptedException e) { /* nothing to do here */ }
          finally { keyboardHook.shutdownHook(); }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接