5

我的样板听众:

class MyMouseMotionListener implements MouseMotionListener {
public void mouseDragged(MouseEvent e) {
    System.out.println("Dragged...");
}

public void mouseMoved(MouseEvent e) {
    System.out.println("Moved...");
}}

很简单,但是为了监听系统范围的事件,我应该添加什么?我一直在研究诸如 GraphicsDevice 和 AccessibleContext 子类之类的东西——它们不直接提供 MouseMotionListeners 的添加,但我希望它们能给我一些关于如何实现它的想法。

编辑:这根本不是基于事件的,但我发现了这个:

MouseInfo.getPointerInfo().getLocation()

实际上会在我的应用程序上下文之外返回鼠标位置,即使应用程序本身没有焦点也是如此。如果事件的值发生变化,有什么方法可以观察并调度事件?

4

5 回答 5

5

您可以使用 订阅 Java 容器层次结构中的所有鼠标事件Toolkit.addAWTEventListener(AWTEventListener listener, long eventMask)。该eventMask参数确定侦听器将接收哪些事件。

所以你的代码看起来像:

Toolkit.getDefaultToolkit().addAWTEventListener(new MyMouseMotionListener(), AWTEvent.MOUSE_MOTION_EVENT_MASK);

于 2009-02-02T20:12:08.417 回答
3

更新:您可以轮询 MouseInfo 的位置,但您永远不会获得按钮状态。您将需要使用本机代码来获取按钮状态。

我认为没有任何方法可以不使用本机代码来监听应用程序容器层次结构之外的鼠标光标。

于 2009-02-02T19:43:15.760 回答
3

我通过使用上述根据请求获取鼠标位置的能力解决了同样的问题。然后我启动了一个新线程,在其余程序执行期间不断地执行此操作。

MouseInfo.getPointerInfo().getLocation()

我也不得不让主类扩展线程

public class MouseMotion extends Thread {

这要求您创建一个名为 run 的函数。在您的 void 函数中,只需创建一个无限循环

public void run() {
int n=10;
for (int i=0;i<n; n++) //horrible infinite loop
{
    Thread.sleep(100); //this will slow the capture rate to 0.1 seconds
    PointerInfo a = MouseInfo.getPointerInfo();
    Point p = new Point (0,0);
    a = MouseInfo.getPointerInfo();
    p = a.getLocation();
    int x = (int)p.getX(); //getX and getY return doubles so typecast
    int y = (int)p.getY();
    System.out.println(""+x+"   "+y);   //to see it grabing locations not needed
}
}

现在剩下的就是在您开始观察鼠标移动时调用线程。我在我的 main 之后立即启动线程

public static main (String[] args) throws Exception {
Thread thread = new MouseMotion();
thread.start();
...}
于 2012-07-20T18:01:03.583 回答
0

如果您想监听/捕获系统上的所有鼠标事件(例如,不仅仅是您的应用程序窗口),您将需要一个mouse hook

于 2009-02-02T20:45:19.507 回答
-4

为此有几个库,我经常将其中一个用于应用程序。

JNativeHook 具有处理本地鼠标和键盘事件的非凡能力。(谷歌它我懒得去subversion。虽然你可以下载这个库,它就像你两次调用库后的普通鼠标事件一样工作。

我希望当我在谷歌上冲浪时,有人会在这样的线程上发布这个库。我一直在使用 stackoverflow,但我不是注册会员,因为我从不公开寻求帮助。

于 2012-12-17T16:39:29.127 回答