如何在Java中检查启动时按键是否被按下

8
我正在尝试编写一个分辨率选择对话框,该对话框在程序首次启动时弹出。为了防止用户感到无聊,我想实现一个相当标准的功能,即您可以通过复选框关闭该对话框,但是在启动时按住alt键可以再次打开它。
不幸的是,没有明显的方法询问Java是否当前被按下给定的键。您只能通过KeyListener注册以获得有关新按键的信息,但如果按键在应用程序启动之前开始,则这并没有帮助。
6个回答

4
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;

public class LockingKeyDemo {
    static Toolkit kit = Toolkit.getDefaultToolkit();

    public static void main(String[] args) {
        JFrame frame = new JFrame();

        frame.addWindowListener(new WindowAdapter() {
            public void windowActivated(WindowEvent e) {
                System.out.println("caps lock1 = "
                        + kit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK));

                try {
                    Robot robot = new Robot();
                    robot.keyPress(KeyEvent.VK_CONTROL);
                    robot.keyRelease(KeyEvent.VK_CONTROL);
                } catch (Exception e2) {
                    System.out.println(e2);
                }

                System.out.println("caps lock2 = "
                        + kit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK));
            }
        });

        frame.addKeyListener(new KeyAdapter() {
            public void keyReleased(KeyEvent e) {
                System.out.println("caps lock3 = "
                        + kit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK));
            }
        });

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

2
原始问题似乎没有得到解答。所提出的方法确定了锁定键状态,如CapsLock、ScrollLock等。因此,它不能用于Alt按下状态。
考虑以下代码: com.sun.jna.platform.KeyboardUtils.isPressed(java.awt.event.KeyEvent.VK_ALT); 唯一的问题是,这个类是一个内部Sun JDK类,不太可能在任何其他JVM中可用。根据您的项目,这可能是可以接受的或不可接受的。
在Windows上,它在内部调用User32.DLL: User32.INSTANCE.GetAsyncKeyState(...)

2

键盘按键检测有两种类型:事件驱动和轮询。如果您在启动时通过循环使用 sleep.thread(timeInMs) 不断检查按键是否按下来,以便轮询键盘是否有 KEY_PRESSED,则可以检测它是否已在启动时按下。


1
public class LockingKeyDemo {
    static Toolkit kit = Toolkit.getDefaultToolkit();

    public static void main(String[] args) {
        System.out.println("caps lock2 = "
                + kit.getLockingKeyState(KeyEvent.VK_CAPS_LOCK));
}
}

我应该从哪里导入Toolkit类? - Amir Arad
这个解决方案是否克服了在这篇博客文章中描述的问题?它有点描述了这种方法不可靠,但它已经过时了...。 http://weblogs.java.net/blog/2007/11/02/log-me-log-me-out - slothbear

0

我对Java不是很了解(主要使用C#编码),但是你可以写一个小的加载程序,用C或其他语言编写,然后使用一些参数启动你的Java应用程序(例如某个键是否按下)。


一个困难的解决方案是程序需要在Mac/Windows/Linux上运行,而我不太懂C语言。 - Zarkonnen
@Zarkonnen 安装程序中是否捆绑了JVM?如果是肯定的话,那么 KeyboadUtils.isPressed 在Windows、Mac和Linux上都可以工作。 - AlexV

0

看起来你可以这样做,但只能针对大写锁定等。因此,我已经改用大写锁定来实现这个目的。不是完美的,但还可以。


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