如何检查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等。因此,我已为此目的而使用大写锁定。不完美,但是还可以。

