Question

J'essaie d'écrire une boîte de dialogue de sélection de résolution qui apparaît au premier démarrage d'un programme. Pour éviter d’ennuyer l’utilisateur, je souhaite implémenter la fonctionnalité assez standard selon laquelle vous pouvez désactiver cette boîte de dialogue avec une case à cocher, mais la récupérer en maintenant la touche Alt enfoncée au démarrage.

Malheureusement, il n'y a pas de moyen évident de demander à Java si une touche est enfoncée . Vous pouvez uniquement vous enregistrer pour être informé des nouvelles pressions sur les touches via KeyListener, mais cela n'aide en rien si vous appuyez sur la touche avant le lancement de l'application.

Était-ce utile?

La solution

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

Autres conseils

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

Il existe deux types de détection de la pression sur une touche: basée sur les événements et la scrutation. Si vous interrogez le clavier pour KEY_PRESSED au démarrage (via une boucle avec un sleep.thread (timeInMs) en vérifiant constamment si votre clé est enfoncée), vous pouvez détecter déjà appuyé au démarrage.

La question initiale semble ne pas avoir de réponse. La méthode proposée détermine l’état de la clé de verrouillage comme CapsLock, ScrollLock, etc. Cela ne fonctionnerait donc pas pour l’état Alt .

Considérez le code suivant:

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

Le seul problème est que cette classe est une classe JDK de Sun interne et qu’elle n’est susceptible d’être disponible dans aucune autre JVM. Cela dépend de votre projet, cela peut être acceptable ou non.

En interne, il appelle User32.DLL sous Windows:

User32.INSTANCE.GetAsyncKeyState (...)

Je ne connais pas grand chose à Java (principalement du code en C #), mais qu'en est-il d'avoir un petit programme de chargement écrit en C ou quelque chose qui lance ensuite votre application Java avec certains paramètres (comme si une clé est en panne ou non) ?

Il semble donc que vous puissiez le faire, mais uniquement pour les majuscules lock et al. Par conséquent, je suis passé à l’utilisation de la majuscule à cette fin. Pas parfait, mais OK.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top