java - microsoft - visual studio installer
Escucha de entrada sin enfoque en Java (6)
Estoy haciendo un pequeño programa en Java usando la clase Robot. El programa se hace cargo del ratón. en el curso de la depuración si comienza a actuar de una manera que no quiero que sea difícil salir del programa, ya que no puedo mover el mouse sobre el botón de terminación en eclipse, y no puedo usar las teclas de acceso rápido para Golpéelo porque el mouse hace clic constantemente en otra ventana, lo que le da un enfoque a esa ventana.
Lo que me gustaría hacer es simplemente conectar un generador de claves para que cuando golpee q pueda salir del programa, pero la única forma de hacerlo es crear una ventana, y esa ventana debe enfocarse para capturar la entrada. ¿Hay alguna forma de escuchar la entrada del teclado o el mouse desde cualquier lugar, independientemente de lo que tenga el foco?
Esta es una forma pura de hacerlo para resolver el problema que ha descrito (no el problema de KeyListener ... la prueba para salir antes de usar el problema del robot):
A lo largo de su prueba, compare la posición del mouse con una que su prueba haya establecido recientemente. Si no coincide, salga de la prueba. Nota: la parte importante de este código es el método testPosition
. Aquí está el código que usé recientemente:
public void testSomething() throws Exception {
try {
// snip
// you can even extract this into a method "clickAndTest" or something
robot.mouseMove(x2, y2);
click();
testPosition(x2, y2);
// snip
} catch (ExitEarlyException e) {
// handle early exit
}
}
private static void click() throws InterruptedException {
r.mousePress(InputEvent.BUTTON1_DOWN_MASK);
Thread.sleep(30 + rand.nextInt(50));
r.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
Thread.sleep(30 + rand.nextInt(50));
}
private static void testPosition(int x2, int y2) throws ExitEarlyException {
Point p = MouseInfo.getPointerInfo().getLocation();
if(p.x != x2 || p.y != y2) throw new ExitEarlyException();
}
Este no es un problema trivial y Java no te da una manera de hacerlo con elegancia. Puede usar una solución como banjollity sugirió, pero incluso eso no funcionará todo el tiempo si los clics errantes del mouse abren otra ventana de tamaño completo actualmente abierta en su barra de tareas, por ejemplo.
El hecho es que Java, por defecto, les da a los desarrolladores muy poco control sobre el sistema operativo. Esto se debe a dos razones principales: la seguridad (como se cita en la documentación de Java) y el hecho de que los diferentes sistemas operativos manejan los eventos de manera completamente diferente y hacer que un modelo unificado para representar todos estos probablemente no tenga mucho sentido.
Entonces, para responder a su pregunta, me imagino que lo que quiere es algún tipo de comportamiento para su programa en el que escucha las pulsaciones de teclas a nivel mundial, no solo en su aplicación. Algo como esto requerirá que accedas a la funcionalidad ofrecida por el sistema operativo que elijas, y para acceder a ella en Java, necesitarás hacerlo a través de una capa de interfaz nativa de Java (JNI).
Entonces lo que quieres hacer es:
Implemente un programa en C que escuchará las pulsaciones de teclas globales en su sistema operativo, si este sistema operativo es de Windows, busque la documentación en los enlaces de Windows que Microsoft y MSDN documentan bien en la web y en otros lugares. Si su sistema operativo es Linux o Mac OS X, deberá escuchar las pulsaciones de teclas globales utilizando las bibliotecas de desarrollo X11. Esto se puede hacer en una distribución de Linux de ubunutu según un Howto que escribí en http://ubuntuforums.org/showthread.php?t=864566
Conecte su código C a su código Java a través de JNI. Este paso es en realidad el paso más fácil. Siga el procedimiento que utilizo en mi tutorial en http://ubuntuforums.org/showthread.php?t=864566 en Windows y Linux, ya que el procedimiento para conectar su código C a su código Java será idéntico en ambos sistemas operativos.
Lo importante a recordar es que es mucho más fácil hacer que su código JNI funcione si primero codifica y depura su código C / C ++ y se asegura de que esté funcionando. Entonces integrarlo con Java es fácil.
Haga que su programa abra una segunda ventana que se muestre debajo de su ventana principal pero que esté maximizada, luego que la ventana maximizada reciba todos los clics errantes del mouse, y puede recibir la entrada del teclado.
Hay una biblioteca que hace el trabajo duro por usted: https://github.com/kwhat/jnativehook
Inicie el programa desde una línea de comando en un terminal y use Ctrl-C para terminarlo.
Tuvo el mismo problema. En mi caso, el robot solo controlaba una única aplicación de Windows, que estaba maximizada. Coloqué estas líneas en la parte superior del bucle principal conduciendo el robot:
Color iconCenterColor = nuevo Color (255,0,0); // si el icono del programa es rojo
if (iconCenterColor.equals (robot.getPixelColor (10,15))) lanza una nueva IllegalStateException ("robot que no interactúa con la aplicación correcta.");
Para cancelar el robot, simplemente presione la tecla alt a otra aplicación. Funciona muy bien para una simple aplicación de robot de conducción.