java鼠标捕获

时间:2010-08-26 00:29:45

标签: java mouse capture

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

4 个答案:

答案 0 :(得分:3)

你没有; JVM,或者更具体地说是AWT,只在Windows发送输入事件时生成输入事件,而JVM只注册在窗口内发生的那些事件。

您可以使用JNI将其关闭,但是您可能不会 - 它将取决于您是否能够掌握底层API所需的信息。由于这可能是一个窗口句柄,即使是从JNI,你也无法拥有调用API所需的内容。

答案 1 :(得分:1)

您必须在操作系统级别挂钩鼠标。 Windows(Swing,AWT,MFC等)只能识别其范围内的鼠标移动。如果您需要一种方法来访问鼠标的当前位置,无论鼠标在屏幕上的哪个位置,您都需要编写输入挂钩:Input Hooks。然后,您可以使用JNI或从win32控制台应用程序中读取STDOUT,该应用程序旨在使用Input Hook将鼠标事件/位置转发到Java代码。我在一些用户界面测试用例中使用后一种方法并取得了成功。

答案 2 :(得分: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

/HenrikBjörkman

答案 3 :(得分:0)

只需使用gitHub 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(); }
    }
}