在Java中检索当前大写锁定状态

6
使用以下代码:
Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK)

很遗憾,它只会返回false。

根据文档,这应该有效:http://docs.oracle.com/javase/8/docs/api/java/awt/Toolkit.html#getLockingKeyState-int-

可运行的示例:

import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class Foo {

    public static void main(String[] args) {

        ExecutorService executorService = Executors.newFixedThreadPool(1);

        executorService.execute(new Runnable() {
            public void run() {
                while(true) {
                    try{ Thread.sleep(250); }catch(Exception ignored) { }
                    System.out.println("Capslock state: " + Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK));
                }
            }
        });

        executorService.shutdown();
    }

}

需要说明的是,我在Windows上使用Java SE 1.8版本,我的大小写锁定键工作正常

控制台输出的截图:

enter image description here


这个问题有一个错误报告,解释说在Windows系统中,当应用程序有一个具有焦点的框架时,这个方法将有效;否则它将仅返回程序执行时的任何值。 - FThompson
@Vulcan,在这种情况下是不正确的——因为它无论初始状态如何都会返回false。这也没有回答问题,因为JNA KeyUtils中的(isPressed)不是检查锁定按键状态的解决方案。 - Hobbyist
2个回答

2

你的代码对我来说很好用。我只是复制粘贴了你的代码,编译并运行它,在它运行时按下了大写锁定键。以下是输出结果:

$ javac Foo.java
$ java Foo
Capslock state: false
Capslock state: false
Capslock state: false
Capslock state: false
Capslock state: true
Capslock state: true
Capslock state: true
Capslock state: true
Capslock state: true
Capslock state: true
Capslock state: true
Capslock state: true
Capslock state: false
Capslock state: false
Capslock state: false
^C

我使用的是和你一样的Java 8。

$ java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

您的大小写锁定键是否正常工作?


1
@Christian.tucker 当然可以,但这些信息可以用来帮助确定问题是由您的Java版本还是像操作系统这样更大的问题引起的。 - FThompson
好的,我从你的截图中看到你正在运行Windows。这可能在这里很重要。我的测试是在OS X上完成的。 - Asaph
1
我的电脑是Windows 7系统,但java version "1.8.0_20"Java(TM) SE Runtime Environment (build 1.8.0_20-b26)Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)都无法正常运行。每次运行时,我总是看到输出结果为:Capslock state: false - Tobías
1
我刚在Windows 8上使用Java 1.8.0进行了测试,发现无论实际按键状态如何,都会不断打印“false”。 - FThompson
2
如果我一开始大写锁定开启,那么总是会得到“true”。我注意到它在第一次正确读取,但在程序执行期间从未更新。 - Tobías
显示剩余9条评论

0

你的代码在Java 1.7.0_25和6上运行良好。我只是复制粘贴它并使用NetBeans运行了一下。

这是结果:

Capslock state: true
Capslock state: true
Capslock state: true
Capslock state: true
Capslock state: true
Capslock state: true
Capslock state: true
Capslock state: true
pslock state: true
Capslock state: true

它应该在Java 8上工作,你尝试使用IDE了吗?

我使用的是Windows 7。


我使用Eclipse;但是为了双重检查,我在CMD中运行了它。 - Hobbyist
你试过除了大写锁定键之外的其他键吗?只是为了测试。 - Sharp Edge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接