我正在尝试编写一个在程序首次启动时弹出的分辨率选择对话框。为了防止用户厌烦,我想实现相当标准的功能,您可以使用复选框关闭该对话框,但在启动时按住alt键将其取回。
不幸的是,没有明显的方法可以询问java当前是否按下了 。您只能通过KeyListener注册以通知新的按键操作,但如果按键在应用程序启动之前启动,则无效。
答案 0 :(得分:4)
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);
}
}
答案 1 :(得分:2)
有两种类型的按键检测:基于事件和轮询。如果您在启动时轮询键盘KEY_PRESSED
(通过循环sleep.thread(timeInMs)
不断检查您的密钥是否已关闭),那么您可以检测它是否已在启动时按下。
答案 2 :(得分:1)
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));
}
}
答案 3 :(得分:1)
最初的问题似乎没有得到解答。建议的方法确定锁定键状态,如CapsLock,ScrollLock等。因此它不适用于 Alt 按下状态。
请考虑以下代码:
com.sun.jna.platform.KeyboardUtils.isPressed(java.awt.event.KeyEvent.VK_ALT);
唯一的问题是这个类是Sun的内部JDK类,并且不太可能在任何其他JVM中可用。取决于您的项目,它可能是也可能是不可接受的。
在内部,它调用Windows上的User32.DLL:
User32.INSTANCE.GetAsyncKeyState(...)
答案 4 :(得分:0)
我对Java(主要是C#中的代码)知之甚少,但是如果用C语言编写一个小的加载程序,然后用一些参数启动你的Java应用程序(比如某个键是否关闭)怎么样? ?
答案 5 :(得分:0)
所以看来你可以做到这一点,但仅限于封锁等。因此,为了这个目的,我已经转而使用大写锁定。不完美,但还行。