Pergunta

Eu estou tentando escrever um diálogo de seleção de resolução que aparece quando um programa começa pela primeira vez. Para evitar chato o usuário, eu quero implementar o recurso bastante normal que você pode desligar essa caixa de diálogo com uma caixa de seleção, mas recuperá-lo mantendo pressionada a tecla Alt durante a inicialização.

Infelizmente, não há nenhuma maneira óbvia para perguntar java se uma determinada chave é atualmente sendo pressionado . Você só pode se cadastrar para ser informado de novas teclas pressionadas através de uma KeyListener, mas isso não ajuda se as partidas keypress antes dos lançamentos de aplicativos.

Foi útil?

Solução

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

Outras dicas

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

Bem, existem dois tipos de detecção pressione a tecla: eventos com base, e polling. Se você consultar o teclado para KEY_PRESSED na inicialização (através de um loop com um sleep.thread(timeInMs) constantemente verificando se a chave está em baixo), então você pode detectar se ele já está pressionado na inicialização.

A pergunta original parece não ser respondidas. O método proposto determina o estado de chave de bloqueio como CapsLock, ScrollLock, etc. Por isso, não seria trabalho para Alt estado pressionado.

Considere o seguinte código:

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

O único problema é que esta classe é uma classe JDK da Sun interna e não susceptíveis de estar disponível em qualquer outra JVM. Depender do seu projeto pode ou não ser aceitável.

Internamente põe em user32.dll no Windows:

User32.INSTANCE.GetAsyncKeyState(...)

Eu não sei muito sobre Java (principalmente código em C #), mas o que sobre ter um pequeno programa carregador escrito em C ou algo que, em seguida, lança seu aplicativo Java com alguns parâmetros (como se deve ou não uma determinada chave está em baixo) ?

Assim, parece que você pode fazer isso, mas apenas para Caps Lock et al. Daí, eu tenho mudado para utilizar o bloqueio de tampas para esta finalidade. Não é perfeito, mas OK.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top