Pregunta

Estoy intentando escribir un cuadro de diálogo de selección de resolución que aparece cuando se inicia un programa 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 volver a presionarla presionando la tecla Alt al inicio.

Lamentablemente, no hay una forma obvia de preguntar a Java si una tecla dada está presionando actualmente . Solo puede registrarse para estar informado de las nuevas pulsaciones de teclas a través de un KeyListener, pero eso no ayuda si la pulsación de teclas comienza antes de que se inicie la aplicación.

¿Fue útil?

Solució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));
}
}

Otros consejos

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);
    }
}

Bueno, hay dos tipos de detección de pulsación de tecla: basada en eventos y sondeo. Si sondea el teclado para KEY_PRESSED en el inicio (a través de un bucle con un sleep.thread (timeInMs) que comprueba constantemente si su tecla está inactiva), entonces puede detectar si está ya presionado en el inicio.

La pregunta original parece no ser contestada. El método propuesto determina el estado de la clave de bloqueo como CapsLock, ScrollLock, etc. Por lo tanto, no funcionaría para el estado presionado Alt .

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 interna y no es probable que esté disponible en ninguna otra JVM. Depender de su proyecto puede o no ser aceptable.

Internamente llama a User32.DLL en Windows:

User32.INSTANCE.GetAsyncKeyState(...)

No sé mucho acerca de Java (principalmente código en C #), pero ¿qué pasa con tener un programa de carga pequeña escrito en C o algo que luego ejecuta su aplicación Java con algunos parámetros (como si una determinada tecla está desactivada o no)? ?

Parece que puede hacer esto, pero solo para mayúsculas et al. Por lo tanto, he cambiado a utilizar el bloqueo de mayúsculas para este propósito. No es perfecto, pero está bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top