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

不幸的是,没有明显的方法可以询问java当前是否按下了 。您只能通过KeyListener注册以通知新的按键操作,但如果按键在应用程序启动之前启动,则无效。

有帮助吗?

解决方案

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

其他提示

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

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

最初的问题似乎没有得到解答。建议的方法确定锁定键状态,如CapsLock,ScrollLock等。因此它不适用于 Alt 按下状态。

请考虑以下代码:

<代码> com.sun.jna.platform.KeyboardUtils.isPressed(java.awt.event.KeyEvent.VK_ALT);

唯一的问题是这个类是Sun的内部JDK类,并且不太可能在任何其他JVM中可用。取决于您的项目,它可能是也可能是不可接受的。

在内部,它调用Windows上的User32.DLL:

<代码> User32.INSTANCE.GetAsyncKeyState(...)

我对Java(主要是C#中的代码)知之甚少,但是如果用C语言编写一个小的加载程序,然后用一些参数启动你的Java应用程序(比如某个键是否关闭)怎么样? ?

所以看来你可以做到这一点,但仅限于封锁等。因此,为了这个目的,我已经转而使用大写锁定。不完美,但还行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top