Движение мыши Java в любом месте экрана

Я уверен, что это возможно, но все мои поиски пусты.

В Java можно зарегистрировать событие движения мыши вне приложения Java? Поэтому, если указатель мыши перемещается в любом месте экрана, мне перезванивают. Аппроксимация возможна с опросом MouseInfo.getPointerInfo, но должен быть лучший способ.

Спасибо

Чтобы объяснить вариант использования: это просто для домашнего проекта, но в основном запускает события, когда мышь достигает края экрана. Я также подумал, что при попытке протолкнуть край экрана могут быть запущены разные события. И для этого я подумал, что прослушиватель движения мыши может быть более подходящим.


person David    schedule 18.03.2010    source источник
comment
Я не думаю, что есть лучший способ. Это должно быть независимо от ОС, и я сомневаюсь, что это легко возможно. Но что не так, если вы регулярно опрашиваете метод MouseInfo.getPointerInfo? Каков ваш вариант использования?   -  person Karussell    schedule 18.03.2010


Ответы (1)


java.awt.event.MouseMotionListener только даст вам информацию о движении мыши внутри окна вашего приложения. Для событий, происходящих за пределами этого окна, нет обходного пути MouseInfo.getPointerInfo. Однако вы можете написать (потенциально одноэлементный) класс, который через регулярные промежутки времени опрашивает информацию об указателе и позволяет добавлять MouseMotionListeners:

import java.awt.Component;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.HashSet;
import java.util.Set;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

/**
 * This class checks the position every #DELAY milliseconds and 
 * informs all registered MouseMotionListeners about position updates.
 */
public class MouseObserver {
    /* the resolution of the mouse motion */
    private static final int DELAY = 10;

    private Component component;
    private Timer timer;
    private Set<MouseMotionListener> mouseMotionListeners;

    protected MouseObserver(Component component) {
        if (component == null) {
            throw new IllegalArgumentException("Null component not allowed.");
        }

        this.component = component;

        /* poll mouse coordinates at the given rate */
        timer = new Timer(DELAY, new ActionListener() {
                private Point lastPoint = MouseInfo.getPointerInfo().getLocation();

                /* called every DELAY milliseconds to fetch the
                 * current mouse coordinates */
                public synchronized void actionPerformed(ActionEvent e) {
                    Point point = MouseInfo.getPointerInfo().getLocation();

                    if (!point.equals(lastPoint)) {
                        fireMouseMotionEvent(point);
                    }

                    lastPoint = point;
                }
            });
        mouseMotionListeners = new HashSet<MouseMotionListener>();
    }

    public Component getComponent() {
        return component;
    }

    public void start() {
        timer.start();
    }

    public void stop() {
        timer.stop();
    }

    public void addMouseMotionListener(MouseMotionListener listener) {
        synchronized (mouseMotionListeners) {
            mouseMotionListeners.add(listener);
        }
    }

    public void removeMouseMotionListener(MouseMotionListener listener) {
        synchronized (mouseMotionListeners) {
            mouseMotionListeners.remove(listener);
        }
    }

    protected void fireMouseMotionEvent(Point point) {
        synchronized (mouseMotionListeners) {
            for (final MouseMotionListener listener : mouseMotionListeners) {
                final MouseEvent event =
                    new MouseEvent(component, MouseEvent.MOUSE_MOVED, System.currentTimeMillis(),
                                   0, point.x, point.y, 0, false);

                SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            listener.mouseMoved(event);
                        }
                    });
            }
        }
    }

    /* Testing the ovserver */
    public static void main(String[] args) {
        JFrame main = new JFrame("dummy...");
        main.setSize(100,100);
        main.setVisible(true);

        MouseObserver mo = new MouseObserver(main);
        mo.addMouseMotionListener(new MouseMotionListener() {
                public void mouseMoved(MouseEvent e) {
                    System.out.println("mouse moved: " + e.getPoint());
                }

                public void mouseDragged(MouseEvent e) {
                    System.out.println("mouse dragged: " + e.getPoint());
                }
            });

        mo.start();
    }
}

Имейте в виду, что есть некоторые заметные отличия от вашего стандартного MouseMotionListener:

  • Вы получите только mouseMoved событий, а не mouseDragged событий. Это потому, что нет возможности получать информацию о кликах за пределами главного окна.
  • По тем же причинам modifiers каждого MouseEvent всегда будет равно 0.
  • То же самое касается значений clickCount, popupTrigger, button.
  • Вам нужно будет предоставить фиктивный java.awt.Component, который будет использоваться в качестве (поддельного) источника значений MouseEvents — null здесь не допускается.
person Thomas    schedule 18.03.2010