我试图编写一个程序第一次启动时弹出的分辨率选择对话框。为了防止枯燥的用户,我想实现相当标准的功能,你可以用一个复选框关闭该对话框,但在启动时按住alt键将其取消。如何检查在Java启动时按住的键
不幸的是,没有明显的方法来问java给定的键是否是目前正在按下。您只能注册才能通过KeyListener获知新的按键,但如果按键在应用程序启动之前启动,则不会有所帮助。
我试图编写一个程序第一次启动时弹出的分辨率选择对话框。为了防止枯燥的用户,我想实现相当标准的功能,你可以用一个复选框关闭该对话框,但在启动时按住alt键将其取消。如何检查在Java启动时按住的键
不幸的是,没有明显的方法来问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));
}
}
我不太了解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)
不断检查您的钥匙是否关闭),那么您可以检测启动时是否已按下键盘。
所以看来你可以做到这一点,但仅限于caps lock et al。因此,我已经转而使用大写锁定来达到这个目的。不完美,但确定。
原来的问题似乎没有回答。所提出的方法确定锁定键状态,如CapsLock,ScrollLock等。因此,它不适用于Alt按下状态。
考虑下面的代码:
com.sun.jna.platform.KeyboardUtils.isPressed(java.awt.event.KeyEvent.VK_ALT);
唯一的问题是,这个类是内部Sun的JDK类,而不是可能在任何其他JVM可用。取决于你的项目,它可能会或可能不被接受。
内部,它调用到USER32.DLL在Windows上:
User32.INSTANCE.GetAsyncKeyState(...)
在一个困难解决程序要在Mac/Windows的/ Linux上运行,而且我不知道够不够C. – Zarkonnen 2008-10-02 00:18:57
@Zarkonnen它是否将JVM与安装程序捆绑在一起?如果答案是肯定的,那么`KeyboadUtils.isPressed`可以在Windows,Mac和Linux上工作 – AlexV 2012-07-29 23:56:23