【问题标题】:How do I check if the caps lock key is pressed?如何检查是否按下了大写锁定键?
【发布时间】:2012-08-14 18:57:46
【问题描述】:

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

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

而且它总是打印出它开始时的任何内容

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

现在大写锁定:开启

现在大写锁定:开启

现在大写锁定:开启

现在大写锁定:开启

等等,如果我一开始就关闭它,无论如何它都会打印出来)

【问题讨论】:

  • 有效或无效取决于您的环境。它是什么? GUI 环境与命令行环境完全不同。
  • @Hot Licks 不确定您的意思,但请参阅我的编辑
  • @HotLicks 嗯。 -1 因为你很笨?我说不确定你的意思,意思是请进一步解释。你不会因为别人问你什么意思就给别人投反对票。
  • @HotLicks 我在 Windows 上从 Eclipse 运行,但我不希望操作系统影响它(这意味着如果你有适用于 Windows 的解决方案,我希望它可以在任何操作系统上运行)

标签: java capslock


【解决方案1】:

四处寻找,我认为getLockingKeyState() 可能被破坏了。

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

【讨论】:

  • 我想我最终会使用一些 JNI,并添加全局键侦听器;因为我可以在启动时获取大写锁定状态,并检测它何时更改(按下按钮时),我应该能够在布尔值中跟踪它并在需要时切换
  • @Dave 你能举一个 KeyboardUtils 用法的例子吗?
  • @AlexejMagura:对不起,不。这是我知道的,但从未使用过。
【解决方案2】:

看起来这总是被破坏或至少从 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应用必须具有焦点。

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

【讨论】:

    【解决方案3】:
    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();
    }
    

    【讨论】:

    • 您可以将 jLabel4.setText(YOURTEXT) 替换为 system.out.println()
    • 请解释一下你的解决方案,不要只写代码。
    猜你喜欢
    • 2023-03-03
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2014-08-31
    • 2012-11-12
    相关资源
    最近更新 更多