views:

1737

answers:

5

I'm trying to write a resolution selection dialog that pops up when a program first starts up. To prevent boring the user, I want to implement the fairly standard feature that you can turn off that dialog with a checkbox, but get it back by holding down the alt key at startup.

Unfortunately, there is no obvious way to ask java whether a given key is currently being pressed. You can only register to be informed of new key presses via a KeyListener, but that doesn't help if the keypress starts before the app launches.

A: 

I don't know much about Java (mostly code in C#) but what about having a small loader program written in C or something that then launches your Java app with some parameters (like whether or not a certain key is down)?

Rodrick Chapman
A difficult solution in that the program wants to run on Mac/Windows/Linux, and that I don't know enough C.
Zarkonnen
+3  A: 

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

}

This is borrowed whole from a post on sun's java forum -- http://forums.sun.com/thread.jspa?threadID=751631&messageID=4297359

anjanb
+2  A: 

Well there are two types of key press detection: event based, and polling. If you poll the keyboard for KEY_PRESSED on startup (through a loop with a sleep.thread(timeInMs) constantly checking if your key is down), then you can detect if it's already pressed on startup.

Edit: have a look at this link - http://www.gamedev.net/reference/programming/features/javainput/page2.asp, pay attention to the poll() method.

Karan
+1  A: 
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));
}
}
anjanb
where should I import the Toolkit class from?
Amir Arad
has this solution overcome the problems described in this blog post? It kind of describes this method as unreliable, but it's old....http://weblogs.java.net/blog/2007/11/02/log-me-log-me-out
slothbear
A: 

So it appears that you can do this, but only for caps lock et al. Hence, I've switched to using caps lock for this purpose. Not perfect, but OK.

Zarkonnen