2008-10-02 23 views
7

Estoy intentando escribir un cuadro de diálogo de selección de resolución que aparece cuando se inicia por primera vez un programa. Para evitar aburrir al usuario, quiero implementar la característica bastante estándar de que puede desactivar ese cuadro de diálogo con una casilla de verificación, pero recuperarlo manteniendo presionada la tecla alt al inicio.Cómo verificar si la tecla se mantiene presionada durante el inicio en Java

Desafortunadamente, no hay una forma obvia de preguntarle a java si una determinada tecla está siendo presionada . Solo puede registrarse para recibir información sobre nuevas pulsaciones de teclas a través de KeyListener, pero eso no ayuda si la pulsación de tecla comienza antes de que se inicie la aplicación.

Respuesta

1
public class LockingKeyDemo { 
    static Toolkit kit = Toolkit.getDefaultToolkit(); 

    public static void main(String[] args) { 
     System.out.println("caps lock2 = " 
       + kit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK)); 
} 
} 
+0

¿De dónde debería importar la clase Toolkit? –

+0

tiene esta solución superar los problemas descritos en esta publicación de blog? De alguna manera describe este método como poco fiable, pero es antiguo ... http://weblogs.java.net/blog/2007/11/02/log-me-log-me-out – slothbear

0

No sé mucho sobre Java (sobre todo código en C#), pero ¿qué tal tener un pequeño programa de carga escrito en C o algo que luego inicie su aplicación Java con algunos parámetros (como si se ha bloqueado o no?)?

+0

una solución difícil en que el programa quiere correr en Mac/Windows/Linux, y que no sé lo suficiente C. – Zarkonnen

+0

@Zarkonnen ¿Tiene JVM incluido con el instalador? Si la respuesta es sí, entonces 'KeyboadUtils.isPressed' funcionaría en Windows, Mac y Linux – AlexV

4
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.JFrame; 

public class LockingKeyDemo { 
    static Toolkit kit = Toolkit.getDefaultToolkit(); 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 

     frame.addWindowListener(new WindowAdapter() { 
      public void windowActivated(WindowEvent e) { 
       System.out.println("caps lock1 = " 
         + kit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK)); 

       try { 
        Robot robot = new Robot(); 
        robot.keyPress(KeyEvent.VK_CONTROL); 
        robot.keyRelease(KeyEvent.VK_CONTROL); 
       } catch (Exception e2) { 
        System.out.println(e2); 
       } 

       System.out.println("caps lock2 = " 
         + kit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK)); 
      } 
     }); 

     frame.addKeyListener(new KeyAdapter() { 
      public void keyReleased(KeyEvent e) { 
       System.out.println("caps lock3 = " 
         + kit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK)); 
      } 
     }); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(200, 200); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
2

Bien, hay dos tipos de detección de pulsación de tecla: basada en el evento y en el sondeo. Si sondeas el teclado para KEY_PRESSED al inicio (a través de un bucle con sleep.thread(timeInMs) comprobando constantemente si tu llave está presionada), entonces puedes detectar si ya está presionado al arrancar.

0

Parece que puede hacer esto, pero solo para caps lock et al. Por lo tanto, he cambiado al uso de mayúsculas y minúsculas para este propósito. No es perfecto, pero está bien.

1

Parece que la pregunta original no ha sido respondida. El método propuesto determina el estado de la tecla de bloqueo, como Bloq Mayús, Bloq Despl, etc. Por lo tanto, no funcionaría para Alt estado presionado.

Considere el siguiente código:

com.sun.jna.platform.KeyboardUtils.isPressed(java.awt.event.KeyEvent.VK_ALT);

El único problema es que esta clase es una clase JDK de Sun interno y no es probable que esté disponible en cualquier otra JVM. Depende de su proyecto, puede o no ser aceptable.

Internamente se pone en USER32.DLL en Windows:

User32.INSTANCE.GetAsyncKeyState(...)

Cuestiones relacionadas