Mi consulta es la siguiente:
Tengo una aplicacion que genera un evento cuado se presiona una tecla.
El problema es que para que genere el evento cuando presiono dicha
tecla, tengo que tener seleccionada la aplicacion (ventana), pero
necesito que reaccione ahun cuando la tenga deseleccionada.... se
entiende??
Por ejemplo: la aplicacion cuando presiono la tecla f11, ejecuta un
evento de un modulo separado que emite un sonido. Esto funciona
siempre en cuando la tenga seleccionada.
Yo necesito que si tengo cualquier otra ventana seleccionada como un
notepad por ejemplo, y presiono f11, mi aplicacion tambien emita un
sonido, osea que a pesar de no tener seleccionada mi aplicacion, esta
de todos modos escuche la tecla f11.
Les dejo el codigo para que vean que es lo que tengo andando. Les
reitero que funciona perfectamente cuando selecciono la aplicacion.
Desde ya mil gracias por las respuestas.
Saludos.
----------------------------------------------------------------------------------------------------------------------
Codigo:
----------------------------------------------------------------------------------------------------------------------
package sc.keyImpulse;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
public class KeyListener {
private JFrame parent;
private IPulseListenerKey parentI;
public KeyListener(IPulseListenerKey parent){
this.parent = (JFrame)parent;
parentI = parent;
initiate();
}
private void initiate(){
parent.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 121) {
parentI.actionMade();
}
}
});
parent.addFocusListener(new FocusAdapter() {
public void focusLost(FocusEvent arg0) {
parent.requestFocus();
}
});
}
}
----------------------------------------------------------------------------------------------------------------------
Resulta que la solucion no la tiene java. Lo que necesitaba yo es una
solucion de mas bajo nivel para lo cual java no esta diseñado.
Entonces me acorde de los famosos y odiosos (en algunos casos)
KeyLoggers. Todos me imagino los conocen. Son esos programitas que te
escuchan el teclado todo el tiempo y guardan contraseñas y eso. Y eso
es lo que necesitaba yo, escuchar el teclado hasta que se precione lo
que preciso y en ese momento ejecutar una accion....
Busque entonces como hacer KeyLoggers en inet. No importaba la
tecnologia, solo que se pudiera hacer y encontre un par de codigos
para c++. Note que estos codigos no hacen mas que llamar a la dll
user32.dll de windows. Esta tiene un metodo que se llama
GetAsyncKeyState que lo que hace es informar acerca del estado de una
tecla, si esta presionada o no...
Aqui es donde se resuelve todo. Lo unico que hice fue empezar a llamar
a esta dll desde Java en un thread independiente y cuando esta me
informa que se presiono la tecla emito un evento...
Asi de sensillo.
Lo unico malo es que pierdo la posibilidad de instalar el soft en
linux por ejemplo ya que para que funciones es concicion necesaria que
llame a esta dll pero eso se arregla con un modulo para linux y listo.
ahora no tengo el codigo de lo que resolvi en esta pc pero en cuanto
lo tenga lo posteo para que lo vean. a alguien quizas le pueda
resultar util.
saludos y gracias por las respuestas.
--
ATTE
Bruno Bonanno
15-5462-3775
-
http://johannburkard.de/software/nativecall/
Aqui las dos clases del ejemplo. Este lo unico que hace es mostrales
una ventanita con un boton que cuando lo presionan ejecuta el thread
que espera el pulso de la tecla. Cuando la app detecta que se presiono
la tecla que pidieron muestra un mensaje de "tecla presionada" en el
cuadro de texo de la app y en la consola de java.
Al ejemplo le tenemos que decir el codigo de la tecla que
escucharemos. Es un long y lo podemos obtener con un ejemplo de
keylistener que nos da java en este link:
http://java.sun.com/docs/books/tutorial/uiswing/events/keylistener.html
Cualquier consulta no duden en postearla.
Mil gracias a todos los que sugirieron soluciones.
Saludos.
------------------------------------------------------------------------------------------------------------------------------------
El codigo:
------------------------------------------------------------------------------------------------------------------------------------
package test;
import java.io.IOException;
import javax.swing.JTextField;
import com.eaio.nativecall.IntCall;
import com.eaio.nativecall.NativeCall;
public class Procces implements Runnable{
private JTextField salida;
public Procces(JTextField pSalida){
salida = pSalida;
}
public void run() {
comienzo();
}
public void comienzo (){
System.out.println ("...1");
try {
NativeCall.init();
} catch (UnsupportedOperationException ex) {
ex.printStackTrace();
} catch (UnsatisfiedLinkError ex) {
ex.printStackTrace();
} catch (SecurityException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} catch (sun.misc.ServiceConfigurationError ex) {
ex.printStackTrace();
}
System.out.println ("...2");
IntCall listen = new IntCall("user32.dll",
"GetAsyncKeyState");
System.out.println ("...3");
System.out.println ("");
boolean continuar = true;
while (continuar){
if (listen.executeCall(new Object[] {16}) != 0){
System.out.println("Tecla presionada");
this.salida.setText("Tecla presionada");
try{
Thread.currentThread().sleep(100);
}catch(InterruptedException e){
//no hago nada :P
}
this.salida.setText("");
}
}
listen.destroy();
System.out.println ("");
System.out.println ("finalizado");
}
}
------------------------------------------------------------------------------------------------------------------------------------
package test;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
public class Main {
private JFrame v;
private JButton b;
private JTextField text;
private JTextField resultado;
private Thread t = new Thread();
/** Creates a new instance of Main */
public Main() {
v = new JFrame("Nueva ventana de prueba");
v.getContentPane().setLayout(new FlowLayout());
b = new JButton("Presionar para comenzar escucha");
v.getContentPane().add(b);
text = new JTextField(15);
v.getContentPane().add(text);
resultado = new JTextField(15);
v.getContentPane().add(resultado);
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
text.setText("Esperando tecla...");
System.out.println("Comienza escucha del teclado");
resultado.setText("");
test();
}
});
v.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
v.setBounds(520, 400, 300, 150);
v.setVisible(true);
}
public static void main(String[] args) {
new Main();
}
public void test(){
if (t.isAlive()){
t.stop();
}
t = new Thread(new Procces(this.resultado));
t.start();
}
}
------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------