[Duda]Es posible detectar teclas si mi aplicacion no tiene el foco

Iniciado por PabloPbl, 17 Marzo 2015, 02:28 AM

0 Miembros y 2 Visitantes están viendo este tema.

engel lex

Cita de: PabloPbl en 17 Marzo 2015, 17:41 PM
Muchas gracias [ Thunder | CLS ], estuve mirando la fuente que pusiste y la idea esta bastante buena la de no tener que recurrir a otros lenguajes.

el problema de java es que está sobre maquina virtual y todos sus esfuerzos para que todo sea multiplataforma lo alejan del sistema operativo, por otro lado los lenguajes nativos es casi imposible hacer un unico binario multiplataforma, pero tienes acceso al sistema operativo que estés trabajando... C y C++ no tienen más control sobre el SO, solo sobre ellos mismos... el control sobre el SO será igual para todo lenguaje que pueda usar las API del sistema, ya que el programa no hace esas operaciones, sino que se las solicita al sistema
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

PabloPbl

Hola Darhius, el hilo que comentas me ayudo bastante, muchas gracias.

Hola engel lex, ¿Cada sistema tiene su propia API? tengo entendido que la API de un SO te brinda funciones para realizar cosas con el SO que se esta trabajando
¿O que vendría siendo exactamente?, lo que si se, es que acceder desde Java a la misma es mala practica, por lo que es recomendable usar un lenguaje aparte, dicho lenguaje tiene que poder acceder a la API del SO como C/C++

engel lex

Citar¿Cada sistema tiene su propia API?
Si, cada sistema tiene su propia API, esas son básicamente las funciones directas del sistema operativo, si quieres interactuar con el, no tienes más opción...

esto no es standard ni los creadores están obligado a seguir algún patrón... ellos solo prestan las funciones que parecerían útiles

Citarlo que si se, es que acceder desde Java a la misma es mala practica
Claro, porque se supone que java corre donde caiga y si tiene una api de windows e intenta correr en linux, ahí murió (no se si tenga implicaciones de seguridad más profundas)

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Usuario Invitado

#13
CitarClaro, porque se supone que java corre donde caiga y si tiene una api de windows e intenta correr en linux, ahí murió (no se si tenga implicaciones de seguridad más profundas)

No tiene porque morir. Es simple, detectas el SO sobre el cual se está corriendo la app y se carga mediante JNI el archivo C/C++ correspondiente a dicho SO.

Código (java) [Seleccionar]

public enum OS {
   WINDOWS {
       @Override public void bind() {
           Bind.withWindows();
       }
   },
   LINUX {
       @Override public void bind() {
           Bind.withLinux();
       }
   },
   UNIX {
       @Override public void bind() {
           Bind.withUnix();
       }
   },
   MAC {
       @Override public void bind() {
           Bind.withMac();
       }
   },
  SOLARIS {
       @Override public void bind() {
           Bind.withSolaris();
       }
   };

   public abstract void bind();

}


Código (java) [Seleccionar]

public class LowLevelKeyListenerBinder {  
   private OS os;

   private String getOSName() {
       return System.getProperty("os.name").toLowerCase();
   }
   public LowLevelKeyListenerBinder prepare() {
       final String OS_NAME = this.getOSName();
       if(OS_NAME.contains("win")) {
           os = OS.WINDOWS;
       }
       if(OS_NAME.contains("nux")) {
           os = OS.LINUX;
       }
       if(OS_NAME.contains("nix")) {
           os = OS.UNIX;
       }
       if(OS_NAME.contains("mac")) {
           os = OS.MAC;
       }
       if(OS_NAME.contains("sunos")) {
           os = OS.SOLARIS;
       }
       return this;
   }
   public LowLevelKeyListenerBinder bind() {
       os.bind();
       return this;
   }

}


Desde el contralador de la ventana principal, debes de detectar el SO y asociar el KeyListener:

Código (java) [Seleccionar]
new LowLevelKeyListenerBinder().prepare().bind();


Es necesario que los métodos de Bind sean estáticos ya que un Enum es por defecto estático.


Un saludo.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

PabloPbl

Ok muchas gracias a todos tendré en cuenta lo que me habéis dicho.

Saludos!!!