2008-10-02 56 views
7

我试图编写一个程序第一次启动时弹出的分辨率选择对话框。为了防止枯燥的用户,我想实现相当标准的功能,你可以用一个复选框关闭该对话框,但在启动时按住alt键将其取消。如何检查在Java启动时按住的键

不幸的是,没有明显的方法来问java给定的键是否是目前正在按下。您只能注册才能通过KeyListener获知新的按键,但如果按键在应用程序启动之前启动,则不会有所帮助。

回答

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

我不太了解Java(主要是C#中的代码),但是如何用C语言编写一个小型装载程序或其他东西,然后用一些参数启动您的Java应用程序(比如某个键是否关闭)?

+0

在一个困难解决程序要在Mac/Windows的/ Linux上运行,而且我不知道够不够C. – Zarkonnen 2008-10-02 00:18:57

+0

@Zarkonnen它是否将JVM与安装程序捆绑在一起?如果答案是肯定的,那么`KeyboadUtils.isPressed`可以在Windows,Mac和Linux上工作 – AlexV 2012-07-29 23:56:23

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

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

0

所以看来你可以做到这一点,但仅限于caps lock et al。因此,我已经转而使用大写锁定来达到这个目的。不完美,但确定。

1

原来的问题似乎没有回答。所提出的方法确定锁定键状态,如CapsLock,ScrollLock等。因此,它不适用于Alt按下状态。

考虑下面的代码:

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

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

内部,它调用到USER32.DLL在Windows上:

User32.INSTANCE.GetAsyncKeyState(...)