Как проверить, удерживается ли ключ при запуске в Java - PullRequest
8 голосов
/ 02 октября 2008

Я пытаюсь написать диалоговое окно выбора разрешения, которое появляется при первом запуске программы. Чтобы предотвратить скучность пользователя, я хочу реализовать довольно стандартную функцию, которая позволяет отключить это диалоговое окно с помощью флажка, но вернуть его можно, удерживая клавишу alt при запуске.

К сожалению, нет очевидного способа спросить Java, является ли данная клавиша нажатой в данный момент . Вы можете зарегистрироваться только для получения информации о новых нажатиях клавиш через KeyListener, но это не поможет, если нажатие клавиши начнется до запуска приложения.

Ответы [ 6 ]

4 голосов
/ 02 октября 2008
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 голосов
/ 02 октября 2008

Ну, есть два типа обнаружения нажатия клавиш: на основе событий и опроса. Если вы опрашиваете клавиатуру на KEY_PRESSED при запуске (через цикл с sleep.thread(timeInMs), постоянно проверяющим, нажата ли ваша клавиша), то вы можете определить, нажата ли она уже при запуске.

1 голос
/ 30 июля 2012

Оригинальный вопрос, кажется, не ответил. Предложенный метод определяет состояние ключа блокировки, например CapsLock, ScrollLock и т. Д. Таким образом, он не будет работать для Alt нажатого состояния.

Рассмотрим следующий код:

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

Единственная проблема заключается в том, что этот класс является внутренним классом JDK Sun и вряд ли будет доступен в любой другой JVM. Зависит от вашего проекта, это может или не может быть приемлемым.

Внутренне он вызывает User32.DLL в Windows:

User32.INSTANCE.GetAsyncKeyState(...)

1 голос
/ 02 октября 2008
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 голосов
/ 03 октября 2008

Похоже, что вы можете сделать это, но только для caps lock et al. Следовательно, я переключился на использование caps lock для этой цели. Не идеально, но хорошо.

0 голосов
/ 02 октября 2008

Я не очень разбираюсь в Java (в основном это код на C #), но как насчет небольшой программы-загрузчика, написанной на C, или чего-то такого, что затем запускает ваше Java-приложение с некоторыми параметрами (например, отключен ли определенный ключ)

...