我正在尝试编写一个在程序首次启动时弹出的分辨率选择对话框。为了防止用户感到无聊,我想实现一个相当标准的功能,您可以使用复选框关闭该对话框,但通过在启动时按住 alt 键将其恢复。
不幸的是,没有明显的方法可以询问 java 当前是否正在按下给定的键。您只能通过 KeyListener 注册以获悉新的按键,但如果按键在应用程序启动之前启动,这将无济于事。
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)
不断检查您的键是否按下的循环),那么您可以检测它是否在启动时已被按下。
最初的问题似乎没有得到回答。建议的方法确定锁定键状态,如 CapsLock、ScrollLock 等。因此它不适用于Alt按下状态。
考虑以下代码:
com.sun.jna.platform.KeyboardUtils.isPressed(java.awt.event.KeyEvent.VK_ALT);
唯一的问题是这个类是 Sun 的内部 JDK 类,不可能在任何其他 JVM 中可用。取决于您的项目,它可能会或可能不会被接受。
它在内部调用 Windows 上的 User32.DLL:
User32.INSTANCE.GetAsyncKeyState(...)
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));
}
}
我对 Java 不太了解(主要是 C# 中的代码),但是如果有一个用 C 编写的小型加载程序或一些然后用一些参数启动你的 Java 应用程序的东西(比如某个键是否关闭)呢?
因此,您似乎可以这样做,但仅限于 caps lock 等。因此,我已为此目的转而使用大写锁定。不完美,但还可以。