如何检查是否按下了大写锁定键?

时间:2012-08-18 17:42:29

标签: java capslock

好吧,在此标记为可能重复之前,我已经尝试过以下代码:

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) {
    }
}

而且它总是打印出它开始的任何东西

(例如,如果我开始大写锁定,即使我立即将其关闭,也会打印出来:

  

大写锁定现在:开启

     

大写锁定现在:开启

     

大写锁定现在:开启

     

大写锁定现在:开启

等等,如果我从它开始,它将打印出来,无论如何)

3 个答案:

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