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

我正在尝试编写一个程序首次启动时弹出的分辨率选择对话框。 为了防止用户厌烦,我想实现相当标准的function,您可以使用复选框关闭该对话框,但在启动时按住alt键将其取回。

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

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

我不太了解Java(主要是C#中的代码),但是如果用C语言编写一个小的加载程序,然后用一些参数启动Java应用程序(比如某个键是否关闭)呢?

所以你似乎可以做到这一点,但仅限于封锁等人。 因此,为了这个目的,我已经转而使用大写锁定。 不完美,但还行。