是否可以让MouseMotionListener监听所有系统鼠标运动事件?

时间:2009-02-02 19:36:36

标签: java swing awt

我的样板监听器:

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

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

很简单,但是为了收听系统范围的事件,我应该添加什么?我一直在研究像GraphicsDevice和AccessibleContext子类这样的东西 - 他们没有直接添加MouseMotionListener,但我希望他们可以给我一些关于如何实现它的想法。

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

MouseInfo.getPointerInfo().getLocation()

实际上是否会在我的应用上下文之外返回鼠标位置,即使应用本身没有焦点也是如此。有没有办法观察这个并在事件发生变化时派遣一个事件?

5 个答案:

答案 0 :(得分:5)

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

所以你的代码看起来像:

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

答案 1 :(得分:3)

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

我认为如果不使用本机代码来监听应用程序的cotainer层次结构之外的鼠标光标,我认为没有办法。

答案 2 :(得分:2)

我通过使用上面提到的根据请求获取鼠标位置的能力解决了同样的问题。然后我启动了一个新的线程来继续执行其余的程序执行。

  
    

MouseInfo.getPointerInfo()。getLocation()

  

此外,我必须使主类扩展Thread因此

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
}
}

现在剩下的就是当你开始观察鼠标动作时调用线程。我在我的主要之后立即启动线程

public static main (String[] args) throws Exception {
Thread thread = new MouseMotion();
thread.start();
...}

答案 3 :(得分:0)

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

答案 4 :(得分:-4)

有一些库,其中一个我定期用于应用程序。

JNativeHook具有处理本机鼠标和键盘事件的卓越能力。 (谷歌它我懒得去颠覆。虽然你可以下载这个库,它就像你对图书馆两次调用后的常规鼠标事件一样工作。

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