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