如何检查Java启动时按下的键

时间:2020-03-06 15:00:15  来源:igfitidea点击:

我正在尝试编写一个分辨率选择对话框,该对话框在程序首次启动时会弹出。为了避免使用户感到无聊,我想实现相当标准的功能,即可以通过复选框关闭该对话框,但是可以通过在启动时按住alt键来恢复对话框。

不幸的是,没有明显的方法来询问java当前是否正在按下给定的键。我们只能通过KeyListener进行注册,以获知新的按键操作,但是如果按键在应用程序启动之前启动,则无济于事。

解决方案

我对Java不太了解(大多数情况下是C#中的代码),但是对于用C编写的小型加载程序或者通过某些参数(例如某个键是否按下)启动Java应用程序的东西呢?

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

因此看来我们可以执行此操作,但仅适用于Caps Lock等。因此,我已为此目的而使用大写锁定。不完美,但是还可以。