8

我正在尝试编写一个在程序首次启动时弹出的分辨率选择对话框。为了防止用户感到无聊,我想实现一个相当标准的功能,您可以使用复选框关闭该对话框,但通过在启动时按住 alt 键将其恢复。

不幸的是,没有明显的方法可以询问 java 当前是否正在按下给定的键。您只能通过 KeyListener 注册以获悉新的按键,但如果按键在应用程序启动之前启动,这将无济于事。

4

6 回答 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);
    }
}
于 2008-10-02T03:41:51.347 回答
2

那么有两种类型的按键检测:基于事件和轮询。如果您KEY_PRESSED在启动时轮询键盘(通过sleep.thread(timeInMs)不断检查您的键是否按下的循环),那么您可以检测它是否在启动时已被按下。

于 2008-10-02T04:07:50.613 回答
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(...)

于 2012-07-29T23:47:47.097 回答
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));
}
}
于 2008-10-02T04:14:56.167 回答
0

我对 Java 不太了解(主要是 C# 中的代码),但是如果有一个用 C 编写的小型加载程序或一些然后用一些参数启动你的 Java 应用程序的东西(比如某个键是否关闭)呢?

于 2008-10-02T00:16:26.083 回答
0

因此,您似乎可以这样做,但仅限于 caps lock 等。因此,我已为此目的转而使用大写锁定。不完美,但还可以。

于 2008-10-03T09:59:08.877 回答