好吧,在此标记为可能重复之前,我已经尝试过以下代码:
Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK)
它总是对我不利[见下文]。有人可以确认这是否应该有效,我是在滥用它,或者它是否已被破坏?如果它确实被破坏了,有没有人有更好的方法可以使用?
修改
好的,刚刚发现了更多东西。它似乎只是返回我的程序启动时的状态。如果我用它启动程序,它会打开,反之亦然。这是我的代码:
while (true) {
boolean isOn = Toolkit.getDefaultToolkit().getLockingKeyState(
KeyEvent.VK_CAPS_LOCK);
System.out.println("Caps lock is now: " + (isOn ? "ON" : "off"));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
而且它总是打印出它开始的任何东西
(例如,如果我开始大写锁定,即使我立即将其关闭,也会打印出来:
等等,如果我从它开始,它将打印出来,无论如何)大写锁定现在:开启
大写锁定现在:开启
大写锁定现在:开启
大写锁定现在:开启
答案 0 :(得分:5)
我认为getLockingKeyState()
可能会被打破。
您可以尝试KeyboardUtils,但看起来这意味着您必须承担JNA开销。
答案 1 :(得分:1)
类似的东西总是坏掉的,或者至少从Java 1.3起(参见Bug 4414164)。
不确定其他平台,但是对于 Windows ,我可以这样说:可以检测到Caps Lock的状态更改,但前提是您的awt客户端具有焦点。但是,有一种对我有效的解决方法:
boolean isCapsLockOn() {
java.awt.Robot robot = new java.awt.Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_CONTROL);
return Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK);
}
约束:调用isCapsLockOn
之前,您的awt应用必须具有焦点。
注意:您的机器人可能会按下其他对您的应用无害的键。可能取决于您的用例。
答案 2 :(得分:-1)
public void checkOnOff() {
Thread th = new Thread() {
public void run() {
for (;;) {
if (Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK)) {
jLabel4.setForeground(Color.red);
jLabel4.setText("CAPSLOCK is ON");
} else {
jLabel4.setText(null);
}
try {
sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
};th.start();
}