如何在Java应用程序中捕获鼠标,以便Java应用程序可以看到所有鼠标事件(即使鼠标移动到应用程序窗口之外)?这类似于Windows的SetCapture函数。
你不能这样做;JVM,更具体地说是AWT,在Windows发送输入事件时才生成输入事件,并且JVM仅注册在其窗口中发生的事件。
您可能可以使用JNI来实现它,但也可能不行 - 这将取决于您是否能够获得底层API所需的信息。由于这很可能是一个窗口句柄,即使从JNI调用该API,您也无法获得所需的内容。
你需要在操作系统级别挂钩鼠标。Windows(Swing,AWT,MFC等)只知道其范围内的鼠标移动。如果您需要一种访问鼠标当前位置的方法,而不管鼠标在屏幕上的位置如何,您需要编写一个输入挂钩:输入挂钩。然后,您可以使用JNI或从设计为使用输入挂钩将鼠标事件/位置转发到Java代码的win32控制台应用程序中读取STDOUT。我在一些用户界面测试用例中成功地使用了后一种方法。
我也需要这样做!
在搜索了网络之后,我发现可以使用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
/亨里克·比约克曼
只需使用在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(); }
}
}