java - para - ¿Es posible que un MouseMotionListener escuche todos los eventos de movimiento del mouse del sistema?
mouselistener para que sirve (5)
Mi oyente repetitivo:
class MyMouseMotionListener implements MouseMotionListener {
public void mouseDragged(MouseEvent e) {
System.out.println("Dragged...");
}
public void mouseMoved(MouseEvent e) {
System.out.println("Moved...");
}}
Bastante simple, pero ¿a qué lo agrego para escuchar eventos en todo el sistema? He estado investigando sobre cosas como las subclases GraphicsDevice y AccessibleContext; no ofrecen la adición de MouseMotionListeners directamente, pero esperaba que pudieran darme una idea de cómo podría implementar esto.
Editar: Esto no está basado en ningún evento, pero he encontrado esto:
MouseInfo.getPointerInfo().getLocation()
En realidad, devuelve la posición del mouse fuera del contexto de mi aplicación, incluso cuando la aplicación no tiene foco. ¿Hay alguna forma de observar esto y enviar un evento si su valor ha cambiado?
ACTUALIZACIÓN: puede sondear MouseInfo para la posición, pero nunca obtendrá el estado del botón. Deberá usar el código nativo para obtener el estado del botón.
No creo que haya ninguna forma sin usar código nativo para escuchar el cursor del mouse fuera de la jerarquía de cotainer de su aplicación.
Si desea escuchar / capturar todos los eventos del mouse en el sistema (como en, no solo la ventana de su aplicación), necesitará un gancho para el mouse .
Hay algunas bibliotecas para esto, una de las cuales uso regularmente para las aplicaciones.
JNativeHook tiene una capacidad excepcional para manejar eventos nativos de mouse y teclado. (google it, soy demasiado flojo para ir a la subversión. Aunque puedes simplemente descargar la biblioteca, y funciona como un evento de mouse normal después de hacer dos llamadas a la biblioteca.
Desearía que cuando estaba navegando en google alguien hubiera publicado esta biblioteca en un hilo como este. Yo uso todo el tiempo, pero no soy un miembro registrado, porque nunca pido ayuda públicamente.
Puede suscribirse a todos los eventos de mouse dentro de la jerarquía de contenedores de Java utilizando Toolkit.addAWTEventListener(AWTEventListener listener, long eventMask)
. El parámetro eventMask
determina qué eventos recibirá el oyente.
Entonces tu código se vería así:
Toolkit.getDefaultToolkit().addAWTEventListener(new MyMouseMotionListener(), AWTEvent.MOUSE_MOTION_EVENT_MASK );
Resolví el mismo problema utilizando la capacidad mencionada anteriormente para obtener la posición del mouse a pedido. Luego lancé un nuevo hilo para hacer esto continuamente durante el resto de la ejecución de los programas.
MouseInfo.getPointerInfo (). GetLocation ()
También tuve que hacer que la clase principal extendiera Thread por lo tanto
public class MouseMotion extends Thread {
Esto requiere que hagas una función llamada ejecutar. En tu función vacío simplemente crea un ciclo infinito
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
}
}
Todo lo que queda ahora es invocar el hilo cuando empiezas a ver el movimiento del mouse. Comienzo el hilo justo después de mi principal como tal
public static main (String[] args) throws Exception {
Thread thread = new MouseMotion();
thread.start();
...}