8

好吧,在这被标记为可能的重复之前,我已经尝试了以下代码:

Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK)

它总是对我返回 false [见下文]。有人可以确认这是否应该工作,我是否在滥用它,或者它是否已知被破坏?如果它实际上是坏的,有没有人有更好的方法来使用?

编辑:

好吧,刚刚又发现了一些东西。它似乎只是返回了我的程序启动开始时的状态。如果我打开程序启动它,它会说它打开,反之亦然。这是我的代码:

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

这总是打印出它开始的任何内容

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

大写锁定现在:打开

大写锁定现在:打开

大写锁定现在:打开

大写锁定现在:打开

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

4

3 回答 3

5

翻来覆去,我想getLockingKeyState()可能是坏了。

您可以尝试KeyboardUtils,但看起来这意味着您必须承担 JNA 开销。

于 2012-08-18T18:26:52.823 回答
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);  
}

约束:你的 awt 应用必须在调用isCapsLockOn.

注意:您的机器人可能会按下对您的应用程序无害的任何其他键。可能取决于您的用例。

于 2019-01-15T14:44:08.127 回答
-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();
}
于 2017-03-22T09:42:18.303 回答