Как проверить нажатие клавиши при запуске в Java

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
8
0
6 493
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

Сложное решение в том, что программа хочет работать на Mac / Windows / Linux, а я недостаточно знаю C.

Zarkonnen 02.10.2008 04:18

@Zarkonnen Есть ли у него JVM в комплекте с установщиком? Если да, то KeyboadUtils.isPressed будет работать в Windows, Mac и Linux.

AlexV 30.07.2012 03:56

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

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

Ответ принят как подходящий

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

откуда мне импортировать класс Toolkit?

Amir Arad 05.10.2008 12:05

преодолело ли это решение проблемы, описанные в этом сообщении в блоге? Он вроде бы описывает этот метод как ненадежный, но он старый .... weblogs.java.net/blog/2007/11/02/log-me-log-me-out

slothbear 02.11.2009 07:55

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

На исходный вопрос, похоже, нет ответа. Предлагаемый метод определяет состояние клавиши блокировки, например CapsLock, ScrollLock и т. д. Поэтому он не будет работать для состояния нажатия Alt.

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

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

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

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

User32.INSTANCE.GetAsyncKeyState(...)

Другие вопросы по теме