代码之家  ›  专栏  ›  技术社区  ›  Zarkonnen

如何在Java启动时检查密钥是否被按下

  •  8
  • Zarkonnen  · 技术社区  · 16 年前

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

    不幸的是,没有明显的方法来询问Java是否有一个给定的密钥。 当前正在按下 . 您只能通过keyListener注册以获得新按键的通知,但如果在应用程序启动之前启动了keyPress,则这没有帮助。

    6 回复  |  直到 13 年前
        1
  •  1
  •   anjanb    16 年前
    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));
    }
    }
    
        2
  •  4
  •   Robert Harvey    13 年前
    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);
        }
    }
    
        3
  •  2
  •   Robert Harvey    13 年前

    有两种按键检测:基于事件的检测和轮询。如果你在键盘上投票 KEY_PRESSED 启动时(通过一个循环 sleep.thread(timeInMs) 不断地检查你的钥匙是否掉了),然后你可以检测它是否已经被按下启动。

        4
  •  1
  •   AlexV    13 年前

    原来的问题似乎没有得到回答。所提出的方法确定了锁键状态,如capslock、scrolllock等,因此不适用于 中高音 压制状态。

    请考虑以下代码:

    com.sun.jna.platform.KeyboardUtils.isPressed(java.awt.event.KeyEvent.VK_ALT);

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

    在内部,它调用Windows上的user32.dll:

    User32.INSTANCE.GetAsyncKeyState(...)

        5
  •  0
  •   Rodrick Chapman    16 年前

    我不太了解Java(主要是C语言中的代码),但是如果有一个用C编写的小装入程序,或者用一些参数启动Java应用程序(比如某个键是否被按下),那该怎么办?

        6
  •  0
  •   Zarkonnen    16 年前

    因此,您似乎可以这样做,但仅限于Caps Lock等人。因此,我已经改为使用Caps Lock。不完美,但可以。