¿detectar combinaciones de teclas con ventana minimizada? [solucionado]

Iniciado por p4nd4criss, 6 Junio 2012, 04:13 AM

0 Miembros y 1 Visitante están viendo este tema.

p4nd4criss

hola gente del foro


me gustaría poder traer al frente la ventana de mi programa(swing java) con una combinación de teclas. digamos
ctrl + P
<<la muñeca me esta matando>>
saben si es posible???
como se hace

Proteus1989

Hace tiempo busqué algo parecido pero solo encontré la escucha de teclado dentro de la ventana activa del JFrame, si no estaba en focus o minimizada no me hacia ni puñetero caso.

Me uno a la petición de algún código capaz de capturar dicho evento.

ollo

Parece ser que no es posible detectar teclas cuando la ventana de un programa está minimizada, cosas de seguridad, aunque no lo descartan del todo en la página donde lo he leído:

   stackoverflow.com/questions/6426955/listening-for-key-mouse-events

maxim_o

mmmm supongo que poder hacerse se podra hacer....
Un keyloger guarda todas las teclas pulsadas y no estas sobre el foco ni la ventana de este...
Asi que supongo que se podrá hacer algo parecido y cuando salgan las teclas señaladas se venga al frente tu aplicacion no?

p4nd4criss

Cita de: maxim_o en  8 Junio 2012, 23:45 PM
mmmm supongo que poder hacerse se podra hacer....
Un keyloger guarda todas las teclas pulsadas y no estas sobre el foco ni la ventana de este...
Asi que supongo que se podrá hacer algo parecido y cuando salgan las teclas señaladas se venga al frente tu aplicacion no?

muy interesante
buscare si hay algún keylogger en java. ojala tenga suerte.
me has dado una gran idea
aun asi no encuentre uno en java talves pueda programas una combinacion de teclas en el gnome y hacer k me ejecute una programa de unas pocas lineas k se comunique con el principal(de alguna forma. ni idea pero ya eso seria otro tema)
gracias gente

p4nd4criss

esta fue mi solución.
un poco mas complicada de lo k espere.
cuando el programa arranca crea un socket y se pone a escuchar con un hilo
cuando el programa es ejecutado nuevamente revisa el puerto y lo encuentra ocupado, asik envia uan señal al puerto y ternima su ejeucion
de esta manera el mismo atajo de teclado k uso para llamar al porgrama sirve para darle una orden, en este caso, k la ventana se ponga al frente

pero eso no es todo
si programo varios atajos de teclado, llamando al programa y dándole argumentos (java -jar algo.jar comando1)(java -jar algo.jar comando2)(java -jar algo.jar comando3)
puede enviar distintas señales dependiendo del argumento. y hacer k el hilo k escucha realice acciones diferentes con cada señal!!!

por cierto, mi escritorio es gnome. pueden  programar sus atajos de teclado en system>preferences>keyboard shortcuts o en el ccsm del compiz

weno les dejo el código

espero k les sea de ayuda. comenten si les gusto jeje


import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Main {
static ServerSocket SERVER_SOCKET;
static Socket socket;
static DataInputStream dataInput;
static DataOutputStream dataOutput;
   
    public static void main(String[] args) {       

      try {
        SERVER_SOCKET = new ServerSocket(1334);//si ya se esta ejecutando, el puerto estara ocupado
    } catch (IOException x) {
        System.out.println("puerto 1334 ocupado\n¿Otra instancia de la aplicación se está ejecutando?");
        try{
            System.out.println("enviando señal");//como ya se esta ejecutando solo hay k ponerlo al frente
            socket = new Socket("localhost", 1334);//conectarse al puerto
            dataOutput = new DataOutputStream(socket.getOutputStream());//esta tonteria es necesaria en java¬¬
            dataOutput.writeUTF("miapp.Show!!!");//enviando orden para k le ventana se haga visible
            socket.close();
        }
        catch(Exception e){e.printStackTrace();}
            System.exit(0);//ya enviada la orden se detiene
    }

        ventana obj = new ventana();//llamar a la ventana principal
        //obj.setVisible(true);
        try{
            if(args[0].equals("hide")){obj.setVisible(false);}else{obj.setVisible(true);}}// si revice un argumento "hide" la ventano no sera visible. cualquier otro argumento sera ignorado
        catch(Exception e){obj.setVisible(true);}//sin arguemntos, visible

        while (true){//la vetana principal ya esta funcionando y ahora escuchara cuadno se le ordene ir al frente
            try{
        Socket cliente = SERVER_SOCKET.accept();//espera k algo se coneccte
        dataInput = new DataInputStream(cliente.getInputStream());
        String text = dataInput.readUTF();//espera a recivir una orden
        //System.out.println(text);
        if (text.equals("miapp.Show!!!")){obj.setVisible(true);}//se asegura k la orden sea de la misma aplicacion y pone la ventana al frente
              }
            catch(Exception e){e.printStackTrace();}
        }

    }

}


Proteus1989

Es una buena solución pero el detalle es que no es multiplataforma.
Supongo que esos atajos te teclado estarán en un archivo en linux quizás desde ahí se podrían añadir para hacerlo más transparente al usuario final.