Java鼠标在屏幕上的任何位置移动
我确信这是可能的,但我所有的搜索都是空白的。
在Java中,是否可以在Java应用程序之外注册鼠标运动事件? 因此,如果鼠标指针移动到屏幕上的任何位置,我会收到回电。 轮询MouseInfo.getPointerInfo
可以进行近似,但必须有更好的方法。
谢谢
解释用例:它仅用于宠物项目,但基本上在鼠标触及屏幕边缘时触发事件。 我还在想,如果你试图超越屏幕的边缘,可能会触发不同的事件。 为此,我认为鼠标运动监听器可能更合适。
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 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 (); } 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
接收mouseDragged
事件。 那是因为无法接收有关主窗口外点击的信息。 - 出于类似的原因,每个
MouseEvent
的modifiers
将始终为0。 - 对于值
clickCount
,popupTrigger
,button
- 您将需要提供一个虚拟的
java.awt.Component
,它将用作MouseEvent
的(假)源 – 这里不允许使用null
值。