teclado - Cómo verificar si la tecla se mantiene presionada durante el inicio en Java
keytyped java solo numeros (6)
No sé mucho sobre Java (sobre todo código en C #), pero ¿qué hay de tener un programa de cargador pequeño escrito en C o algo que luego inicia su aplicación Java con algunos parámetros (como si una determinada clave está desactivada o no)?
Intento escribir un cuadro de diálogo de selección de resolución que aparece cuando un programa se inicia por primera vez. 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.
Desafortunadamente, no hay una manera obvia de preguntarle a java si se está presionando una tecla determinada. 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.
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));
}
}
Entonces parece que puedes 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.
Bueno, hay dos tipos de detección de pulsación de tecla: basada en eventos y sondeo. Si KEY_PRESSED
el teclado para KEY_PRESSED
al inicio (a través de un bucle con un sleep.thread(timeInMs)
constantemente comprobando si su tecla está presionada), entonces puede detectar si ya está presionado al inicio.
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);
}
}
La pregunta original parece no ser respondida. El método propuesto determina el estado de la tecla de bloqueo, como Bloq Mayús, Bloq Despl, etc. Así que no funcionaría para el estado Alt pulsado.
Considera 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 interna de Sun y no es probable que esté disponible en ninguna otra JVM. Depende de su proyecto, puede o no ser aceptable.
Internamente llama a User32.DLL en Windows:
User32.INSTANCE.GetAsyncKeyState(...)